优先填充matplotlib图例的右列
你好,我正在尝试把图例放到图表上,这样它就不会遮挡住图形。
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(0,100,11)
plt.plot(X,-X, label='plot 1')
plt.plot(X,-2*X, label='plot 2')
plt.plot(X,-3*X, label='plot 3')
leg=plt.legend(ncol=2)
leg.get_frame().set_visible(False)
plt.show()
在上面的简单示例中,我想做的是把图例中的“plot 2”标签移动到右边的那一列,也就是直接放在“plot 3”下面。
如果能帮忙就太好了,谢谢。
3 个回答
3
第三种方法,参考Franesco的回答。画一条透明的占位线,透明度设置为0。
#draw your actual lines here
#plt....
lines, labels = plt.gca().get_legend_handles_labels()
lines.insert(1, plt.Line2D([],[], alpha=0))
labels.insert(1,'')
plt.legend(lines,labels,ncol=2)
plt.show()
这个方法和他回答中提到的优点是一样的。不过在matplotlib 1.5.1(使用python3)中,这个解决方案不管用,报错信息是ValueError: Unrecognized marker style none
。
8
这是对@cosmosis回答的另一种实现方式。可能会更灵活一些。
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(0,100,11)
plt.plot(X,-X, label='plot 1', color='red')
plt.plot(X,-2*X, label='plot 2', color='green')
plt.plot(X,-3*X, label='plot 3', color='blue')
(lines, labels) = plt.gca().get_legend_handles_labels()
#it's safer to use linestyle='none' and marker='none' that setting the color to white
#should be invisible whatever is the background
lines.insert(1, plt.Line2D(X,X, linestyle='none', marker='none'))
labels.insert(1,'')
plt.legend(lines,labels,numpoints=1, loc=4,ncol=1)
plt.show()
另一种选择是创建两个图例,具体可以参考这里,然后使用bbox_to_anchor这个关键词来调整它们的位置,详细信息可以查看这里。
(lines, labels) = plt.gca().get_legend_handles_labels()
leg1 = plt.legend(lines[:1], labels[:1], bbox_to_anchor=(0,0,0.8,1), loc=1)
leg2 = plt.legend(lines[1:], labels[1:], bbox_to_anchor=(0,0,1,1), loc=1)
gca().add_artist(leg1)
这样做的话,我得到了 ,而不需要添加任何其他对象。
6
这个说明是说,图例的内容是从左到右填充的。换句话说,如果你让它误以为还有另一行(这行没有任何文字或颜色),那么你就可以在“plot 3”下面填充空间。
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
X = np.linspace(0,100,11)
plt.plot(X,-X, label='plot 1', color='red')
plt.plot(X,-2*X, label='plot 2', color='green')
plt.plot(X,-3*X, label='plot 3', color='blue')
line1 = Line2D(range(10), range(10), marker='', color="red")
line2 = Line2D(range(10), range(10), marker='',color="green")
line3 = Line2D(range(10), range(10), marker='', color="blue")
line4 = Line2D(range(10), range(10), marker='', color="white")
plt.legend((line1,line4, line3,line2),('plot1','','plot3','plot2'),numpoints=1, loc=4,ncol=2)
plt.show()