Python pandas groupby后如何在同一张画布绘制多条折线而非独立图表
解决pandas分组后多折线同图展示的问题
问题根因
groupby对象直接调用plot方法时,默认会为每个分组单独创建独立的绘图实例,因此会输出3张独立图表。
修复代码
方案1:基于matplotlib原生实现
import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({ 'A': ['aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa'], 'B': ['bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb'], 'DC': ['L','L','L','L','Q','Q','Q','Q','ZL','ZL','ZL','ZL'], 'score' : [0.1,0.2,0.3,0.4,0.11,0.21,0.31,0.39,0.1,0.22,0.3,0.42], 'max_sel' : [2.0,3.3,6.0,7.1,3.1,4.0,8.0,8.9,1.2,3.0,5.0,6.6] }) # 提前创建公共的绘图轴对象 fig, ax = plt.subplots(figsize=(7,4)) # 遍历所有分组,指定在同一个ax上绘图 for (a_val, b_val, dc_val), group_df in df.groupby(["A","B","DC"]): group_df.plot( ax=ax, x="score", y="max_sel", label=f"{a_val}_{b_val}_{dc_val}", xlabel="score", ylabel="max_sel" ) plt.show()
方案2:基于seaborn简化实现
如果可以使用seaborn库,代码会更简洁:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns df = pd.DataFrame({ 'A': ['aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa'], 'B': ['bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb','bbb'], 'DC': ['L','L','L','L','Q','Q','Q','Q','ZL','ZL','ZL','ZL'], 'score' : [0.1,0.2,0.3,0.4,0.11,0.21,0.31,0.39,0.1,0.22,0.3,0.42], 'max_sel' : [2.0,3.3,6.0,7.1,3.1,4.0,8.0,8.9,1.2,3.0,5.0,6.6] }) # 生成分组标签列 df["group_name"] = df["A"] + "_" + df["B"] + "_" + df["DC"] # 直接绘图,hue参数按分组区分折线 sns.lineplot(data=df, x="score", y="max_sel", hue="group_name") plt.xlabel("score") plt.ylabel("max_sel") plt.show()
内容的提问来源于stack exchange,提问作者pytonnan
相关产品推荐
相关产品推荐

