Je suis plutôt nouveau à la fois dans python / matplotlib et en l'utilisant via le notebook ipython. J'essaie d'ajouter des lignes d'annotation à un graphique existant et je ne peux pas comprendre comment rendre les lignes sur un graphique. Ainsi, 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")
J'obtiens le graphique suivant:
Alors, comment 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é quelques trucs avec pour Line2D()
résultat rien d'autre que de la confusion de ma part. Dans R
j'utiliserais simplement la fonction segments () qui ajouterait des segments de ligne. Y a-t-il un équivalent dans matplotlib
?
la source
x = np.arange(1, 101)
.plt.plot([70, 70], [100, 250], 'k-', lw=2, label="_not in legend")
90
soit utilisé à la fois commex2
et ety1
conduit à beaucoup d'ambiguïté. Pour toute personne qui regarde ceci, notez que[70, 90]
cela ne fait pas référence à un seul point à l'emplacementx1,y1
. Pour référence, voici la signification des valeurs:[x1: 70, x2: 90], [y1: 90, y2: 200]
Il n'est pas trop tard pour les nouveaux arrivants .
Il prend également la plage de y, en utilisant ymin et ymax.
la source
Utilisation
vlines
:Les signatures d'appel de base sont:
la source
vline()
ouhline()
. Qu'en est-il des lignes diagonales? J'ai modifié la question pour ajouter le bit diagonal maintenant que vous m'avez montré les lignes h & v.DataFrame
contenant les coordonnées x, y et de les tracer avecstyle='k-'
Matplolib autorise désormais les «lignes d'annotation» comme le recherchait l'OP. La
annotate()
fonction permet plusieurs formes de chemins de connexion et une flèche sans tête et sans queue, c'est-à-dire une simple ligne, en fait partie.Dans la documentation, il est indiqué que vous ne pouvez dessiner qu'une flèche avec une chaîne vide comme premier argument.
De l'exemple du PO:
Tout comme dans l'approche de la réponse de gcalmettes, vous pouvez choisir la couleur, la largeur de ligne, le style de ligne, etc.
Voici une modification apportée à une partie du code qui rendrait l'une des deux lignes d'exemple rouge, plus large et non opaque à 100%.
Vous pouvez également ajouter une courbe à la ligne de connexion en ajustant le
connectionstyle
.la source
.plot()
ne peut pas faire.Plutôt que d'abuser
plot
ouannotate
, ce qui sera inefficace pour de nombreuses lignes, vous pouvez utilisermatplotlib.collections.LineCollection
:Il prend une liste de lignes
[l1, l2, ...]
, où chaque ligne est une séquence de N coordonnées ( N peut être plus de deux).Les mots-clés de formatage standard sont disponibles, acceptant soit une valeur unique, auquel cas la valeur s'applique à chaque ligne, soit une séquence de M
values
, auquel cas la valeur de la i ème ligne estvalues[i % M]
.la source