可以为Matplotlib虚线设置“关闭”颜色吗?

时间:2019-12-01 21:57:19

标签: python matplotlib

使用虚线很不错,因为它提供了一种区分线的方法,该线不依赖于读者能够感知颜色的差异。问题是它们仅在行的细节都大于破折号的情况下才起作用。 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.

3 个答案:

答案 0 :(得分:3)

这无法完成您所要求的“ 只需调用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

linestyle规范为(offset, (on_off_seq)),其中on_off_seqtuple中一个或多个值的pt

答案 1 :(得分:3)

使用@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

答案 2 :(得分: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中的传说非常可定制,更有趣的示例和信息可见here