如何用Pandas分组无循环生成带指定标题的散点图
按name分组生成散点图(无显式for循环)
你已经用groupby('name')完成了分组,接下来可以用apply()方法来避免写显式的for循环,自动为每个分组生成对应的散点图。下面是两种可行的方案:
方案1:使用Matplotlib + pandas apply
先看完整代码:
import pandas as pd import matplotlib.pyplot as plt # 创建你提供的DataFrame data = {'name': ['Jason', 'Jason', 'Tina', 'Tina', 'Tina', 'Jason', 'Tina'], 'report_value': [4, 24, 31, 2, 3, 5, 10], 'coverage_id': ['m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7']} df = pd.DataFrame(data) # 定义绘制单组散点图的函数 def plot_single_group(group): plt.figure(figsize=(6,4)) # 设置画布大小可选 plt.scatter(x=group['coverage_id'], y=group['report_value']) # 用分组的name设置标题,iloc[0]取该组第一个name值(整组都是同一个name) plt.title(f"Scatter Plot for {group['name'].iloc[0]}") plt.xlabel('coverage_id') plt.ylabel('report_value') plt.tight_layout() # 自动调整布局避免标签被截断 plt.show() # 对分组后的DataFrame应用绘图函数 df.groupby('name').apply(plot_single_group)
说明:
- 我们先定义了一个负责绘制单个分组散点图的函数
plot_single_group,它会接收每个分组后的子DataFrame作为参数 - 调用
groupby.apply()时,pandas会自动遍历每个分组,把每个子DataFrame传入函数执行,全程不需要手动写for循环 - 每个分组会生成独立的绘图窗口,标题显示对应的人名,x轴是
coverage_id,y轴是report_value
方案2:使用Seaborn(更简洁)
如果你熟悉Seaborn,可以用它的relplot函数一键生成分组子图,代码更简洁:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 创建DataFrame data = {'name': ['Jason', 'Jason', 'Tina', 'Tina', 'Tina', 'Jason', 'Tina'], 'report_value': [4, 24, 31, 2, 3, 5, 10], 'coverage_id': ['m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7']} df = pd.DataFrame(data) # 生成分组散点图 sns.relplot( data=df, x='coverage_id', y='report_value', col='name', # 按name字段分列生成子图 kind='scatter', # 指定绘制散点图 facet_kws={ 'subplot_kws': {'title': lambda ax: f"Scatter Plot for {ax.name}"} } ) plt.tight_layout() plt.show()
说明:
relplot是Seaborn的高阶绘图函数,col='name'会自动按name字段拆分出两个子图(Jason和Tina各一个)- 通过
facet_kws我们可以为每个子图设置对应的标题,直接取子图的name值即可 - 这种方法完全不需要手动处理分组逻辑,代码量更少
内容的提问来源于stack exchange,提问作者Marnix
相关产品推荐
相关产品推荐

