使用matplotlib在图例中创建自定义垂直线标记

时间:2019-01-19 22:58:37

标签: python matplotlib

我有一个带有许多水平线的图形,每个水平线都有自己的标签。我也有一些带有标签的垂直线。默认情况下,pyplot.legend()使用水平线标记显示这些标签,我想在视觉上将我的垂直线标签与水平线标签区分开。关于如何执行此操作有任何想法吗?下面是绘制线条的简单命令。

plt.axvline( x=10, linestyle='-',color='black',label='vertical line')
plt.legend()

enter image description here

也:

我知道这个建议 Legend with vertical line in matplotlib,但我不确定如何在图例中为单个标签实现。

1 个答案:

答案 0 :(得分:2)

这是针对多个垂直图例的一种方法。我选择了非常简单的数据来提供可行的解决方案。您可以将概念扩展到实际数据中

from matplotlib import lines

fig, ax = plt.subplots()

plt.plot([0, 5], [1, 1], label='y=1')
plt.plot([0, 5], [2, 2], label='y=2')
plt.plot([0, 5], [3, 3], label='y=3')

handles, _  = ax.get_legend_handles_labels()

vertical_pos = [5, 7, 10]
colors = ['r', 'g', 'b']

for x, c in zip(vertical_pos, colors):
    plt.plot([x, x], [0, 3], color=c, label='Vertical x=%s' %x)

_, labels = ax.get_legend_handles_labels()

for c in colors:
    vertical_line = lines.Line2D([], [],  marker='|', linestyle='None', color=c,
                          markersize=10, markeredgewidth=1.5)
    handles.append(vertical_line)

plt.legend(handles, labels)

编辑(使用axvline代替plot

for x, c in zip(vertical_pos, colors):
    ax_ = plt.axvline( x=x, linestyle='-', color=c, label='Vertical x=%s' %x)

_, labels = ax.get_legend_handles_labels()

for c in colors:
    vertical_line = lines.Line2D([], [],  marker='|', linestyle='None', color=c,
                          markersize=10, markeredgewidth=1.5)
    handles.append(vertical_line)

plt.legend(handles, labels)

enter image description here