matplotlib 颜色线按“值”

Eri*_*obs 5 python plot colors matplotlib pandas

之前已经问过这个问题的各种版本,我不确定我是否应该在其中一个线程上提出我的问题或开始一个新线程。开始:

我有一个 Pandas 数据框,其中有一列(例如:速度)我正在尝试绘制,然后是另一列(例如:活动),目前为真/假。根据 active 的值,我想为线图着色。

该线程似乎是“正确”的解决方案,但我遇到了一个问题: seaborn 或 matplotlib 折线图,线条颜色取决于变量The OP 和我正在尝试实现相同的目标:

连续的多色线

这是一个破碎的情节/复制器:

Values=[3,4,6, 6,5,4, 3,2,3, 4,5,6]
Colors=['red','red', 'red', 'blue','blue','blue', 'red', 'red', 'red', 'blue', 'blue', 'blue']
myf = pd.DataFrame({'speed': Values, 'colors': Colors})

grouped = myf.groupby('colors')
fig, ax = plt.subplots(1)

for key, group in grouped:
   group.plot(ax=ax, y="speed", label=key, color=key)
Run Code Online (Sandbox Code Playgroud)

结果图有两个问题:不仅改变的颜色线没有“连接”,而且颜色本身连接“跨”端点:

行不连续

我想看到的是从红色到蓝色的变化,然后看起来就像是一条连续的线。

第三个变量的颜色线 - Python似乎做了正确的事情,但我没有处理“线性”颜色数据。我基本上是在列中分配一组线条颜色。我可以轻松地将颜色列的值设置为数字:

Colors=['1','1', '1', '2','2'...]
Run Code Online (Sandbox Code Playgroud)

如果这使得生成所需的图更容易。

第一个帖子里有一条评论:

如果你在颜色改变时重复点,你可以这样做,我已经修改了答案

但我基本上是复制并粘贴了答案,所以我不确定该评论是否完全准确。

小智 3

我试了一下。根据您链接的另一个问题中的评论,我想到了这一点。我确实必须开始使用 matplotlib,但无法在 pandas 本身中做到这一点。一旦我将数据帧转换为列表,它的代码与mpl page中的代码几乎相同。

我创建的数据框与您的类似:

vals=[3,4,6, 6,5,4, 3,2,3, 4,5,6]
colors=['red' if x < 5 else 'blue' for x in vals]
df = pd.DataFrame({'speed': vals, 'danger': colors})
Run Code Online (Sandbox Code Playgroud)

将 vals 和索引转换为列表

x = df.index.tolist()
y = df['speed'].tolist()
z = np.array(list(y))
Run Code Online (Sandbox Code Playgroud)

将值和索引分解为点,然后用它们创建线段。

points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
Run Code Online (Sandbox Code Playgroud)

根据创建数据帧时使用的标准创建颜色图。就我而言,速度小于 5 为红色,其余为蓝色。

cmap = ListedColormap(['r', 'b'])
norm = BoundaryNorm([0, 4, 10], cmap.N)
Run Code Online (Sandbox Code Playgroud)

创建线段并相应地分配颜色

lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(z)
Run Code Online (Sandbox Code Playgroud)

阴谋 !

fig = plt.figure()
plt.gca().add_collection(lc)
plt.xlim(min(x), max(x))
plt.ylim(0, 10)
Run Code Online (Sandbox Code Playgroud)

这是输出:

在此输入图像描述

注意:在当前代码中,线段的颜色取决于起点。但希望这能给你一个想法。

我对在这里回答问题还是个新手。如果我需要添加/删除一些细节,请告诉我。谢谢!