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

112

Comment puis-je mettre du texte dans le coin supérieur gauche (ou supérieur droit) d'une figure matplotlib, par exemple à l'endroit où se trouverait une légende en haut à gauche, ou au-dessus du tracé mais dans le coin supérieur gauche? Par exemple, si c'est un plt.scatter (), alors quelque chose qui serait dans le carré du scatter, placé dans le coin supérieur gauche.

J'aimerais faire cela sans connaître idéalement l'échelle du nuage de points tracé par exemple, car il passera d'un ensemble de données à un ensemble de données. Je veux juste que le texte soit à peu près en haut à gauche, ou à peu près en haut à droite. Avec le positionnement de type légende, il ne doit de toute façon pas chevaucher des points de nuage de points.

Merci!


la source
Si vous souhaitez mettre votre texte dans une boîte stackoverflow.com/questions/20842613/…
Raphael
1
Je pense que c'est un double de cette question . La question en double a même de bien meilleures réponses, bien que le type de réponse fournie ici (en utilisant textet ax.transAxes) n'en fasse pas partie.
ImportanceOfBeingErnest

Réponses:

162

Vous pouvez utiliser text.

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

text les coordonnées peuvent être données par rapport à l'axe, ainsi la position de votre texte sera indépendante de la taille du tracé:

La transformation par défaut spécifie que le texte est en coordonnées de données, vous pouvez également spécifier le texte en coordonnées d'axe (0,0 est en bas à gauche et 1,1 est 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 n'importe quel point de votre dispersion est plus difficile. La méthode la plus simple consiste à définir y_axis (ymax in ylim((ymin,ymax))) sur une valeur un peu plus élevée que 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]:

entrez la description de l'image ici

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 ensemble pour empêcher un long texte de sortir de l'axe gauche lorsque le cadre est réduit (rendu plus étroit) manuellement.

Joaquin
la source
J'obtiens le centrage, mais comment puis-je le faire en haut? J'ai essayé "horizontalalignment" réglé sur "left" et verticalalignment mis en haut mais cela ne fonctionne pas
1
vous devez jouer avec les valeurs x, y comme indiqué ( 0,0 est en bas à gauche et 1,1 est en haut à droite ). Voir edit
joaquin
2
@ user3645626 Les importations sont: Le from pylab import figure, text, scatter, show code de la réponse a été exécuté dans une console ipython en mode pylab où les importations explicites n'étaient pas nécessaires. Dans un environnement propre, vous devez importer ce qui précède et faire show()pour voir l'intrigue
joaquin
5

Une solution serait d'utiliser la plt.legendfonction, même si vous ne voulez pas de légende réelle. Vous pouvez spécifier l'emplacement de la zone de légende à l'aide du lockeyterm. Plus d'informations peuvent être trouvées sur ce site Web, mais j'ai également 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=2la légende se trouve dans le coin supérieur gauche du tracé. Et si le texte chevauche le tracé, vous pouvez le réduire en utilisant legend.fontsize, ce qui réduira alors la légende.

cosmose
la source
0
import matplotlib.pyplot as plt

plt.figure(figsize=(6, 6))
plt.text(0.1, 0.9, 'text', size=15, color='purple')

# or 

fig, axe = plt.subplots(figsize=(6, 6))
axe.text(0.1, 0.9, 'text', size=15, color='purple')

Sortie des deux

entrez la description de l'image ici

import matplotlib.pyplot as plt

# Build a rectangle in axes coords
left, width = .25, .5
bottom, height = .25, .5
right = left + width
top = bottom + height
ax = plt.gca()
p = plt.Rectangle((left, bottom), width, height, fill=False)
p.set_transform(ax.transAxes)
p.set_clip_on(False)
ax.add_patch(p)


ax.text(left, bottom, 'left top',
        horizontalalignment='left',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(left, bottom, 'left bottom',
        horizontalalignment='left',
        verticalalignment='bottom',
        transform=ax.transAxes)

ax.text(right, top, 'right bottom',
        horizontalalignment='right',
        verticalalignment='bottom',
        transform=ax.transAxes)

ax.text(right, top, 'right top',
        horizontalalignment='right',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(right, bottom, 'center top',
        horizontalalignment='center',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(left, 0.5 * (bottom + top), 'right center',
        horizontalalignment='right',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(left, 0.5 * (bottom + top), 'left center',
        horizontalalignment='left',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(0.5 * (left + right), 0.5 * (bottom + top), 'middle',
        horizontalalignment='center',
        verticalalignment='center',
        transform=ax.transAxes)

ax.text(right, 0.5 * (bottom + top), 'centered',
        horizontalalignment='center',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(left, top, 'rotated\nwith newlines',
        horizontalalignment='center',
        verticalalignment='center',
        rotation=45,
        transform=ax.transAxes)

plt.axis('off')

plt.show()

entrez la description de l'image ici

Trenton McKinney
la source