是否有方法可以使用pyplot根据数据值更改线图的颜色?例如,当数据为负时为红线,当数据为正时为黑线。我试着把数据分成两组,分别绘制,但可能有更好的方法。
pyplot
svgewumm1#
我只需要做两个数据集,并设置正确的掩码。通过使用这种方法,我不会在不同的积极部分之间有线条。
import matplotlib.pyplot as plt import numpy as np signal = 1.2*np.sin(np.linspace(0, 30, 2000)) pos_signal = signal.copy() neg_signal = signal.copy() pos_signal[pos_signal <= 0] = np.nan neg_signal[neg_signal > 0] = np.nan #plotting plt.style.use('fivethirtyeight') plt.plot(pos_signal, color='r') plt.plot(neg_signal, color='b') plt.savefig('pos_neg.png', dpi=200) plt.show()
f3temu5u2#
您可以有条件地在axes对象中绘制数据,使用类似where的语法(如果您习惯于Pandas之类的语法)。
where
ax.plot(x[f(x)>=0], f(x)[f(x)>=0], 'g') ax.plot(x[f(x)<0], f(x)[f(x)<0], 'r')
从技术上讲,它将数据分为两组并绘制,但它相当紧凑和漂亮。
4ngedf3f3#
如果使用散点图,可以为每个点给予不同的颜色:
x = range(1) x = range(10) y = [i - 5 for i in x] c = [i < 0 for i in y] plt.scatter(x, y, c=c, s=80)
ego6inou4#
我无法找到一个干净的解决方案,在stackoverflow上没有消失的线段穿过x轴。按照这种方法计算交叉点处的新x值并更新点数组
import numpy as np import matplotlib.pyplot as plt plt.style.use('ggplot') x = [2, 5] y = [5,-3] x1, x2 = x y1, y2 = y xf = x1 + -y1 * (x2 - x1)/(y2 - y1) xn = [2, xf, 5] yn = [5, 0, -3]
我们得到一个两部分相交的线段。
plt.figure(figsize=(7,6)) plt.plot(xn, yn, 'X:') plt.show()
矢量化这种方法可以通过找到交叉线段,计算交叉点并在x轴的适当索引处更新两个点数组(需要排序)来完成。
x = np.linspace(-np.pi*2, np.pi*2, 40) y = np.cos(x) x1, x2, y1, y2 = np.stack([x[:-1], x[1:], y[:-1], y[1:]])[:,np.diff(y < 0)] xf = x1 + -y1 * (x2 - x1) / (y2 - y1) i = np.searchsorted(x, xf) x0 = np.insert(x, i, xf) y0 = np.insert(y, i, 0)
将更新后的数组绘制为折线图,其中包含非正和非负y坐标的掩码数组。
plt.figure(figsize=(7,6)) plt.plot(np.ma.masked_array(x0, mask=y0 < 0), np.ma.masked_array(y0, mask=y0 < 0), 'o:') plt.plot(np.ma.masked_array(x0, mask=y0 > 0), np.ma.masked_array(y0, mask=y0 > 0), 'o:') plt.show()
用彩色线条绘制原始数据
plt.figure(figsize=(7,6)) plt.plot(np.ma.masked_array(x0, mask=y0 < 0), np.ma.masked_array(y0, mask=y0 < 0), 'g-') plt.plot(np.ma.masked_array(x0, mask=y0 > 0), np.ma.masked_array(y0, mask=y0 > 0), 'r-') plt.plot(np.ma.masked_array(x, mask=y < 0), np.ma.masked_array(y, mask=y < 0), 'g.') plt.plot(np.ma.masked_array(x, mask=y > 0), np.ma.masked_array(y, mask=y > 0), 'r.') plt.show()
4条答案
按热度按时间svgewumm1#
我只需要做两个数据集,并设置正确的掩码。通过使用这种方法,我不会在不同的积极部分之间有线条。
f3temu5u2#
您可以有条件地在axes对象中绘制数据,使用类似
where
的语法(如果您习惯于Pandas之类的语法)。从技术上讲,它将数据分为两组并绘制,但它相当紧凑和漂亮。
4ngedf3f3#
如果使用散点图,可以为每个点给予不同的颜色:
ego6inou4#
我无法找到一个干净的解决方案,在stackoverflow上没有消失的线段穿过x轴。
按照这种方法计算交叉点处的新x值并更新点数组
我们得到一个两部分相交的线段。
矢量化这种方法可以通过找到交叉线段,计算交叉点并在x轴的适当索引处更新两个点数组(需要排序)来完成。
将更新后的数组绘制为折线图,其中包含非正和非负y坐标的掩码数组。
用彩色线条绘制原始数据