2013-06-13 39 views
20

làm cách nào để tạo một hộp xung quanh văn bản trong matplotlib? Tôi có văn bản trên ba dòng khác nhau và trong ba màu sắc khác nhau:Hộp xung quanh văn bản trong matplotlib

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

tôi thấy các hướng dẫn http://matplotlib.org/users/recipes.html (ví dụ cuối cùng) nhưng tôi không thể giải quyết vấn đề. Cảm ơn trước.

+1

Vấn đề của bạn với ví dụ cuối cùng về công thức nấu ăn là gì? –

+0

@David Trong ví dụ đó, chỉ có 1 dòng văn bản. Tôi đang tìm kiếm cách có thể có cùng một hộp xung quanh văn bản tôi đã viết. Theo công thức, tôi có thể viết văn bản trong một dòng như trong ví dụ (textstr = '$ \ mu =%. 2f $ \ n $ \ mathrm {median} =%. 2f $ \ n $ \ sigma =%. 2f $') nhưng sau đó làm thế nào là nó có thể thay đổi màu sắc của văn bản? –

Trả lời

46

Là ví dụ bạn đã liên kết với đề cập, bạn có thể sử dụng the bbox kwarg để thêm hộp.

Tôi cho rằng bạn đang bối rối về cách đặt màu, v.v ... của hộp? Như một ví dụ nhanh:

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

cuối cùng hai là "Fancy" bản vá lỗi bbox, do đó đệm, vv được thiết lập một cách khác nhau. (Đó là khá khó chịu cho những điều đơn giản như đệm, mặc dù nó làm cho việc thực hiện đơn giản phía sau hậu trường.)

Ngoài ra, nếu bạn đang ghi nhãn mọi thứ trong cốt truyện, bạn có thể thấy rằng annotate là tốt hơn lựa chọn. Trong số những thứ khác, nó cho phép bạn đặt văn bản của mình ở một số ít ở các điểm từ một vị trí dữ liệu cụ thể.

+0

Cảm ơn bạn đã trả lời, nhưng có lẽ tôi đã không giải thích tốt vấn đề tôi có. Những gì tôi cần là đặt ba dòng văn bản vào một hộp .. –

+0

Ah! Và với màu sắc khác nhau, tôi sẽ giả sử? Đây là một hạn chế lâu đời của matplotlib. (Đã có cuộc thảo luận về những thay đổi bán buôn cho phần phụ trợ hiển thị văn bản cho phép nó.) Về cơ bản bạn có hai tùy chọn. 1) Sử dụng latex (bạn sẽ cần latex "đầy đủ", không chỉ là mathtext của matplotlib), hoặc 2) Vẽ chúng một cách riêng biệt và vẽ một hộp xung quanh kết quả. Cả hai tùy chọn đều hiển thị ở đây, tình cờ: http://stackoverflow.com/questions/9169052/partial-coloring-of-text-in-matplotlib –

7

Một giải pháp có thể là khám phá boundingbox từ các đối tượng văn bản và tự tạo một hộp. Nó không phải là rất thuận tiện. Có lẽ ví dụ của tôi có thể được cải thiện, biến đổi luôn làm tôi bối rối một chút.

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) 

Bạn có thể muốn thêm bộ đệm nhỏ v.v., nhưng ý tưởng sẽ giữ nguyên.

enter image description here

10

enter image description here Có một số tài liệu trực tuyến ở đâu đó (tốt nhất mà tôi có thể tìm thấy một cách nhanh chóng là http://matplotlib.org/users/annotations_guide.html) để sử dụng VPacker và một AnnotationBbox thu gom được nhiều văn bản của việc thay đổi các thuộc tính font.

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) 

Tôi không chắc chắn tại sao cả hai dòng cuối cùng là cần thiết. Tôi sẽ nghĩ rằng người thứ hai cuối cùng sẽ đủ.

Các vấn đề liên quan