Soy bastante nuevo en python / matplotlib y lo uso a través del cuaderno ipython. Estoy tratando de agregar algunas líneas de anotación a un gráfico existente y no puedo averiguar cómo representar las líneas en un gráfico. Entonces, por ejemplo, si trazo lo siguiente:
import numpy as np
np.random.seed(5)
x = arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
p = plot(x, y, "o")
Obtengo el siguiente gráfico:
Entonces, ¿cómo agregaría una línea vertical desde (70,100) hasta (70,250)? ¿Qué tal una línea diagonal de (70,100) a (90,200)?
He intentado algunas cosas con el Line2D()
resultado de nada más que confusión de mi parte. En R
, simplemente usaría la función segmentos () que agregaría segmentos de línea. ¿Existe un equivalente en matplotlib
?
fuente
x = np.arange(1, 101)
.plt.plot([70, 70], [100, 250], 'k-', lw=2, label="_not in legend")
90
se utilice tanto comox2
y comoy1
conduce a mucha ambigüedad. Para cualquiera que vea esto, tenga en cuenta que[70, 90]
no se refiere a un solo punto en la ubicaciónx1,y1
. Como referencia, aquí están los significados de los valores:[x1: 70, x2: 90], [y1: 90, y2: 200]
No es demasiado tarde para los recién llegados .
También toma el rango de y, usando ymin e ymax.
fuente
Usando
vlines
:Las firmas de llamada básicas son:
fuente
vline()
ohline()
. ¿Qué pasa con las líneas diagonales? Edité la pregunta para agregar el bit diagonal ahora que me mostró las líneas h & v.DataFrame
contenga las coordenadas x, y y grafíquelas constyle='k-'
Matplolib ahora permite 'líneas de anotación' como buscaba el OP. La
annotate()
función permite varias formas de conectar caminos y una flecha sin cabeza y sin tai, es decir, una línea simple, es una de ellas.En la documentación dice que solo puede dibujar una flecha con una cadena vacía como primer argumento.
Del ejemplo del OP:
Al igual que en el enfoque de la respuesta de gcalmettes, puede elegir el color, el ancho de línea, el estilo de línea, etc.
Aquí hay una alteración en una parte del código que haría que una de las dos líneas de ejemplo sea roja, más ancha y no 100% opaca.
También puede agregar una curva a la línea de conexión ajustando el
connectionstyle
.fuente
.plot()
no puedo.En lugar de abusar de
plot
oannotate
, que será ineficaz para muchas líneas, puede usarmatplotlib.collections.LineCollection
:Toma una lista de líneas
[l1, l2, ...]
, donde cada línea es una secuencia de N coordenadas ( N puede ser más de dos).Las palabras clave de formato estándar están disponibles, aceptando un solo valor, en cuyo caso el valor se aplica a cada línea, o una secuencia de M
values
, en cuyo caso el valor de la i- ésima línea esvalues[i % M]
.fuente