web-dev-qa-db-fra.com

Mettre du texte dans le coin supérieur gauche du tracé matplotlib

Comment puis-je mettre du texte dans le coin supérieur gauche (ou supérieur droit) d'une figure matplotlib, par ex. où serait une légende en haut à gauche, ou en haut de la parcelle mais dans le coin en haut à gauche? Par exemple. Si c'est un plt.scatter (), alors quelque chose qui serait dans le carré du scatter, mis dans le coin le plus en haut à gauche.

J'aimerais faire cela sans connaître idéalement l'échelle du diagramme de dispersion tracé, par exemple, car cela changerait d'un jeu de données à l'autre. Je veux juste que le texte soit approximativement en haut à gauche ou en haut à droite. Avec le positionnement du type de légende, il ne doit de toute façon pas chevaucher les points du diagramme de dispersion.

merci!

95
user248237

Vous pouvez utiliser text .

text(x, y, s, fontsize=12)

Les coordonnées text peuvent être données par rapport à l'axe. La position de votre texte sera donc indépendante de la taille du tracé:

La transformation par défaut spécifie que le texte est dans les coordonnées de données. Vous pouvez également spécifier le texte dans les coordonnées d'axe (0,0 en bas à gauche et 1,1 en haut à droite). L'exemple ci-dessous place le texte au centre des axes:

text(0.5, 0.5,'matplotlib',
     horizontalalignment='center',
     verticalalignment='center',
     transform = ax.transAxes)

Empêcher le texte d'interférer avec un point quelconque de votre dispersion est plus difficile. La méthode la plus simple consiste à définir y_axis (ymax dans ylim((ymin,ymax))) sur une valeur légèrement supérieure à la coordonnée y maximale de vos points. De cette façon, vous aurez toujours cet espace libre pour le texte.

EDIT: ici vous avez un exemple:

In [17]: from pylab import figure, text, scatter, show
In [18]: f = figure()
In [19]: ax = f.add_subplot(111)
In [20]: scatter([3,5,2,6,8],[5,3,2,1,5])
Out[20]: <matplotlib.collections.CircleCollection object at 0x0000000007439A90>
In [21]: text(0.1, 0.9,'matplotlib', ha='center', va='center', transform=ax.transAxes)
Out[21]: <matplotlib.text.Text object at 0x0000000007415B38>
In [22]:

enter image description here

Les paramètres ha et va définissent l'alignement de votre texte par rapport au point d'insertion. c'est à dire. ha = 'left' est un bon jeu pour empêcher un texte long de sortir de l'axe de gauche lorsque le cadre est réduit (rendu plus étroit) manuellement.

134
joaquin

Une solution serait d'utiliser le plt.legend _ fonction, même si vous ne voulez pas de légende. Vous pouvez spécifier l'emplacement de la boîte de légende à l'aide de loc keyterm. Plus d'informations peuvent être trouvées sur ce site mais j'ai aussi inclus un exemple montrant comment placer une légende:

ax.scatter(xa,ya, marker='o', s=20, c="lightgreen", alpha=0.9)
ax.scatter(xb,yb, marker='o', s=20, c="dodgerblue", alpha=0.9)
ax.scatter(xc,yc marker='o', s=20, c="firebrick", alpha=1.0)
ax.scatter(xd,xd,xd, marker='o', s=20, c="goldenrod", alpha=0.9)
line1 = Line2D(range(10), range(10), marker='o', color="goldenrod")
line2 = Line2D(range(10), range(10), marker='o',color="firebrick")
line3 = Line2D(range(10), range(10), marker='o',color="lightgreen")
line4 = Line2D(range(10), range(10), marker='o',color="dodgerblue")
plt.legend((line1,line2,line3, line4),('line1','line2', 'line3', 'line4'),numpoints=1, loc=2) 

Notez que parce que loc=2, la légende se trouve dans le coin supérieur gauche du graphique. Et si le texte recouvre le tracé, vous pouvez le réduire en utilisant legend.fontsize, ce qui réduira la légende.

6
cosmosis