Je connais assez bien python/matplotlib et son utilisation via le cahier ipython. J'essaie d'ajouter des lignes d'annotation à un graphique existant et je ne vois pas comment rendre les lignes d'un graphique. Donc, par exemple, si je trace ce qui suit:
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")
Je reçois le graphique suivant:
Alors, comment pourrais-je ajouter une ligne verticale de (70 100) à (70 250)? Qu'en est-il d'une ligne diagonale de (70 100) à (90 200)?
J'ai essayé un certain nombre de choses avec Line2D()
, ce qui n'a entraîné que confusion. Dans R
j'utiliserais simplement la fonction segments () qui ajouterait des segments de ligne. Existe-t-il un équivalent dans matplotlib
?
Vous pouvez directement tracer les lignes souhaitées en alimentant la commande plot
avec les données correspondantes (limites des segments):
plot([x1, x2], [y1, y2], color='k', linestyle='-', linewidth=2)
(bien sûr, vous pouvez choisir la couleur, la largeur de la ligne, son style, etc.)
De votre exemple:
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()
Il n'est pas trop tard pour le nouveaux venus .
plt.axvline(x, color='r')
Il prend également la plage de y, en utilisant ymin et ymax.
Utilisation de 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)
Les signatures d'appel de base sont:
vlines(x, ymin, ymax)
hlines(y, xmin, xmax)
Matplolib permet maintenant d’obtenir des "lignes d’annotation" comme le voulait le PO. La fonction annotate()
permet plusieurs formes de chemins de connexion et une flèche sans tête et sans queue, c'est-à-dire une simple ligne, en est une.
ax.annotate("",
xy=(0.2, 0.2), xycoords='data',
xytext=(0.8, 0.8), textcoords='data',
arrowprops=dict(arrowstyle="-",
connectionstyle="arc3, rad=0"),
)
Dans la documentation , il est indiqué que vous ne pouvez dessiner qu'une flèche avec une chaîne vide comme premier argument.
À partir de l'exemple du PO:
%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()
Tout comme dans l'approche de la réponse de gcalmettes, vous pouvez choisir la couleur, la largeur et le style de ligne, etc.
Voici une modification apportée à une partie du code qui rendrait l’un des deux exemples de lignes rouge, plus large et non opaque à 100%.
# 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."),
)
Vous pouvez également ajouter une courbe à la ligne de raccordement en ajustant le paramètre connectionstyle
.