matplotlib 根据数据更改线图的颜色

9gm1akwq  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(121)

是否有方法可以使用pyplot根据数据值更改线图的颜色?例如,当数据为负时为红线,当数据为正时为黑线。
我试着把数据分成两组,分别绘制,但可能有更好的方法。

svgewumm

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()

f3temu5u

f3temu5u2#

您可以有条件地在axes对象中绘制数据,使用类似where的语法(如果您习惯于Pandas之类的语法)。

ax.plot(x[f(x)>=0], f(x)[f(x)>=0], 'g')
ax.plot(x[f(x)<0],  f(x)[f(x)<0],  'r')

从技术上讲,它将数据分为两组并绘制,但它相当紧凑和漂亮。

4ngedf3f

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)

ego6inou

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()

相关问题