web-dev-qa-db-fra.com

Encadrer le texte dans matplotlib

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.

37
Marika Blum

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

enter image description here

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.

70
Joe Kington

enter image description here 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.

12
esmit

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.

enter image description here

9
Rutger Kassies