web-dev-qa-db-fra.com

Ajout d'une ligne arbitraire à un tracé matplotlib dans ipython notebook

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:

beautiful scatter plot

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?

100
JD Long

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()

new chart

162
gcalmettes

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.

53
lifelogger

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)
39
Austin Richardson

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()

Example inline image

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.

5
Wayne