Python 如何一次绘制虚线连接的空心符号?

Python 如何一次绘制虚线连接的空心符号?,python,matplotlib,Python,Matplotlib,我正在尝试使用matplotlib绘制虚线连接的空心符号。如果我这样做 plt.plot(x, y, 'o:', fillstyle='none') 符号也变成了虚线。我可以分别绘制它们,以获得具有实体边界的符号 plt.plot(x, y, 'o', fillstyle='none') plt.plot(x, y, ':') 但是我把我的图例弄乱了,因为这不能使符号和线条都成为一个单独的图例条目 有人知道这样做的正确方法吗?谢谢。您可以为标记设置白色填充,而不是不填充。这可以通过以下方式实

我正在尝试使用matplotlib绘制虚线连接的空心符号。如果我这样做

plt.plot(x, y, 'o:', fillstyle='none')
符号也变成了虚线。我可以分别绘制它们,以获得具有实体边界的符号

plt.plot(x, y, 'o', fillstyle='none')
plt.plot(x, y, ':')
但是我把我的图例弄乱了,因为这不能使符号和线条都成为一个单独的图例条目


有人知道这样做的正确方法吗?谢谢。

您可以为标记设置白色填充,而不是不填充。这可以通过以下方式实现:

plt.plot(x, y, 'o:', markerfacecolor='w')

如果您使用不同的打印背景颜色,可以将“w”(表示白色)更改为您想要的颜色。

很抱歉,我将此作为答案发布-我不能在评论中包含图像

你确定符号是虚线的吗?这个程序(我把符号放大了一点):

将matplotlib.pyplot作为plt导入

def test_plot():
    x = range(11)
    y = [x0**2 for x0 in x]

    plt.plot(x, y, 'o:', fillstyle='none', label = "1", ms = 10)
    plt.legend()
    plt.show()

def main(args):
    test_plot()
    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))
显示实心符号和虚线:

这似乎是合乎逻辑的做法。请注意,连接线从线段第一个符号的中心开始,在最后一个符号之前停止。如果你想“清理”完整的符号,你可以按照Replikis的回答用白色填充

来自MATPLOTLIB邮件列表的反馈:

本·罗特:

我们最近一直在修复macosx后端的一系列问题 (这是Mac上的默认设置)。把圆圈点起来听起来很准确 就像我们发现的一些bug会引起的问题一样 我们正在讲话。我认为我们有一些致力于解决问题的解决方案 主分支,所以如果您可以从git构建和安装,您可以看到 问题是否已解决

托马斯·卡斯韦尔:

修复此问题的PR仍处于打开状态:


奇怪的这种行为似乎与平台有关。我在我的macbook pro和linux mint桌面上都试过你的脚本。后者显示相同的结果,但我的mac电脑上仍然有点符号。我在mac上使用的是Anaconda 2.3.0,mac上有matplotlib 1.4.3,在linux桌面上使用的是matplotlib 1.3.1。我在这两种情况下都使用python3.4。你知道我的mac有什么错(或对)吗?在这里,我使用的是matplotlib版本1.3.1。我刚刚下载了1.4.3,稍后我将试用并报告。1.3和1.4之间的一大区别是新样式包。可能是添加包导致了这种差异。我还查看了nabble.com上的bug追踪器、sourceforge上的问题追踪器和1.4 Changelog,但我没有找到关于主题的任何注释哇,这需要做一些工作。我现在安装了matplotlib 1.4.3,绘图完全停止工作!直到我把Agg换成GtkAgg,我才重新开始绘图工作。但与1.3.1没有区别-我会抓取屏幕,但与上面的相同。好的。我在mac上尝试了不同的后端。虽然我没有安装GTK,但后端“TkAgg”和“Qt4Agg”确实可以正常工作。而后端“MacOSX”则出现了虚线符号问题。哪个部分要对此错误负责?水蟒?苹果操作系统?或者别的什么?我给Matplotlib邮件列表发了一封你的邮件,另一封我的邮件。我相信这是处理matplotlib问题的正常做法。如果问题很小,可能会很快得到解决,否则我会将它们升级到bug跟踪器。如果我得到任何回复,我会报告。谢谢你的回答,雷皮克利斯。因为这似乎只是扩展了另一个答案,所以它可能应该被添加为对另一个答案的评论。@JasonD因为这个答案是在另一个答案之前发布的,所以你的评论是无效的。你真的应该停止在我以前的帖子下发表评论,只是为了找到我。@Repiklis抱歉,简单的错误。为什么这会影响到你?