我一直在做一些线性回归,并希望在图例的同一行上绘制标记(原始数据)和线条(回归)。为简单起见,这是一个虚假的回归:
from pylab import *
ax = subplot(1,1,1)
p1, = ax.plot([1,2,3,4,5,6],'r-', label="line 1")
p2, = ax.plot([6,5,4,3,2,1],'b-', label="line 2")
p3, = ax.plot([1.2,1.8,3.1,4.1,4.8,5.9],'ro', label="dots 1")
p4, = ax.plot([6.1,5.1,3.8,3.1,1.9,0.9],'bo', label="dots 2")
ax.legend(loc='center right',numpoints=1)
show()
所以我希望图例由2条线组成,每条线显示一条线和一条点,而不是4条线。我怎么能这样做?
答案 0 :(得分:6)
您只需要更直接地使用legend
。请参阅Matplotlib - How to make the marker face color transparent without making the line transparent和user guide。
ax.legend([(p1, p3), (p2, p4)], ['set 1', 'set 2'])
plt.draw()
答案 1 :(得分:2)
您可以尝试使用
from pylab import *
ax = subplot(1,1,1)
p1, = ax.plot([1,2,3,4,5,6],'r-')
p2, = ax.plot([6,5,4,3,2,1],'b-')
p3, = ax.plot([1.2,1.8,3.1,4.1,4.8,5.9],'r-o', label="dots 1")
p4, = ax.plot([6.1,5.1,3.8,3.1,1.9,0.9],'b-o', label="dots 2")
ax.legend(loc='center right',numpoints=1)
show()
或者如果你想要一个穷人的解决方案,你可以在你的绘图范围之外绘制一些东西并仅标记该绘图。 例如
p5 = ax.plot(ones(2)*1e6,ones(2)*1e6,'r-o', label="dots 1")
对另一个标签执行相同操作,然后强制您的绘图不包含p5
,例如,像这样
ax.set_xlim(0,10);ax.set_ylim(0,10)
答案 2 :(得分:1)
我通常通过创建具有我感兴趣的绘图属性的虚拟线来解决此问题。但是,我认为@ tcaswell的解决方案更好。
from matplotlib.lines import Line2D
def create_dummy_line(**kwds):
return Line2D([], [], **kwds)
# your code here
# Create the legend
lines = [
('name A', {'color': 'red', 'linestyle': '-', 'marker': 'o'}),
('name B', {'color': 'blue', 'linestyle': '-', 'marker': 'o'}),
]
ax.legend(
# Line handles
[create_dummy_line(**l[1]) for l in lines],
# Line titles
[l[0] for l in lines],
loc='center right'
)