Matplotlib虚线可以设置“off”颜色吗?

5
使用虚线很好,因为它提供了一种区分线条的方式,不依赖于读者能否感知颜色差异。问题在于,它们只有在线条的细节都大于虚线模式时才有效。Matplotlib's Axes.plot函数的文档描述了如何自定义线条的颜色(使用color关键字)以及如何自定义虚线的模式(dash关键字)。有没有办法通过单个调用Axes.plot使图形在两种不同可选颜色之间交替而不是“存在”和“不存在”?
我可以通过画两次相同的线来实现这种效果,一次用实线,然后再用虚线覆盖相同的数据,但这会使管理alpha透明度变得复杂(当一个图中有几条相交的线时,半透明线是理想的)。下面的黑色和灰色线条是使用以下代码生成的:
ax.plot(xv1, yv1, marker="None", linestyle="-", color=(0.8, 0.8, 0.8, 1.0))
ax.plot(xv1, yv1, marker="None", linestyle="--", color=(0.0, 0.0, 0.0, 1.0))

编辑:希望使用单个调用Axis.plot实现此操作的另一个原因是,在创建图例时可以正确地显示示例线(这是我在答案中找到的唯一剩余的缺点)。

Example of a plot with alternating color dashed lines.


已在 Github 上提交了一个“功能请求问题”(feature request issue),链接为 https://github.com/matplotlib/matplotlib/issues/18351。 - Sean Lake
3个回答

6

通过尝试@WilliamMiller美妙的解答,我们可以将其扩展到两种以上的颜色:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, np.pi*4, 100)
y = np.sin(x+np.pi/2)
z = np.sin(x+np.pi/4)
w = np.sin(x)

plt.plot(x, y, linestyle=(0, (5, 5)), color='gold')
plt.plot(x, y, linestyle=(5, (5, 5)), color='crimson')

plt.plot(x, z, linestyle=(0, (10, 30)), color='blueviolet')
plt.plot(x, z, linestyle=(10, (10, 30)), color='lime')
plt.plot(x, z, linestyle=(20, (10, 30)), color='fuchsia')
plt.plot(x, z, linestyle=(30, (10, 30)), color='coral')

plt.plot(x, w, linestyle=(0, (10, 20)), color='crimson', lw=3)
plt.plot(x, w, linestyle=(10, (10, 20)), color='lime', lw=3)
plt.plot(x, w, linestyle=(20, (10, 20)), color='deepskyblue', lw=3)

plt.show()

resulting plot


这真是太棒了。 - Mad Physicist

5
这不符合你要求的“使用单个呼叫Axes.plot”的目的,但可以通过使用两种自定义linestyles来创建所需的行为 - 其中一种线型通过另一种虚线的宽度进行偏移。
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, np.pi*4, 100)
y = np.sin(x)

plt.plot(x, y, linestyle=(0, (2, 2)))
plt.plot(x, y, linestyle=(2, (2, 2)))
plt.show()

enter image description here

线条样式规范为(offset, (on_off_seq)),其中on_off_seq是一个以pt为单位的一个或多个值的元组。


足够好。它解决了我的不透明度问题,并且可以直接包装在一个函数中。 - Sean Lake
@SeanLake 很高兴这对你有用,根据你想要表达的内容,你可能只需要使用更紧密的破折号和更高的dpi,而不是重复这样做。这只是一个想法。 - William Miller
我实际上正在处理PDF,所以dpi是无限的。即便如此,没有填充空白的东西,虚线模式也会缺少这些直方图的特征。请注意,特别是在中间图中的浅灰色峰值。 - Sean Lake

1
如果您想在图表上添加图例,可以按照以下步骤操作:
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 2*np.pi, 0.2)
y = np.cos(x)

blue_line, = plt.plot(x, y, linestyle='-', lw=3)
dashed_line, = plt.plot(x, y, linestyle=(2, (2, 2)), lw=3)

plt.legend([(blue_line, dashed_line)], ['data'])

The render result can be seen here (sorry I can't post embedded images)

matplotlib中的图例非常可自定义,更有趣的示例和信息可以在这里看到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接