matplotlib - font - plt show()
Agregar una lĂnea arbitraria a un diagrama matplotlib en el cuaderno ipython (4)
Soy bastante nuevo para python / matplotlib y lo uso a través del cuaderno ipython. Estoy intentando agregar algunas líneas de anotación a un gráfico existente y no puedo entender cómo representar las líneas en un gráfico. Entonces, por ejemplo, si grafico 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é pasa con una línea diagonal de (70,100) a (90,200)?
He intentado algunas cosas con Line2D()
resulta en nada más que confusión de mi parte. En R
, simplemente usaría la función de segmentos () que agregaría segmentos de línea. ¿Hay un equivalente en matplotlib
?
Matplolib ahora permite ''líneas de anotación'' como el OP estaba buscando. La función annotate()
permite varias formas de rutas de conexión y una flecha sin cabeza y sin cola, es decir, una línea simple, es una de ellas.
ax.annotate("",
xy=(0.2, 0.2), xycoords=''data'',
xytext=(0.8, 0.8), textcoords=''data'',
arrowprops=dict(arrowstyle="-",
connectionstyle="arc3, rad=0"),
)
En la documentación , dice que puede dibujar solo una flecha con una cadena vacía como primer argumento.
Del ejemplo de OP:
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(5)
x = np.arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
plt.plot(x, y, "o")
# draw vertical line from (70,100) to (70, 250)
plt.annotate("",
xy=(70, 100), xycoords=''data'',
xytext=(70, 250), textcoords=''data'',
arrowprops=dict(arrowstyle="-",
connectionstyle="arc3,rad=0."),
)
# draw diagonal line from (70, 90) to (90, 200)
plt.annotate("",
xy=(70, 90), xycoords=''data'',
xytext=(90, 200), textcoords=''data'',
arrowprops=dict(arrowstyle="-",
connectionstyle="arc3,rad=0."),
)
plt.show()
Al igual que en el enfoque en la respuesta de gcalmettes, puede elegir el color, el ancho de línea, el estilo de línea, etc.
Aquí hay una alteración de una parte del código que haría que una de las dos líneas de ejemplo fuera roja, más ancha y no 100% opaca.
# draw vertical line from (70,100) to (70, 250)
plt.annotate("",
xy=(70, 100), xycoords=''data'',
xytext=(70, 250), textcoords=''data'',
arrowprops=dict(arrowstyle="-",
edgecolor = "red",
linewidth=5,
alpha=0.65,
connectionstyle="arc3,rad=0."),
)
También puede agregar una curva a la línea de conexión ajustando el estilo de connectionstyle
.
No es demasiado tarde para los recién llegados.
plt.axvline(x, color=''r'')
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axvline
También toma el rango de y, usando ymin e ymax.
Puede trazar directamente las líneas que desea alimentando el comando de plot
con los datos correspondientes (límites de los segmentos):
plot([x1, x2], [y1, y2], color=''k'', linestyle=''-'', linewidth=2)
(por supuesto, puede elegir el color, el ancho de línea, el estilo de línea, etc.)
De tu ejemplo:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(5)
x = np.arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
plt.plot(x, y, "o")
# draw vertical line from (70,100) to (70, 250)
plt.plot([70, 70], [100, 250], ''k-'', lw=2)
# draw diagonal line from (70, 90) to (90, 200)
plt.plot([70, 90], [90, 200], ''k-'')
plt.show()
Usando vlines
:
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")
vlines(70,100,250)
Las firmas de llamada básicas son:
vlines(x, ymin, ymax)
hlines(y, xmin, xmax)