2012-03-10 30 views
24

Tôi đang cố gắng tạo một âm mưu với chú giải ở bên cạnh bằng cách sử dụng matplotlib. Tôi có thể thấy rằng cốt truyện đang được tạo ra, nhưng giới hạn hình ảnh không cho phép toàn bộ chú giải được hiển thị.Huyền thoại matplotlib.pyplot của tôi đang bị cắt

lines = [] 
ax = plt.subplot(111) 
for filename in args: 
    lines.append(plt.plot(y_axis, x_axis, colors[colorcycle], linestyle='steps-pre', label=filename)) 
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 

này tạo ra: enter image description here

+0

[Câu trả lời] (https://stackoverflow.com/a/43439132/4124317) cung cấp tổng quan về một số kỹ thuật có thể được sử dụng để nhận chú giải xuất hiện bên trong ranh giới hình. – ImportanceOfBeingErnest

Trả lời

16

Như đã chỉ bởi Adam, bạn cần phải làm cho không gian ở mặt bên của đồ thị của bạn. Nếu bạn muốn tinh chỉnh không gian cần thiết, bạn có thể muốn xem phương thức matplotlib.pyplot.artist add_axes.

Dưới đây là một ví dụ nhanh:

import matplotlib.pyplot as plt 
import numpy as np 

# some data 
x = np.arange(0, 10, 0.1) 
y1 = np.sin(x) 
y2 = np.cos(x) 

# plot of the data 
fig = plt.figure() 
ax = fig.add_axes([0.1, 0.1, 0.6, 0.75]) 
ax.plot(x, y1,'-k', lw=2, label='black sin(x)') 
ax.plot(x, y2,'-r', lw=2, label='red cos(x)') 
ax.set_xlabel('x', size=22) 
ax.set_ylabel('y', size=22) 
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 

plt.show() 

và hình ảnh kết quả: image

+50

Tôi biết matplotlib thích nói rằng mọi thứ đều dưới sự kiểm soát của người dùng, nhưng toàn bộ điều này với truyền thuyết là quá nhiều của một điều tốt. Nếu tôi đặt huyền thoại bên ngoài, tôi _obviously_ muốn nó vẫn còn nhìn thấy được. Cửa sổ chỉ cần mở rộng chính nó để phù hợp thay vì tạo ra rắc rối khổng lồ này. Ít nhất phải có một tùy chọn True mặc định để kiểm soát hành vi này. Buộc người dùng phải trải qua một số lượng vô lý của các hiển thị lại để thử và nhận được số tỷ lệ ngay trong tên kiểm soát hoàn thành điều ngược lại. – Elliot

+0

@strpeter đã cung cấp một giải pháp tự động trong câu trả lời của ông đã làm việc hoàn toàn tốt cho tôi. –

1

Edit: @gcalmettes posted a better answer.
Giải pháp của ông có lẽ nên được sử dụng thay vì phương pháp được hiển thị bên dưới.
Tuy nhiên, tôi sẽ để nguyên điều này vì đôi khi nó giúp thấy nhiều cách khác nhau để làm việc.


Như được hiển thị trong the legend plotting guide, bạn có thể nhường chỗ cho một phụ con khác và đặt chú giải ở đó.

import matplotlib.pyplot as plt 
ax = plt.subplot(121) # <- with 2 we tell mpl to make room for an extra subplot 
ax.plot([1,2,3], color='red', label='thin red line') 
ax.plot([1.5,2.5,3.5], color='blue', label='thin blue line') 
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 
plt.show() 

Tạo:

enter image description here

5

Dưới đây là một cách khác để làm cho không gian (thu hẹp một trục):

# Shink current axis by 20% 
box = ax.get_position() 
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height]) 

nơi 0,8 thang chiều rộng của trục 20%. Trên máy win7 64 của tôi, sử dụng hệ số lớn hơn 1 sẽ tạo chỗ cho huyền thoại nếu nó nằm ngoài cốt truyện.

Mã này được tham chiếu từ: How to put the legend out of the plot

15

Cho dù rằng nó là muộn, tôi muốn đề cập đến một lựa chọn tốt đẹp nếu bạn quan tâm đến các tập tin đầu ra của plt.savefig: trong trường hợp này cờ bbox_inches='tight' là bạn của bạn!

import matplotlib.pyplot as plt 

fig = plt.figure(1) 
plt.plot([1, 2, 3], [1, 0, 1], label='A') 
plt.plot([1, 2, 3], [1, 2, 2], label='B') 
plt.legend(loc='center left', bbox_to_anchor=(1, 0)) 

fig.savefig('samplefigure', bbox_inches='tight') 

Output file: samplefigure.png

Tôi muốn tham khảo cũng đến một câu trả lời chi tiết hơn: Moving matplotlib legend outside of the axis makes it cutoff by the figure box

Ưu

  • Không cần phải điều chỉnh các dữ liệu thực tế/hình ảnh.
  • Nó tương thích với plt.subplots cũng như nơi những người khác thì không!
+1

hoạt động cho tôi. Cảm ơn! – weefwefwqg3

+0

Cảm ơn! Điều này làm việc rất tốt w/ít sửa đổi cần thiết. –

+0

@CarlodelMundo: Những sửa đổi nào là cần thiết trong trường hợp của bạn? Cảm ơn vì đã chia sẻ với chúng tôi. – strpeter

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