comment est-il possible de faire un encadré de texte dans matplotlib? J'ai du texte sur trois lignes différentes et en trois couleurs différentes:
ax.text(2,1, 'alpha', color='red')
ax.text(2,2, 'beta', color='cyan')
ax.text(2,3, 'epsilon', color='black')
J'ai vu le tutoriel http://matplotlib.org/users/recipes.html (dernier exemple) mais je ne peux pas résoudre le problème. Merci d'avance.
Comme l'exemple que vous avez lié aux mentions, vous pouvez utiliser le bbox
kwarg pour ajouter une boîte.
Je suppose que vous ne savez pas comment définir la couleur, etc. de la boîte? Comme exemple rapide:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.text(0.5, 0.8, 'Test', color='red',
bbox=dict(facecolor='none', edgecolor='red'))
ax.text(0.5, 0.6, 'Test', color='blue',
bbox=dict(facecolor='none', edgecolor='blue', pad=10.0))
ax.text(0.5, 0.4, 'Test', color='green',
bbox=dict(facecolor='none', edgecolor='green', boxstyle='round'))
ax.text(0.5, 0.2, 'Test', color='black',
bbox=dict(facecolor='none', edgecolor='black', boxstyle='round,pad=1'))
plt.show()
Les deux derniers sont des correctifs de bbox "fantaisie", donc le rembourrage, etc. est défini d'une manière différente. (Ce qui est plutôt ennuyeux pour des choses simples comme le remplissage, bien que cela rende l'implémentation plus simple en arrière-plan.)
De plus, si vous étiquetez des choses dans votre intrigue, vous constaterez probablement que annotate
est un meilleur choix. Entre autres choses, il vous permet de placer votre texte à une offensive en points à partir d'une position de données particulière.
Il y a de la documentation en ligne quelque part (le mieux que je puisse trouver rapidement est http://matplotlib.org/users/annotations_guide.html ) pour utiliser VPacker
et un AnnotationBbox
pour rassembler plusieurs textes de différentes propriétés de police.
from matplotlib.offsetbox import TextArea, VPacker, AnnotationBbox
from pylab import *
fig = figure(1)
ax = gca()
texts = ['alpha','beta','epsilon']
colors = ['red','cyan','black']
Texts = []
for t,c in Zip(texts,colors):
Texts.append(TextArea(t,textprops=dict(color=c)))
texts_vbox = VPacker(children=Texts,pad=0,sep=0)
ann = AnnotationBbox(texts_vbox,(.02,.5),xycoords=ax.transAxes,
box_alignment=(0,.5),bboxprops =
dict(facecolor='wheat',boxstyle='round',color='black'))
ann.set_figure(fig)
fig.artists.append(ann)
Je ne sais pas pourquoi les deux dernières lignes sont nécessaires. Je pense que l'avant-dernier suffirait.
Une solution pourrait être d'explorer la boîte englobante à partir des objets texte et de générer une boîte vous-même. Ce n'est pas très pratique. Peut-être que mon exemple peut être amélioré, les transformations me confondent toujours un peu.
import matplotlib.patches as patches
import matplotlib.pyplot as plt
fig, axs = plt.subplots(1,1)
t1 = axs.text(0.4,0.6, 'Hello world line 1', ha='center', color='red', weight='bold', transform=axs.transAxes)
t2 = axs.text(0.5,0.5, 'Hello world line 2', ha='center', color='green', weight='bold', transform=axs.transAxes)
t3 = axs.text(0.6,0.4, 'Hello world line 3', ha='center', color='blue', weight='bold', transform=axs.transAxes)
fig.canvas.draw()
textobjs = [t1,t2,t3]
xmin = min([t.get_window_extent().xmin for t in textobjs])
xmax = max([t.get_window_extent().xmax for t in textobjs])
ymin = min([t.get_window_extent().ymin for t in textobjs])
ymax = max([t.get_window_extent().ymax for t in textobjs])
xmin, ymin = fig.transFigure.inverted().transform((xmin, ymin))
xmax, ymax = fig.transFigure.inverted().transform((xmax, ymax))
rect = patches.Rectangle((xmin,ymin),xmax-xmin,ymax-ymin, facecolor='grey', alpha=0.2, transform=fig.transFigure)
axs.add_patch(rect)
Vous voudrez peut-être ajouter un petit tampon, etc., mais l'idée resterait la même.