【问题标题】:How to get alternating colours in dashed line using matplotlib?如何使用matplotlib在虚线上获得交替颜色?
【发布时间】:2015-07-21 13:21:26
【问题描述】:

在 matplotlib 中,我想使用 matplotlib.pyplot 画一条线,它是交替的黑色和黄色破折号,然后我想将该线包含在图例中。我该怎么做?

我可以这样做:

from matplotlib import pyplot as plt, gridspec
import numpy as np

grid = gridspec.GridSpec(1,1)
ax = plt.subplot(grid[0,0])

x = np.arange(1,11)
y = x * 2

ax.plot(x, y, '-', color = 'black', linewidth = 1, label = 'my line')
ax.plot(x, y, '--', color = 'yellow')
ax.legend()

plt.show()

但图例上的线条会显示为黑色实线,而不是黑黄虚线。

我确实看过matplotlib.path_effects,但我无法确定是否有可能实现我想要的;我可以勾勒或遮住线条,但我不确定是否可以覆盖不同颜色的虚线。

【问题讨论】:

  • 简短问题:该行是否应该有黄色和黑色破折号(即黄色破折号 - 空白区域 - 黑色破折号 - 空白区域 - 黄色破折号......)。或者将图例条目调整为黑色实线顶部的黄色虚线就足够了?
  • 我脑海中的图像是 Tanmaya Meher 在下面发布的图像 - 但如果你有一种方法,如你所描述的那样,那可能对将来访问这个问题的人有用,所以我还是鼓励你把它添加为答案!

标签: python matplotlib plot


【解决方案1】:

试试这个。

from matplotlib import pyplot as plt, gridspec, lines

import numpy as np

grid = gridspec.GridSpec(1,1)
ax = plt.subplot(grid[0,0])

x = np.arange(1,11)
y = x * 2

ax.plot(x, y, '-', color = 'black', linewidth = 5)
ax.plot(x, y, '--', color = 'lawngreen', linewidth = 5)

dotted_line1 = lines.Line2D([], [], linewidth=5, linestyle="--", dashes=(10, 1), color='lawngreen')
dotted_line2 = lines.Line2D([], [], linewidth=5, linestyle="-", dashes=(5, 4), color='black')

plt.legend([(dotted_line1, dotted_line2)], ["My Line"])
plt.show()

我增加了线宽,使其清晰可见。因为黄色在白色背景中不是那么清晰;将其更改为绿色。对于那个很抱歉。您可以随时以任何方式更改颜色:)

【讨论】:

  • 谢谢,这太完美了。
【解决方案2】:

稍作调整,如果您需要两条虚线的叠加。从本质上讲,可以使用 Tanmaya Meher 描述的相同方法,但要获得正确的偏移量,需要在 dashes 规范中做一些小改动。

具体来说,假设您想要 1 个点、1 个具有交替颜色的空白

. . . .

然后您可以使用破折号规范[1,3] 开始第一条虚线。现在第二种颜色应该从 pos 2 开始,然后具有相同的规格,以便它们很好地交错。由于没有明确的方法来设置偏移量,因此需要一个变通的破折号序列[0,2, 1, 1],即没有点、两个空白、一个点、一个空白,它设置了所需的偏移量。

import matplotlib.pyplot as plt

from matplotlib.lines import Line2D

color1 = "blue"
color2 = "orange"

fig, ax = plt.subplots()
l1 = Line2D([0,1], [0.5, 0.5], linestyle="dotted", color=color1, lw=10)
l1.set_dashes([0, 2, 1,1])
l2 = Line2D([0,1], [0.5, 0.5], linestyle="dotted", color=color2, lw=10)
l2.set_dashes([1, 3])

ax.add_artist(l1)
ax.add_artist(l2)
ax.legend(handles=((l1,l2),), labels=("label",), handlelength=3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2021-08-08
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多