Đặt huyền thoại ( bbox_to_anchor
)
Một chú giải được định vị bên trong hộp giới hạn của các trục bằng cách sử dụng loc
đối số plt.legend
.
Ví dụ: loc="upper right"
đặt chú giải ở góc trên bên phải của hộp giới hạn, theo mặc định, phạm vi từ (0,0)
đến (1,1)
tọa độ trục (hoặc trong ký hiệu hộp giới hạn (x0,y0, width, height)=(0,0,1,1)
).
Để đặt chú giải bên ngoài hộp giới hạn trục, người ta có thể chỉ định một tuple (x0,y0)
tọa độ trục của góc dưới bên trái của chú giải.
plt.legend(loc=(1.04,0))
Tuy nhiên, một cách tiếp cận linh hoạt hơn sẽ là chỉ định thủ công hộp giới hạn mà theo đó chú thích sẽ được đặt, sử dụng bbox_to_anchor
đối số. Người ta có thể hạn chế chỉ cung cấp (x0,y0)
một phần của hộp. Điều này tạo ra một hộp zero zero, trong đó chú giải sẽ mở rộng theo hướng được đưa ra bởi loc
đối số. Ví dụ
plt.legend (bbox_to_anchor = (1.04,1), loc = "phía trên bên trái")
đặt chú giải bên ngoài các trục, sao cho góc trên bên trái của chú giải nằm ở vị trí (1.04,1)
tọa độ trục.
Các ví dụ khác được đưa ra dưới đây, trong đó bổ sung sự tương tác giữa các đối số khác nhau như mode
và ncols
được hiển thị.
l1 = plt.legend(bbox_to_anchor=(1.04,1), borderaxespad=0)
l2 = plt.legend(bbox_to_anchor=(1.04,0), loc="lower left", borderaxespad=0)
l3 = plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
l4 = plt.legend(bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",
mode="expand", borderaxespad=0, ncol=3)
l5 = plt.legend(bbox_to_anchor=(1,0), loc="lower right",
bbox_transform=fig.transFigure, ncol=3)
l6 = plt.legend(bbox_to_anchor=(0.4,0.8), loc="upper right")
Chi tiết về cách diễn giải đối số 4-tuple bbox_to_anchor
, như trong l4
, có thể được tìm thấy trong câu hỏi này . Việc mode="expand"
mở rộng huyền thoại theo chiều ngang bên trong hộp giới hạn được đưa ra bởi 4-tuple. Đối với một huyền thoại mở rộng theo chiều dọc, xem câu hỏi này .
Đôi khi nó có thể hữu ích để chỉ định hộp giới hạn trong tọa độ hình thay vì tọa độ trục. Điều này được thể hiện trong ví dụ l5
từ phía trên, trong đó bbox_transform
đối số được sử dụng để đặt chú giải ở góc dưới bên trái của hình.
Hậu xử lý
Việc đặt huyền thoại bên ngoài các trục thường dẫn đến tình huống không mong muốn rằng nó hoàn toàn hoặc một phần bên ngoài khung vẽ.
Giải pháp cho vấn đề này là:
Điều chỉnh các tham số subplot
Người ta có thể điều chỉnh các tham số subplot sao cho các trục chiếm ít không gian bên trong hình (và do đó để lại nhiều không gian hơn cho chú giải) bằng cách sử dụng plt.subplots_adjust
. Ví dụ
plt.subplots_adjust(right=0.7)
để lại 30% không gian ở phía bên phải của hình, nơi người ta có thể đặt huyền thoại.
Bố cục chặt chẽ
Sử dụng plt.tight_layout
Cho phép tự động điều chỉnh các tham số của ô phụ sao cho các phần tử trong hình nằm sát với các cạnh của hình. Thật không may, huyền thoại không được tính đến trong thuyết tự động này, nhưng chúng tôi có thể cung cấp một hộp hình chữ nhật mà toàn bộ khu vực con (bao gồm cả nhãn) sẽ phù hợp.
plt.tight_layout(rect=[0,0,0.75,1])
Lưu hình vớibbox_inches = "tight"
Lý lẽ bbox_inches = "tight"
để plt.savefig
có thể được sử dụng để lưu hình như vậy mà tất cả các nghệ sĩ trên vải (bao gồm cả huyền thoại) là phù hợp vào khu vực lưu. Nếu cần, kích thước hình được tự động điều chỉnh.
plt.savefig("output.png", bbox_inches="tight")
- tự động điều chỉnh các tham số của subplot
Một cách để tự động điều chỉnh vị trí của subplot sao cho chú giải phù hợp bên trong khung vẽ mà không thay đổi kích thước hình có thể được tìm thấy trong câu trả lời này: Tạo hình với kích thước chính xác và không có phần đệm (và chú thích bên ngoài trục)
So sánh giữa các trường hợp được thảo luận ở trên:
Lựa chọn thay thế
Một huyền thoại hình
Một người có thể sử dụng một huyền thoại cho hình thay vì các trục , matplotlib.figure.Figure.legend
. Điều này đã trở nên đặc biệt hữu ích cho phiên bản matplotlib> = 2.1, trong đó không cần đối số đặc biệt
fig.legend(loc=7)
để tạo ra một huyền thoại cho tất cả các nghệ sĩ trong các trục khác nhau của hình. Truyền thuyết được đặt bằng cách sử dụng loc
đối số, tương tự như cách nó được đặt bên trong một trục, nhưng tham chiếu đến toàn bộ hình - do đó nó sẽ nằm ngoài trục một cách tự động. Những gì còn lại là điều chỉnh các ô con sao cho không có sự chồng chéo giữa truyền thuyết và các trục. Ở đây điểm "Điều chỉnh các tham số subplot" từ trên sẽ hữu ích. Một ví dụ:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi)
colors=["#7aa0c4","#ca82e1" ,"#8bcd50","#e18882"]
fig, axes = plt.subplots(ncols=2)
for i in range(4):
axes[i//2].plot(x,np.sin(x+i), color=colors[i],label="y=sin(x+{})".format(i))
fig.legend(loc=7)
fig.tight_layout()
fig.subplots_adjust(right=0.75)
plt.show()
Chú thích bên trong các trục con phụ chuyên dụng
Một cách khác để sử dụng bbox_to_anchor
sẽ là đặt chú giải vào các trục con phụ chuyên dụng ( lax
). Vì subplot huyền thoại nên nhỏ hơn cốt truyện, chúng ta có thể sử dụng gridspec_kw={"width_ratios":[4,1]}
khi tạo trục. Chúng ta có thể ẩn các trục lax.axis("off")
nhưng vẫn đặt một chú giải. Các tay cầm và nhãn chú thích cần lấy từ cốt truyện thực thông qua h,l = ax.get_legend_handles_labels()
, và sau đó có thể được cung cấp cho chú giải trong phần lax
phụ , lax.legend(h,l)
. Một ví dụ đầy đủ là dưới đây.
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 6,2
fig, (ax,lax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[4,1]})
ax.plot(x,y, label="y=sin(x)")
....
h,l = ax.get_legend_handles_labels()
lax.legend(h,l, borderaxespad=0)
lax.axis("off")
plt.tight_layout()
plt.show()
Điều này tạo ra một cốt truyện khá giống với cốt truyện ở trên:
Chúng ta cũng có thể sử dụng các trục đầu tiên để đặt huyền thoại, nhưng sử dụng các bbox_transform
trục huyền thoại,
ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")
Trong phương pháp này, chúng ta không cần phải có các xử lý chú giải bên ngoài, nhưng chúng ta cần chỉ định bbox_to_anchor
đối số.
Đọc thêm và ghi chú:
- Xem xét hướng dẫn truyền thuyết matplotlib với một số ví dụ về những thứ khác bạn muốn làm với truyền thuyết.
- Một số mã ví dụ để đặt huyền thoại cho biểu đồ hình tròn có thể được tìm thấy trực tiếp trong câu trả lời cho câu hỏi này: Python - Truyền thuyết trùng lặp với biểu đồ hình tròn
- Đối
loc
số có thể lấy số thay vì chuỗi, làm cho các cuộc gọi ngắn hơn, tuy nhiên, chúng không được ánh xạ trực quan với nhau. Đây là ánh xạ để tham khảo: