Matplotlib - huyền thoại toàn cầu và tiêu đề sang một bên


125

Tôi đã bắt đầu với matplot và quản lý một số âm mưu cơ bản, nhưng bây giờ tôi cảm thấy khó tìm ra cách thực hiện một số thứ tôi cần bây giờ :(

Câu hỏi thực sự của tôi là làm thế nào để đặt một tiêu đề toàn cầu và huyền thoại toàn cầu trên một hình có các ô phụ.

Tôi đang làm các ô con 2x3, nơi tôi có rất nhiều đồ thị khác nhau với nhiều màu sắc khác nhau (khoảng 200). Để phân biệt (hầu hết) chúng, tôi đã viết một cái gì đó như

def style(i, total):
    return dict(color=jet(i/total),
                linestyle=["-", "--", "-.", ":"][i%4],
                marker=["+", "*", "1", "2", "3", "4", "s"][i%7])

fig=plt.figure()
p0=fig.add_subplot(321)
for i, y in enumerate(data):
    p0.plot(x, trans0(y), "-", label=i, **style(i, total))
# and more subplots with other transN functions

(bất kỳ suy nghĩ nào về điều này? :)) Mỗi ​​subplot có cùng một chức năng kiểu.

Bây giờ tôi đang cố gắng giành được một danh hiệu toàn cầu cho tất cả các tình tiết phụ và cũng là một huyền thoại toàn cầu giải thích tất cả các phong cách. Ngoài ra, tôi cần làm cho phông chữ nhỏ để phù hợp với tất cả 200 kiểu trên đó (tôi không cần những kiểu hoàn toàn độc đáo, nhưng ít nhất là một số nỗ lực)

Ai đó có thể giúp tôi giải quyết nhiệm vụ này?


Câu trả lời:


192

Tiêu đề toàn cầu : Trong các bản phát hành mới hơn của matplotlib, người ta có thể sử dụng phương thức Hình.suptitle () của Figure:

import matplotlib.pyplot as plt
fig = plt.gcf()
fig.suptitle("Title centered above all subplots", fontsize=14)

Ngoài ra (dựa trên nhận xét của @Steven C. Howell bên dưới (cảm ơn bạn!)), Sử dụng hàm matplotlib.pyplot.suptitle () :

 import matplotlib.pyplot as plt
 # plot stuff
 # ...
 plt.suptitle("Title centered above all subplots", fontsize=14)

64
Đối với những người nhập khẩu như thế này: import matplotlib.pyplot as plt, lệnh có thể được nhập đơn giản là plt.figure(); plt.suptitle('Title centered above all subplots'); plt.subplot(231); plt.plot(data[:,0], data[:,1]);vv ...
Steven C. Howell

1
Cảm ơn. Đây phải là câu trả lời được lựa chọn thực tế.
gustafbstrom

62

Ngoài câu trả lời trên quỹ đạo, người ta cũng có thể muốn chuyển các ô phụ xuống dưới. Đây là một MWE theo kiểu OOP:

import matplotlib.pyplot as plt

fig = plt.figure()
st = fig.suptitle("suptitle", fontsize="x-large")

ax1 = fig.add_subplot(311)
ax1.plot([1,2,3])
ax1.set_title("ax1")

ax2 = fig.add_subplot(312)
ax2.plot([1,2,3])
ax2.set_title("ax2")

ax3 = fig.add_subplot(313)
ax3.plot([1,2,3])
ax3.set_title("ax3")

fig.tight_layout()

# shift subplots down:
st.set_y(0.95)
fig.subplots_adjust(top=0.85)

fig.savefig("test.png")

cho:

nhập mô tả hình ảnh ở đây


2
đây phải là câu trả lời tốt nhất
Statham

Đã đồng ý ! Câu trả lời được chấp nhận đưa ra một phụ thuộc khác, do đó không trả lời đúng câu hỏi OP.
Yohan Obadia

7

Đối với nhãn chú giải có thể sử dụng một cái gì đó như dưới đây. Legendlabels là các cốt truyện được lưu. modFreq là nơi đặt tên của các nhãn thực tương ứng với các đường vẽ. Sau đó, tham số thứ ba là vị trí của chú giải. Cuối cùng, bạn có thể chuyển bất kỳ đối số nào như tôi đã trình bày ở đây nhưng chủ yếu cần ba đối số đầu tiên. Ngoài ra, bạn phải làm như vậy nếu bạn đặt các nhãn chính xác trong lệnh plot. Để chỉ gọi chú giải với tham số vị trí và nó tìm các nhãn trong mỗi dòng. Tôi đã gặp may mắn hơn khi tạo ra huyền thoại của riêng mình như dưới đây. Có vẻ hoạt động trong mọi trường hợp mà dường như chưa bao giờ có được cách đi đúng hướng. Nếu bạn không hiểu hãy cho tôi biết:

legendLabels = []
for i in range(modSize):
    legendLabels.append(ax.plot(x,hstack((array([0]),actSum[j,semi,i,semi])), color=plotColor[i%8], dashes=dashes[i%4])[0]) #linestyle=dashs[i%4]       
legArgs = dict(title='AM Templates (Hz)',bbox_to_anchor=[.4,1.05],borderpad=0.1,labelspacing=0,handlelength=1.8,handletextpad=0.05,frameon=False,ncol=4, columnspacing=0.02) #ncol,numpoints,columnspacing,title,bbox_transform,prop
leg = ax.legend(tuple(legendLabels),tuple(modFreq),'upper center',**legArgs)
leg.get_title().set_fontsize(tick_size)

Bạn cũng có thể sử dụng chân để thay đổi kích thước phông chữ hoặc gần như bất kỳ tham số nào của chú giải.

Tiêu đề chung như đã nêu trong nhận xét ở trên có thể được thực hiện bằng cách thêm văn bản theo liên kết được cung cấp: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html

f.text(0.5,0.975,'The new formatter, default settings',horizontalalignment='center',
       verticalalignment='top')

4

suptitlecó vẻ là con đường để đi, nhưng đối với những gì nó đáng giá, nó figurecó một thuộc transFiguretính mà bạn có thể sử dụng:

fig=figure(1)
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.