如何为具有不同颜色的每一行绘制某个 DataFrame 的切片?

Posted

技术标签:

【中文标题】如何为具有不同颜色的每一行绘制某个 DataFrame 的切片?【英文标题】:How can I plot slice of certain DataFrame for each row with different color? 【发布时间】:2019-08-29 17:35:21 【问题描述】:

我想用不同的颜色为每一行(基于行索引)绘制我的Pandas Dataframe 的某些片段。

我的数据如下所示:

我已经尝试在tutorial 的帮助下找到一种方法,但我做不到 - 可能是因为缺乏技能。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv("D:\SOF10.csv" , header=None)
df.head()

#Slice interested data
C = df.iloc[:, 2::3]

#Plot Temp base on row index colorfully
C.apply(lambda x: plt.scatter(x.index, x, c='g'))
plt.show()

以下是我预期的情节:

我还想知道我是否可以替换图中某处或图旁边图例中包含 480 个值的切片数据的每一行的平均值!计算图例中某处的均值和位移是否可行(如下图),或者在图表中使用小字体替换其自己的数据是否可行?

数据样本: data

【问题讨论】:

尝试删除C.apply(lambda x: plt.scatter(x.index, x, c='g'))中的`c='g'`。 @QuangHoang 嗨,我已经更新了图片,但可以看出这不是我想要的。 那是因为您没有正确切片/处理数据,而不是因为您将如何绘制它。C = df.iloc[:, 2::3]still 保留切片列的索引。因此,绘制的所有系列都共享相同的指数。这就是为什么你会看到所有的点都是交错的,而不是分开的。 @QuangHoang 哦,我明白了,你有什么建议?我该如何解决?有什么补救措施吗? 【参考方案1】:

这给出了没有图例的情节

C = df.iloc[:,2::3].stack().reset_index()
C.columns = ['level_0', 'level_1', 'Temperature']

fig, ax = plt.subplots(1,1)
C.plot('level_0', 'Temperature', 
       ax=ax, kind='scatter', 
       c='level_0', colormap='tab20', 
       colorbar=False, legend=True)
ax.set_xlabel('Cycles')
plt.show()

编辑以反映修改后的问题:

    stack() 将您的(切片)数据框转换为具有索引(行,列)的系列 reset_index() 将上面的双级索引重置为level_0(行),level_1(列)。 set_xlabel 将 x 轴的标签设置为您想要的。

编辑 2:以下生成带有图例的散点图:

CC = df.iloc[:,2::3]

fig, ax = plt.subplots(1,1, figsize=(16,9))
labels = CC.mean(axis=1)

for i in CC.index:
    ax.scatter([i]*len(CC.columns[1:]), CC.iloc[i,1:], label=labels[i])

ax.legend()
ax.set_xlabel('Cycles')
ax.set_ylabel('Temperature')
plt.show()

【讨论】:

输出没有达到我的预期结果,而我想用不同的颜色绘制每一行!请问你再看看输出图片吗? 你确定每行一种颜色还是每列一种颜色? 当然是每一行先生! 我还在帖子中提供了数据样本,您可以绘制它。尽管色彩丰富且 x 轴不是基于 row-indexes 从 0 到 40,但您的回答的结果与我的预期相去甚远 我有点不知道你想要什么。您可以尝试在stack() 之前删除.T,并尝试将plot 中的'idx' 替换为'level_0'。我暂时无法访问 Google Drive。【参考方案2】:

这可能是一个大概的答案。 scatter(c=, cmap= 可用于所需的颜色。

import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import itertools

df = pd.DataFrame('a':[34,22,1,34])
fig, subplot_axes = plt.subplots(1, 1, figsize=(20, 10))  # width, height

colors = ['red','green','blue','purple']
cmap=matplotlib.colors.ListedColormap(colors)

for col in df.columns:
    subplot_axes.scatter(df.index, df[col].values, c=df.index, cmap=cmap, alpha=.9)

【讨论】:

这是按列着色。问题希望标记根据它们在列(索引)中的序号位置进行着色。 您好,感谢您的回答问题是关于访问所需数据或根据行索引按行绘制它们 更新为使用 df.index 中的颜色。 @Quan Hoang 提供了更简洁的答案。 您的答案输出与我的预期结果完全不同,因为它显示了彩色列! 我刚刚更新了预期的结果图片,希望它能更好地转移我的心态!

以上是关于如何为具有不同颜色的每一行绘制某个 DataFrame 的切片?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何为一列中具有重复值的每组行选择一行?

如何为网格面板中的每一行创建一个表单:extjs

Plotly:如何为每个变量创建具有不同样式和颜色的线图?

如何为熊猫数据框的每一列应用具有不同时间常数的一阶过滤器?

如何为 T-SQL 选择中的每一行生成一个随机数?

如何为不同的组使用不同的颜色创建散点图? [复制]