通过 matplotlib 图例中的标记删除线

Posted

技术标签:

【中文标题】通过 matplotlib 图例中的标记删除线【英文标题】:Remove line through marker in matplotlib legend 【发布时间】:2014-02-12 16:27:01 【问题描述】:

我有一个使用以下代码生成的matplotlib 图:

import matplotlib.pyplot as pyplot

Fig, ax = pyplot.subplots()
for i, (mark, color) in enumerate(zip(
    ['s', 'o', 'D', 'v'], ['r', 'g', 'b', 'purple'])):
    ax.plot(i+1, i+1, color=color,
            marker=mark,
            markerfacecolor='None',
            markeredgecolor=color,
            label=i)

ax.set_xlim(0,5)
ax.set_ylim(0,5)
ax.legend()

以此作为生成的图:

我不喜欢图例中通过标记的线条。我怎样才能摆脱它们?

【问题讨论】:

【参考方案1】:

你应该在这里使用散点图

import matplotlib.pyplot as pyplot

Fig, ax = pyplot.subplots()
for i, (mark, color) in enumerate(zip(
    ['s', 'o', 'D', 'v'], ['r', 'g', 'b', 'purple'])):
    ax.scatter(i+1, i+1, color=color,
            marker=mark,
            facecolors='none',
            label=i)

ax.set_xlim(0,5)
ax.set_ylim(0,5)
ax.legend(scatterpoints=1)

pyplot.show()

【讨论】:

这是我的第一反应,但我认为这个例子可能过于具体——如果 OP 想要一个多点的真实情节怎么办? 嗯,可能是这样。我只是假设他不知道散点图功能。如果他真的想要一个多点的真实情节,他应该在这里寻求其他答案之一。 我确实知道scatter 的情节。但我需要更通用的东西。我只是在这里以plot 为例。我当前的真实应用程序实际上使用errorbarscatter 不允许我绘制误差线。【参考方案2】:

您可以为绘图设置rcparams

import matplotlib
matplotlib.rcParams['legend.handlelength'] = 0
matplotlib.rcParams['legend.numpoints'] = 1

如果您不希望设置全局应用于所有绘图,则所有 legend.* 参数都可用作关键字。请参阅matplotlib.pyplot.legend 文档和此相关问题:

legend setting (numpoints and scatterpoints) in matplotlib does not work

【讨论】:

这是一个设置全局参数的好例子。对于非全局设置,我更喜欢 @tom10 的答案。【参考方案3】:

您可以在 plot 命令中指定 linestyle="None" 作为关键字参数:

import matplotlib.pyplot as pyplot

Fig, ax = pyplot.subplots()
for i, (mark, color) in enumerate(zip(
    ['s', 'o', 'D', 'v'], ['r', 'g', 'b', 'purple'])):
    ax.plot(i+1, i+1, color=color,
            marker=mark,
            markerfacecolor='None',
            markeredgecolor=color,
            linestyle = 'None',
            label=`i`)

ax.set_xlim(0,5)
ax.set_ylim(0,5)
ax.legend(numpoints=1)
pyplot.show()

由于您只绘制单个点,因此除了图例之外,您看不到线属性。

【讨论】:

有趣的是,这仍然“绘制”(或分配空间)图例中的线,看看我们的答案之间的图例中的间距。 就个人而言,我认为这些符号看起来不错,周围有一点空间,但如果我要优化它,我会放比上面显示的少一点。填充也可以使用关键字参数进行 tweeked,例如:handletextpad=-.5, columnspacing=0, borderpad=-.5, borderaxespad=0 等,包括可用作关键字参数的handlelength uff,不是None,而是"None"【参考方案4】:

在绘制数据后简单地删除线条:

handles, labels = ax.get_legend_handles_labels()
for h in handles: h.set_linestyle("")
ax.legend(handles, labels)

【讨论】:

以上是关于通过 matplotlib 图例中的标记删除线的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 图例:标记上方的标签

如何删除 matplotlib 图例上的线条/标记?

删除matplotlib图例中的重复标签[重复]

Matplotlib:从头开始制作彩色标记图例

增加 matplotlib 中图例线的线宽

Matplotlib:在图例中移动标记位置