2013-06-13 13 views
20

matplotlib में पाठ के चारों ओर एक बॉक्स बनाने के लिए कैसे संभव है? मैं तीन अलग अलग लाइनों पर और तीन अलग अलग रंग में पाठ है:matplotlib में पाठ के चारों ओर बॉक्स

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

मैं ट्यूटोरियल http://matplotlib.org/users/recipes.html (पिछले उदाहरण) देखा था, लेकिन मैं समस्या का समाधान नहीं कर सकते हैं। अग्रिम धन्यवाद।

+1

व्यंजनों के अंतिम उदाहरण के साथ आपकी समस्या क्या है? –

+0

@ डेविड उस उदाहरण में टेक्स्ट की केवल 1 पंक्ति है। मैं देख रहा हूं कि मेरे द्वारा लिखे गए पाठ के आस-पास एक ही बॉक्स होना संभव है। नुस्खा के बाद मैं उदाहरण के रूप में एक पंक्ति में पाठ लिख सकता हूं (textstr = '$ \ mu =%। 2f $ \ n $ \ mathrm {median} =%। 2f $ \ n $ \ sigma =%। 2f $') लेकिन फिर पाठ का रंग बदलना कैसे संभव है? –

उत्तर

46

उदाहरण के रूप में आप उल्लेख से जुड़े हुए उदाहरण के रूप में, आप बॉक्स जोड़ने के लिए the bbox kwarg का उपयोग कर सकते हैं।

मुझे लगता है कि आप बॉक्स के रंग, आदि को सेट करने के तरीके पर उलझन में हैं?

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

पिछले दो "फैंसी" bbox पैच हैं, तो गद्दी, आदि एक अलग ढंग से सेट किया गया है: एक त्वरित उदाहरण के रूप में। (जो पैडिंग जैसी सरल चीजों के लिए परेशान है, हालांकि यह कार्यान्वयन को सरल बनाता है।)

इसके अलावा, यदि आप अपनी साजिश में चीजें लेबल कर रहे हैं, तो आप शायद पाएंगे कि annotate बेहतर है चुनाव। अन्य चीजों के अलावा, यह आपको एक विशेष डेटा स्थिति से अंक में अपने पाठ को एक ऑफसेट पर रखने की अनुमति देता है।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन शायद मैंने अपनी समस्या को अच्छी तरह से समझाया नहीं है। मुझे एक बॉक्स में तीन टेक्स्ट लाइनों को रखना है .. –

+0

आह! और विभिन्न रंगों के साथ, मुझे लगता है? यह matplotlib की एक लंबी स्थायी सीमा है। (पाठ प्रतिपादन बैकएंड में थोक परिवर्तनों की चर्चा हुई है जो इसकी अनुमति देगी।) आपके मूल रूप से दो विकल्प हैं। 1) लेटेक्स का उपयोग करें (आपको "पूर्ण" लेटेक्स की आवश्यकता होगी, न केवल matplotlib के mathtext), या 2) उन्हें अलग से प्लॉट करें और परिणाम के आस-पास एक बॉक्स बनाएं। दोनों विकल्प यहां दिखाए गए हैं, आकस्मिक रूप से: http://stackoverflow.com/questions/9169052/partial-coloring-of-text-in-matplotlib –

7

एक ऑब्जेक्ट टेक्स्ट ऑब्जेक्ट्स से बाउंडिंगबॉक्स का पता लगाने और स्वयं को एक बॉक्स उत्पन्न करने का समाधान हो सकता है। यह बहुत सुविधाजनक नहीं है। शायद मेरा उदाहरण सुधार किया जा सकता है, परिवर्तन हमेशा मुझे थोड़ा उलझन में डालते हैं।

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) 

आप एक छोटा बफर आदि जोड़ना चाहते हैं, लेकिन विचार वही रहेगा।

enter image description here

10

enter image description here कुछ प्रलेखन ऑनलाइन कहीं (सबसे अच्छा मैं जल्दी से प्राप्त कर सकते हैं http://matplotlib.org/users/annotations_guide.html है) VPacker और एक AnnotationBbox का उपयोग कर एक साथ फॉन्ट गुण अलग के कई ग्रंथों डाल करने के लिए नहीं है।

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) 

मुझे यकीन नहीं है कि पिछले दो लाइनों की आवश्यकता क्यों है। मुझे लगता है कि आखिरी बार दूसरा होगा।

संबंधित मुद्दे