2013-06-13 23 views
20

matplotlib'de metnin etrafında bir kutu yapmak nasıl mümkündür? Üç farklı hatlarda ve üç farklı renkte metin var:Matplotlib metnindeki metin etrafında kutu

ax.text(2,1, 'alpha', color='red') 
ax.text(2,2, 'beta', color='cyan') 
ax.text(2,3, 'epsilon', color='black') 

Ben öğretici http://matplotlib.org/users/recipes.html (son örnek) gördüm ama sorunu çözemez. Şimdiden teşekkürler.

+1

Son yemek tarifleri örneğindeki probleminiz nedir? –

+0

@David Bu örnekte sadece 1 metin satırı var. Yazdığım metnin etrafına aynı kutunun nasıl yerleştirilebileceğini arıyorum. Tarifin ardından, örneğin bir satırda metin yazabilirim (textstr = '$ \ mu =%. 2f $ \ n $ \ mathrm {medyan} =%. 2f $ \ n $ \ sigma =%. 2f $') ama sonra metnin rengini değiştirmek nasıl mümkün olabilir? –

cevap

46

Bağlandığınız örnek olarak, bir kutu eklemek için the bbox kwarg kullanabilirsiniz.

Sana kutunun vb rengini, nasıl ayarlanacağı ile ilgili karıştı farz ediyorum?

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

son iki

"Fantezi" BBOX yamalar, bu yüzden dolgu vb farklı bir şekilde ayarlanır: Hızlı bir örnek olarak. (Daha basit bir şekilde perde arkası oluşturma gibi basit şeyler için can sıkıcı bir durumdur. Ancak bu, sahne arkasındaki görüntülemeyi daha basit hale getiriyor.)

Ayrıca, olayınızdaki şeyleri etiketliyorsanız, muhtemelen annotate'un daha iyi olduğunu göreceksiniz. seçim. Diğer şeylerin yanı sıra, belirli bir veri konumundan no'lu noktadan no'lu adrese gönderilmesini sağlar.

+0

Cevabınız için teşekkürler, ancak muhtemelen sahip olduğum problemi iyi açıklayamadım. İhtiyacım olan şey, üç metin satırını bir kutuya koymaktır. –

+0

Ah! Ve farklı renklerle, varsayalım? Bu, matplotlib'in uzun süredir devam eden bir sınırlamasıdır. (Buna izin veren metin oluşturma arka yüzüne yapılan toptan değişikliklerin tartışması yapıldı.) Temel olarak iki seçeneğiniz var. 1) Lateks kullanın (sadece matplotlib'in mathtex'i değil, "full" lateksine ihtiyacınız olacak) veya 2) Bunları ayrı ayrı çizin ve sonuç etrafında bir kutu çizin. Her iki seçenek de tesadüfen burada gösterilmektedir: http://stackoverflow.com/questions/9169052/partial-coloring-of-text-in-matplotlib –

7

bir çözüm kendiniz metin nesnelerden BoundingBox keşfetmek ve bir kutu oluşturmak için olabilir. Onun çok uygun değil. Belki de benim örneğim geliştirilebilir, dönüşümler her zaman beni biraz karıştırır.

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) 

Küçük bir tampon vb eklemek isteyebilirsiniz, ama fikir aynı kalmak istiyorum. Birlikte font özelliklerini değişen çeşitli metinleri koymak için VPacker ve AnnotationBbox kullanmak için bir yere çevrimiçi bazı belgeleri (çabuk bulabilirsiniz iyi http://matplotlib.org/users/annotations_guide.html olduğunu)

enter image description here

10

enter image description here .

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) 

Son iki satırın neden gerekli olduğundan emin değilim. Sonuncunun yeterli olacağını düşünürdüm.