2012-03-10 392 views
24

我正在嘗試使用matplotlib爲圖例創建一個圖例。我可以看到情節正在創建,但圖像邊界不允許顯示整個圖例。我的matplotlib.pyplot圖例正在被切斷

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.) 

這將產生: enter image description here

+0

[This answer](https://stackoverflow.com/a/43439132/4124317)概述了幾種可用於使圖例出現在圖形邊界內的技術。 – ImportanceOfBeingErnest 2017-10-11 22:03:45

回答

16

正如指出的亞當,你需要在你的圖的側面空間。 如果你想微調所需的空間,你可能想看看matplotlib.pyplot.artist的add_axes方法。

下面是一個快速例如:

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() 

和所得到的圖像:image

+50

我知道matplotlib喜歡吹噓所有東西都在用戶的控制之下,但是與傳說有關的整個事情都是一件好事。如果我把傳說放在外面,我明顯地希望它仍然可見。該窗口應該只是適應自己而不是創建這個巨大的縮放麻煩。至少應該有一個默認的True選項來控制這種自動縮放行爲。強迫用戶通過一些荒謬的重新渲染,試圖以控制的名義獲得正確的比例數字,完成了相反的事情。 – Elliot 2013-01-02 21:43:45

+0

@strpeter在他的回答中提供了一個自動的解決方案,對我來說工作得非常好。 – 2017-02-27 12:21:38

1

編輯:@gcalmettes發佈a better answer
他的解決方案可能應該用來代替下面顯示的方法。
儘管如此,我會離開它,因爲它有時有助於看到不同的做事方式。


the legend plotting guide所示,可以騰出另一個插曲,並把傳說那裏。

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() 

產地:

enter image description here

5

在這裏是使空間的另一種方式(收縮軸):

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

其中0.8秤軸的寬度減少20%。在我的win7 64機器上,使用大於1的因子將會爲圖例騰出空間,如果它在圖表之外。

此代碼是從引用:How to put the legend out of the plot

15

Eventhough它是晚,我想指的,如果你有興趣的plt.savefig輸出文件中一個不錯的選擇:在這種情況下,標誌bbox_inches='tight'是你的朋友!

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

我想也提到了更詳細的解答:Moving matplotlib legend outside of the axis makes it cutoff by the figure box

優勢

  • 沒有需要調整的實際數據/圖片。
  • 它與plt.subplots as-well兼容,而其他人不是!
+1

適合我。謝謝! – weefwefwqg3 2017-05-27 19:02:45

+0

謝謝!這工作得很好w /必要的小修改。 – 2017-08-08 23:27:25

+0

@CarlodelMundo:您的情況需要進行哪些修改?感謝您與我們分享。 – strpeter 2017-08-10 07:47:23