I'm graphing some data (two lines) and I'd like to change the line style for the portions of the lines where the difference between them is statistically significant. So, in the below image (now a link b/c anti-spam policies don't allow me to post an image) I'd like the lines to look different (i.e. dashed perhaps) up until they start converging at about 35 on the x axis.
我正在绘制一些数据(两行)的图形,我想要更改这两行之间的差异具有统计学意义的部分的行样式。因此,在下面的图片中(现在链接b/c反垃圾邮件策略不允许我发布图片),我希望这些线条看起来不同(比如虚线),直到它们开始在x轴上汇聚到35处。
线路图
Is there a way to do this easily? I have the values for the x axis where the differences are significant, I'm just not clear how to change line styles at certain x-axis locations.
有什么方法可以轻松做到这一点吗?我有x轴的值它们之间的差异很大,我只是不清楚如何在特定的x轴位置改变线条样式。
2 个解决方案
#1
15
Edit: I'd had this open and left, so I didn't notice @Ricardo's answer. Because matplotlib will convert things to numpy arrays regardless, there are more efficient ways to do it.
编辑:我把这个打开然后离开了,所以我没有注意到@Ricardo的答案。因为matplotlib将把东西转换成numpy数组,所以有更有效的方法。
As an example:
作为一个例子:
Just plot two different lines, one with a dashed linestyle and another with a solid linestyle.
画两条不同的线,一条是虚线,另一条是实线。
E.g.
如。
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()
For the case where they're cyclic, use masked arrays:
对于循环的情况,使用掩蔽数组:
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()
#2
3
Let's say that your data is on NumPy arrays dataset1
and dataset2
and you've defined threshold
as your significance
假设您的数据位于NumPy array dataset1和dataset2上,并且您已经将阈值定义为显著性
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
#1
15
Edit: I'd had this open and left, so I didn't notice @Ricardo's answer. Because matplotlib will convert things to numpy arrays regardless, there are more efficient ways to do it.
编辑:我把这个打开然后离开了,所以我没有注意到@Ricardo的答案。因为matplotlib将把东西转换成numpy数组,所以有更有效的方法。
As an example:
作为一个例子:
Just plot two different lines, one with a dashed linestyle and another with a solid linestyle.
画两条不同的线,一条是虚线,另一条是实线。
E.g.
如。
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()
For the case where they're cyclic, use masked arrays:
对于循环的情况,使用掩蔽数组:
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()
#2
3
Let's say that your data is on NumPy arrays dataset1
and dataset2
and you've defined threshold
as your significance
假设您的数据位于NumPy array dataset1和dataset2上,并且您已经将阈值定义为显著性
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