2012-10-06 45 views
37

我有一个绘图,不同的颜色用于不同的参数,不同的线型用于不同的算法。目标是比较使用相似参数执行的不同算法的结果。这意味着我总共使用了4种不同的颜色和3种不同的线条样式,在同一个图表上共有12个图。matplotlib:在同一个图上的2个不同的图例

我实际上建立了基于颜色的图例,将每种颜色与相应的参数相关联。现在我想在同一个图上显示第二个图例,以及每种线条样式的含义。有可能实现这一目标?怎么样?

这里是我的代码是什么样子实际上是:

colors = ['b', 'r', 'g', 'c'] 
cc = cycle(c) 
for p in parameters: 

    d1 = algo1(p) 
    d2 = algo2(p) 
    d3 = algo3(p) 

    pyplot.hold(True) 
    c = next(cc) 
    pyplot.plot(d1, '-', color=c, label="d1") 
    pyplot.plot(d1, '--', color=c) 
    pyplot.plot(d2, '.-', color=c) 

pyplot.legend() 

回答

53

有对确切主题的matplotlib文档中的一个部分:http://matplotlib.org/users/legend_guide.html#multiple-legends-on-the-same-axes

这里是为您的具体示例代码:

import itertools 
from matplotlib import pyplot 

colors = ['b', 'r', 'g', 'c'] 
cc = itertools.cycle(colors) 
plot_lines = [] 
for p in parameters: 

    d1 = algo1(p) 
    d2 = algo2(p) 
    d3 = algo3(p) 

    pyplot.hold(True) 
    c = next(cc) 
    l1, = pyplot.plot(d1, '-', color=c) 
    l2, = pyplot.plot(d2, '--', color=c) 
    l3, = pyplot.plot(d3, '.-', color=c) 

    plot_lines.append([l1, l2, l3]) 

legend1 = pyplot.legend(plot_lines[0], ["algo1", "algo2", "algo3"], loc=1) 
pyplot.legend([l[0] for l in plot_lines], parameters, loc=4) 
pyplot.gca().add_artist(legend1) 

下面是它的输出示例: Plot with 2 legends, per-param and per-algo

+1

所以关键是在'add_artist'中...对于一些疯狂的原因,matplotlib决定它知道更好并删除原始图例,然后你必须在稍后添加它。谢谢你的帮助,我会喝一杯啤酒。 –

5

这也是一个更“动手”的方式来做到这一点(即与任何数字轴)明确地互动:

import itertools 
from matplotlib import pyplot 

fig, axes = plt.subplot(1,1) 

colors = ['b', 'r', 'g', 'c'] 
cc = itertools.cycle(colors) 
plot_lines = [] 
for p in parameters: 

    d1 = algo1(p) 
    d2 = algo2(p) 
    d3 = algo3(p) 

    c = next(cc) 
    axes.plot(d1, '-', color=c) 
    axes.plot(d2, '--', color=c) 
    axes.plot(d3, '.-', color=c) 

# In total 3x3 lines have been plotted 
lines = axes.get_lines() 
legend1 = pyplot.legend([lines[i] for i in [0,1,2]], ["algo1", "algo2", "algo3"], loc=1) 
legend2 = pyplot.legend([lines[i] for i in [0,3,6]], parameters, loc=4) 
axes.add_artist(legend1) 
axes.add_artist(legend2) 

我喜欢写它,因为它允许潜在的较少模糊的方式与不同的轴玩这种方式。您可以先创建一组图例,然后使用方法“add_artist”将它们添加到所需的坐标轴。另外,我从matplotlib开始,对于我来说,至少在objets被解析时更容易理解脚本。

注意:请注意,您的传说可能会在显示/保存时被截断。要解决这个问题,请使用方法axes.set_position([left,bottom,width,length])将子图相对于图的大小缩小并显示图例。

相关问题