更改matplotlib图形中间的线条样式

12

我正在绘制一些数据(两条线),我想改变线条的样式,使它们在差异显著的部分看起来不同。因此,在下面的图像中(现在是一个链接,因为反垃圾邮件政策不允许我发布图像),我希望线条在x轴约35处开始收敛之前的部分看起来不同(例如虚线)。

线图

有没有一种简单的方法可以做到这一点?我已经有了差异显著性在x轴上的值,只是不清楚如何在特定的x轴位置更改线条样式。


3
每条曲线做两个图怎么样?一个图包含收敛前的点集,另一个图包含收敛后的点集。除了线型之外,将这些图设置为相同的风格(颜色、标记等)! :) - Ricardo Cárdenes
谢谢,我会尝试这个。我还有几个图表,其中线条稍后会再次分歧,并循环进入和退出显著性。这意味着我将有一堆绘图命令,但希望我能够解决它。 - Sceeerutinizer
@RicardoCardenes- 我建议你把你的评论作为答案发布,这样它就可以被投票/接受了。这是正确的做法 :-) - David Robinson
你可以大量自动化它。请看我的回答。 - Ricardo Cárdenes
@DavidRobinson:我知道,我知道,我不是因为评论而得到了+2k的奖励。只是有时候我觉得我的评论不值得回答 :) - Ricardo Cárdenes
哈哈,“这是正确的做法”是指你的答案是正确的,应该成为官方答案,而不是说发布答案是正确的方式。(如果我们要比较一下,你的+2k只比我的+2k稍微少一点 :-)) - David Robinson
2个回答

16

编辑:我已经打开并离开了,所以没有注意到@Ricardo的答案。因为matplotlib会将所有内容转换为numpy数组,所以有更有效的方法来完成此操作。

例如:

只需绘制两条不同的线,一条虚线样式,另一条实线样式。

例如:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y1 = 2 * x
y2 = 3 * x

xthresh = 4.5
diff = np.abs(y1 - y2)
below = diff < xthresh
above = diff >= xthresh

# Plot lines below threshold as dotted...
plt.plot(x[below], y1[below], 'b--')
plt.plot(x[below], y2[below], 'g--')

# Plot lines above threshold as solid...
plt.plot(x[above], y1[above], 'b-')
plt.plot(x[above], y2[above], 'g-')

plt.show()

enter image description here

对于循环的情况,请使用屏蔽数组:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y1 = 2 * np.cos(x)
y2 = 3 * np.sin(x)

xthresh = 2.0
diff = np.abs(y1 - y2)
below = diff < xthresh
above = diff >= xthresh

# Plot lines below threshold as dotted...
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y1), 'b--')
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y2), 'g--')

# Plot lines above threshold as solid...
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y1), 'b-')
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y2), 'g-')

plt.show()

enter image description here


本来想着那样做,但最终决定用复杂的方式完成 :D。非常好 :) - Ricardo Cárdenes
https://dev59.com/MYXca4cB1Zd3GeqPIG1Y - Ohm
你好,您能解释一下 plt.plot(x[below], y1[below], 'b--') 这行代码的作用吗? - Ohm
1
@Ohm - 它使用numpy的布尔索引(below是一个布尔数组,例如 [True, True, False, False, True])仅选择 diff < xthresh 的区域在 xy 中。例如,如果 x = np.arange(10),并且我们执行 print x[x < 5],我们会得到 [0, 1, 2, 3, 4]。但是,这假设我们有一条具有许多采样点的线。如果你有 x = array([0, 1]) 并且你做了 x[x < 0.5],你只会得到 0,而不是 [0, 0.499999]。它只选择满足给定条件的离散点,而不是插值。 - Joe Kington
1
@Ohm - 是的,但你需要使用掩码数组。这是一个快速的例子:https://gist.github.com/joferkington/3ca60b0b05b7310f09e8 - Joe Kington
显示剩余2条评论

3
假设你的数据存储在NumPy数组dataset1和dataset2中,且你已经将threshold定义为显著性水平。
def group(data):
    """Assumes that len(data) > 0"""
    prev = 0
    index = 1
    value = data[0]

    while (index < len(data)):
        if data[index] != value:
            yield (value, prev, index)

            value = not value
            prev = index
        index += 1

    yield (value, prev, index)

diff = np.abs(dataset1 - dataset2)
for significant, start, end in group(diff < threshold):
   # Plot data from dataset1[start:end] and dataset2[start:end]
   # Use the value in "significant" (True/False) to figure out
   # The style

我认为使用itertools中的某些东西可以更简短地完成,但我想这已经足够好了:P - Ricardo Cárdenes

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