2013-02-10 14 views
5

Sto cercando di capire come disegnare linee con larghezze in unità di dati. Ad esempio, nel seguente frammento di codice, vorrei che la parte orizzontale della linea di larghezza 80 si estenda sempre da y = -40 al segno y = + 40, e rimanga tale anche se i limiti del sistema di coordinate modificare. C'è un modo per raggiungere questo obiettivo con gli oggetti Line2D in Matplotlib? Qualunque altro modo per ottenere un effetto simile?Matplotlib: traccia linee con larghezza data in coordinate dati

from pylab import figure, gca, Line2D 

figure() 
ax = gca() 
ax.set_xlim(-50, 50) 
ax.set_ylim(-75, 75) 

ax.add_line(Line2D([-50, 0, 50], [-50, 0, 0], linewidth=80)) 

ax.grid() 

line width in screen coordinates

+0

Giusto per chiarire: intendi che se la finestra si espande vuoi che la linea blu sia * ancora * estesa da circa 'y = -25' a' y = 25' nella foto che hai postato? – unutbu

+0

@unutbu La larghezza è impostata su 80, penso che l'OP vuole che sia sempre tra -40 e 40. La tua risposta sembra essere ciò di cui l'OP ha bisogno. –

+0

[Qui] (http://stackoverflow.com/a/19397279/1681480) è un modo per farlo con linee di qualsiasi angolazione, non solo per il riempimento verticale ... – beroe

risposta

6

Si potrebbe utilizzare fill_between:

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 
ax.set_xlim(-50, 50) 
ax.set_ylim(-75, 75) 
x = [-50, 0, 50] 
y = np.array([-50, 0, 0]) 

ax.fill_between(x,y-30,y+30) 

ax.grid() 
plt.show() 

rendimenti

enter image description here

ma a differenza della linea generato da

ax.add_line(Line2D([-50, 0, 50], [-50, 0, 0], linewidth=80)) 

lo spessore verticale della linea sarà sempre costante nelle coordinate dei dati.

Vedere anche link to documentation.

+0

+1. La chiamata può essere semplificata in 'ax.fill_between ([- 50, 50], -25, 25)' in questo caso, byw. –

+0

Grazie, ma non funzionerebbe per le linee che non sono esattamente orizzontali, giusto? Avrei dovuto essere più specifico che voglio farlo per linee arbitrarie - modifico la mia domanda per chiarire. – mvoelske

+0

In realtà, 'fill_between' funziona [bene con le curve] (http://matplotlib.org/examples/pylab_examples/fill_between_demo.html). – unutbu

1

Per disegnare una linea con la larghezza di riga in unità di dati, è possibile dare un'occhiata a this answer.

Utilizza una classe data_linewidth_plot che assomiglia molto alla firma del comando plt.plot().

l = data_linewidth_plot(x, y, ax=ax, label='some line', linewidth = 1, alpha = 0.4) 

L'argomento di larghezza riga viene interpretato in unità di dati (y-).

Problemi correlati