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
    评论
### 回答1: 在 Python 中,可以使用 Pandas 库中的 groupby 函数对数据进行分组。然后可以使用 Matplotlib 库进行画图。 例如,假设有一个 DataFrame df,想要按照 'A' 列进行分组,并在每组中绘制 'B' 列的直方图: ``` import pandas as pd import matplotlib.pyplot as plt # 分组 grouped = df.groupby('A') # 绘图 for name, group in grouped: plt.hist(group['B']) plt.title(name) plt.show() ``` 如果想要将所有组的直方图放在一张图上,可以使用 subplots 函数: ``` fig, ax = plt.subplots() for name, group in grouped: ax.hist(group['B'], alpha=0.5, label=name) ax.legend() plt.show() ``` 这仅是分组画图的简单示例,在实际应用中可能会有更复杂的需求。 ### 回答2: 在Python中,我们可以使用groupby函数进行分组,然后使用相应的绘图库画出图形。首我们需要导入相关的库,例如pandas用于数据处理,matplotlib用于绘图。 假设我们有一组数据,包含了不同国家的年度GDP数据,我们想要根据国家进行分组,然后绘制每个国家的年度GDP趋势图。我们可以使用pandas读取数据集,并使用groupby函数按照国家名称进行分组: ```python import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('gdp_data.csv') # 读取数据集 grouped = df.groupby(['Country']) # 按照国家进行分组 ``` 接下来,我们可以遍历分组后的数据,并在每次循环中绘制当前国家的年度GDP趋势图: ```python for name, group in grouped: plt.plot(group['Year'], group['GDP'], label=name) # 绘制趋势图 plt.legend() # 添加图例 plt.xlabel('Year') # 添加x轴标签 plt.ylabel('GDP') # 添加y轴标签 plt.title('Annual GDP by Country') # 添加图表标题 plt.show() # 显示图形 ``` 通过以上代码,我们可以得到一组包含所有分组结果的图形。这种方法在实现分组并绘图时非常方便,有助于我们更好地了解和分析数据所呈现的趋势和特征。同时,我们还可以通过调整不同的参数和样式,使得图形更加美观和易于理解。 ### 回答3: 在Python中,groupby是一个非常有用的函数,可以将数据按照某个条件进行分组,这样便于我们进行数据统计和分析。在分组后,我们可以使用matplotlib或seaborn等数据可视化工具,将分组数据进行绘图,更加直观地展示数据分布和趋势。 举个例子,我们有一份销售数据,包括日期、销售额和销售额对应的商品类别。我们可以使用groupby函数按照商品类别进行分组,然后计算每个类别的销售额总和,最后将结果绘制成条形图。具体步骤如下: 1.导入所需模块 ```python import pandas as pd import matplotlib.pyplot as plt ``` 2.读入数据 ```python sales_data = pd.read_csv("sales_data.csv") ``` 3.按照商品类别进行分组,并计算销售额总和 ```python grouped_sales_data = sales_data.groupby("category")["sales"].sum() ``` 4.绘制条形图 ```python plt.bar(grouped_sales_data.index, grouped_sales_data.values) plt.title("Total Sales by Category") plt.xlabel("Category") plt.ylabel("Sales") plt.show() ``` 运行以上代码后,就会生成一张按照商品类别分组后的销售额条形图,用于直观地展示不同商品类别的销售额总和。如果我们想要更进一步,可以使用seaborn等工具绘制多维度的数据可视化图形,比如按照商品类别和时间维度生成销售额热力图,更加全面地呈现数据分布和趋势。 总之,Python中的groupby函数和数据可视化工具为我们进行数据分析和展示提供了非常有力的支持,同时也为我们的工作带来了更高效和更直观的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值