156 votes

Mise en place d'un texte dans le coin supérieur gauche d'un graphique matplotlib

Comment puis-je mettre du texte dans le coin supérieur gauche (ou supérieur droit) d'une figure matplotlib, par exemple là où se trouverait une légende en haut à gauche, ou au dessus du graphique 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, puisqu'elle changera d'un ensemble de données à l'autre. Je veux simplement que le texte soit à peu près en haut à gauche ou à peu près en haut à droite. Avec un positionnement de type légende, il ne devrait de toute façon pas empiéter sur les points du nuage de points.

Merci !

0 votes

Si vous voulez mettre votre texte dans un cadre stackoverflow.com/questions/20842613/

1 votes

Je pense qu'il s'agit d'un doublon de cette question . La question dupliquée a même de bien meilleures réponses, bien que le type de réponse fournie ici (utilisant des text y ax.transAxes ) n'en fait pas partie.

210voto

joaquin Points 22450

Vous pouvez utiliser text .

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

text Les coordonnées peuvent être données par rapport à l'axe, de sorte que la position de votre texte sera indépendante de la taille du graphique :

La transformation par défaut spécifie que le texte est en coordonnées de données, alternativement, vous pouvez spécifier le texte en coordonnées d'axe (0,0 est en bas à gauche et 1,1 en haut à droite). 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)

Il est plus difficile d'empêcher le texte d'interférer avec n'importe quel point de votre nuage de points. La méthode la plus simple est de définir l'axe des y (ymax dans ylim((ymin,ymax)) ) à 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]:

enter image description here

Les paramètres ha et va définissent l'alignement de votre texte par rapport au point d'insertion. Par exemple, ha='left' est un bon paramètre pour éviter qu'un long texte ne sorte de l'axe de gauche lorsque le cadre est réduit (rendu plus étroit) manuellement.

31voto

Trenton_M Points 734
  • matplotlib est quelque peu différente de la date à laquelle la réponse originale a été postée.
  • matplotlib.pyplot.text
  • matplotlib.axes.Axes.text

    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

enter image description here

  • De matplotlib : Mise en page précise du texte

    • Vous pouvez mettre en page avec précision le texte dans les données ou les coordonnées des axes.

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

enter image description here

11voto

cosmosis Points 1281

Une solution serait d'utiliser l'option plt.legend fonction, même si vous ne voulez pas d'une véritable légende. Vous pouvez spécifier l'emplacement de la boîte de légende en utilisant l'attribut loc keyterm. Vous trouverez de plus amples informations sur ce site 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=2 la légende se trouve dans le coin supérieur gauche du graphique. Et si le texte empiète sur le tracé, vous pouvez le rendre plus petit en utilisant la commande legend.fontsize ce qui rendra la légende plus petite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X