我想绘制两条线,两条线都有一个标签,在for循环中多次产生几个图。在其中一些我希望图例中包含两个行条目,在某些只有第一行的句柄和标签,将第二行的条目留空。在所有情况下,我需要图例框架具有完全相同的大小,在我不想要第二个条目的情况下留下空白。
理论上我只需要转动第二个手柄并标签不可见。我发现一些解决方案Rectangle()
或Circle()
虚拟条目设置为不可见。但是,它们与实际图例条目的大小不同,导致不同的图例框架高度,具体取决于我是使用图例中的两条线还是仅使用一条线和虚拟线。有解决方案吗?
这是一个接近它的样子的例子(当然,尽管产生了价值)。比方说,在每第二次迭代中,我需要较低的图例条目消失,而图例框架不会改变其大小或形状。我怎么能这样做?
import numpy as np
import matplotlib.pyplot as plt
for i in range(10):
x1 = x2 = y1 = y2 = np.random.rand(5)
yerr1 = yerr2 = .1
plt.figure()
plt.errorbar(x1, y1, yerr=yerr1, c='r', ls='-', marker='.', label='set1')
plt.errorbar(x2, y2, yerr=yerr2, c='k', ls='-', marker='.', label='set2')
# Get rid of error bars in legend
ax.gca()
handles, labels = ax.get_legend_handles_labels()
handles = [n[0:1] for n in handles]
plt.legend(handles, labels, bbox_to_anchor=(0.,1.,1.,0.), loc=3, numpoints=2, ncol=1 ,borderaxespad=0., mode='expand', labelspacing=0.5, borderpad=0.2, handletextpad=0.05)
plt.savefig('test_%d' % i)
plt.close()
答案 0 :(得分:1)
谢谢你的例子。
这样的事情:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
dummy_white_line = mlines.Line2D([], [], color='white')
for i in range(10):
x1 = x2 = y1 = y2 = np.random.rand(5)
yerr1 = yerr2 = .1
plt.figure()
plt.errorbar(x1, y1, yerr=yerr1, c='r', ls='-', marker='.', label='set1')
plt.errorbar(x2, y2, yerr=yerr2, c='k', ls='-', marker='.', label='set2')
# Get rid of error bars in legend
ax = plt.gca()
handles, labels = ax.get_legend_handles_labels()
if i % 2 == 0:
handles[1] = dummy_white_line
labels[1] = ''
plt.legend(handles, labels, bbox_to_anchor=(0.,1.,1.,0.),
loc=3, numpoints=2, ncol=1 ,borderaxespad=0.,
mode='expand', labelspacing=0.5, borderpad=0.2, handletextpad=0.05)
plt.savefig('test_%d' % i)
#plt.show()
plt.close()
在这里,我使用dummy_white_line来“擦除”标签中的线条(白色背景上有白线),并使用空字符串作为标签。
正常情节:
没有(即空虚)第二个标签: