dataframe先分组再画图

要求1:

将一组数据先分组,再分别绘图,即groupby-plot。

df.set_index('Date', inplace=True)
df.groupby('ID')['H'].plot(legend=False)

结果大概:
在这里插入图片描述

结合pandas.DataFrame.plot( )设置参数,对图形优化处理。

先分组然后绘制在一个图上:

```python
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据集
df = pd.read_csv('data.csv')

# 根据'dataset'列分组,对每组数据绘制直线
gb = df.groupby('dataset')
fig, ax = plt.subplots()
for name, group in gb:
    ax.plot(group['timepoint'], group['signal'], label=name)

ax.legend()
plt.show()

大致样子:(不是自己想要的结果…)
在这里插入图片描述

更新 20220701:
如果想让每组数据分别绘图,想到的办法是先将所有数据的Excel文件按照分组,分别生成不同的文件,然后再绘图。
split Excel file:key code

df_group = df.groupby('FID')
for group in df_group:
    group[1].to_csv('./1/test/{}.csv'.format(str(group[0])) , index=False, encoding='utf-8')

参考资料:https://stackoverflow.com/questions/41494942/pandas-dataframe-groupby-plot

要求2:

对一列数据先分组(按某种标准),然后绘制柱状图
参考:https://zhuanlan.zhihu.com/p/113657235
测试代码:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('1.csv')
df_nan = df[df['v'].isnull()]
df1 = df[abs(df['v'])>=20]#[20,)
df2 = df[(abs(df['v'])>=5) &(abs(df['v'])<20)]#[5,20)
df3 = df[(abs(df['v'])>2) &(abs(df['v'])<5)]#(2,4]
df4 = df[(abs(df['v'])>1) &(abs(df['v'])<=2)]#(1,2]
df5 = df[(abs(df['v'])>=0) &(abs(df['v'])<=1)]#[0,1]
x = [1,2,3,4,5,6]#Determine the number of bars
y = [len(df5)/len(df)*100,len(df4)/len(df)*100,len(df3)/len(df)*100,len(df2)/len(df)*100,len(df1)/len(df)*100,len(df_nan)/len(df)*100]

plt.bar(x, y)
for a,b in zip(x,y):
    plt.text(a,b,'%.2f'%b,ha='center',va='bottom',fontsize=10);
x_label=['[0,1]','(1,2]','(2,4]','[5,20)','[20,)','Nan']
plt.xticks(x, x_label)
plt.ylabel('percentage (%)')
plt.show()

要求3:

按照某列分割成多个dataframe输出:

import os
import pandas as pd

df = pd.read_csv('1.csv')
save_path = './save/'
FID_list = list(df['FID'].drop_duplicates())
for i in FID_list:
    data = df[df['FID'] == i]
    data.to_csv(os.path.join(save_path+str(i)+'.csv'),index=False)
    print(i)
print('done!')

类似ARCGIS 按照某个字段分割数据,转成多个shp文件。
先分割数据再分别绘制图,比较麻烦,也可以直接绘制多张图:

import seaborn as sns
import matplotlib.pyplot as plt

# 加载数据集
df = sns.load_dataset('fmri')

# 绘制多个直线图
g = sns.FacetGrid(data=df, col='dataset', col_wrap=2)

def plot_group(group_id, color, label):
    group = df[df['dataset'] == group_id]
    timepoint = range(0, len(group['timepoint']), len(group['signal']))
    prev_point = 0
    for i, point in enumerate(timepoint[1:]):
        group['signal'][prev_point:point] = group['signal'][prev_point:point].shift(i+1)
        prev_point = point
    ax = sns.lineplot(data=group, x='timepoint', y='signal', color=color, label=label, sort=False)

    return ax

plot_group("s1", 'red', 's1')
plot_group("s2", 'green', 's2')

plt.show()

上述代码中,我们首先使用load_dataset()函数加载Seaborn库中的fmri数据集。然后,使用FacetGrid()函数创建FacetGrid对象,将数据集df和维度’dataset’传入参数中,并指定col_wrap参数的值为2,表示每行绘制两幅图。最后,定义plot_group()函数,该函数接收一个group_id参数和一个label参数,分别指定要绘制的数据组和图例标签。在plot_group()函数中,首先根据group_id参数筛选出对应的数据组,然后使用’shift’函数将初始值为0的连线绘制。最后,使用lineplot()函数绘制直线图,并将分组绘制的图像注入FacetGrid对象g中。

要求4:dataframe先分组,每组数据分别绘制直线:

import seaborn as sns
import matplotlib.pyplot as plt

# 加载数据集
df = sns.load_dataset('fmri')

# 按照'dataset'列分类,绘制多张直线图
sns.relplot(data=df, x='timepoint', y='signal', hue='event', col='dataset', kind='line', col_wrap=2)

plt.show()

大致效果(还需设置参数,优化一下):
在这里插入图片描述
关键代码:g = sns.relplot(data=df, x='date', y='dif_min_h', hue='type', col='FID', kind='line', col_wrap=4, height=3,style='type',markers=True,dashes=False)
其他设置参数:g.set_xticklabels(rotation=45,fontsize=9) plt.gcf().subplots_adjust(left=0.05,top=0.91,bottom=0.09) plt.show()

要求5:

分组绘制多个图形,并要求每个子图有多种图形:如折线图+散点图
在这里插入图片描述
比如想把绿色的线,用散点来表示,其他还是折线表示。

import seaborn as sns
import pandas as pd

# 创建数据集
df = pd.DataFrame({
    'x': [1, 2, 3, 4, 5, 6],
    'y': [1, 3, 2, 4, 2, 5],
    'category': ['A', 'B', 'B', 'A', 'A', 'B'],
    'line_value': [2.5, 3.5, 4.5, 1.5, 2.5, 3.5]
})

# 用relplot绘制多个子图
g = sns.relplot(x='x', y='y', data=df, col='category', col_wrap=2)

# 对每个子图添加散点图和直线图
for ax in g.axes.flat:
    category = ax.get_title().split('=')[1].strip()
    filtered_df = df[df['category'] == category]
    sns.lineplot(x='x', y='line_value', data=filtered_df, ax=ax, color='orange')
    sns.scatterplot(x='x', y='y', data=filtered_df, ax=ax)

# 显示图形
g.fig.suptitle('Scatter and Line Plots by Category', y=1.03)
plt.show()

还可以自己设置参数绘制:

import seaborn as sns
import matplotlib.pyplot as plt

# 创建数据
tips = sns.load_dataset("tips")

# 绘制多个子图
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(10, 10))

# 将每个子图分别绘制直线图和散点图
sns.lineplot(x="total_bill", y="tip", hue="sex", data=tips, ax=axs[0][0])
sns.scatterplot(x="total_bill", y="tip", hue="sex", data=tips, ax=axs[0][1])
sns.lineplot(x="total_bill", y="tip", hue="smoker", data=tips, ax=axs[1][0])
sns.scatterplot(x="total_bill", y="tip", hue="smoker", data=tips, ax=axs[1][1])

# 增加标题
axs[0][0].set_title("Line Plot by Sex")
axs[0][1].set_title("Scatter Plot by Sex")
axs[1][0].set_title("Line Plot by Smoker")
axs[1][1].set_title("Scatter Plot by Smoker")

# 显示图形
plt.show()
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值