如何将分色调柱状图与次坐标轴单折线图结合
解决方案
要实现分色柱状图展示ratio,同时在次坐标轴绘制单条折线展示cnt,核心是先对cnt数据按x做聚合处理,确保每个x对应唯一的cnt值,避免因多class行生成多条折线。
步骤与代码示例
假设你的DataFrame结构如下(可替换为真实数据):
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 示例数据 data = { 'x': ['A', 'A', 'B', 'B', 'C', 'C'], 'class': ['X', 'Y', 'X', 'Y', 'X', 'Y'], 'ratio': [0.2, 0.8, 0.5, 0.5, 0.3, 0.7], 'cnt': [100, 100, 150, 150, 200, 200] } df = pd.DataFrame(data)
1. 绘制分色柱状图
用Seaborn的barplot直接按class分色展示ratio:
fig, ax1 = plt.subplots(figsize=(10, 6)) # 分色柱状图:x轴为x,y轴为ratio,按class区分颜色 sns.barplot(data=df, x='x', y='ratio', hue='class', ax=ax1) ax1.set_xlabel('X') ax1.set_ylabel('Ratio')
2. 处理cnt数据并绘制单折线
由于每个x对应多个class行,需先按x聚合cnt(根据需求选择first()、sum()或其他聚合方式),再在次坐标轴绘制折线:
# 创建次坐标轴 ax2 = ax1.twinx() # 按x聚合cnt:若每个x的cnt在不同class中值相同,用first();若需求和用sum() cnt_agg = df.groupby('x')['cnt'].first().reset_index() # 绘制单条折线 ax2.plot(cnt_agg['x'], cnt_agg['cnt'], color='#2c3e50', marker='o', linewidth=2, label='Count') ax2.set_ylabel('Count')
3. 合并图例并调整样式
# 合并两个轴的图例 handles1, labels1 = ax1.get_legend_handles_labels() handles2, labels2 = ax2.get_legend_handles_labels() ax1.legend(handles1 + handles2, labels1 + labels2, loc='upper left') plt.title('Ratio Distribution with Count Trend') plt.tight_layout() plt.show()
问题原因说明
你之前的代码生成多条折线,大概率是直接用原始df绘制cnt折线——由于每个x对应多个class行,Matplotlib/Seaborn会为每个class单独绘制一条折线。通过按x聚合cnt,确保每个x仅对应一个数据点,就能得到单条折线的效果。
内容的提问来源于stack exchange,提问作者Julian Martin Del Fiore
相关产品推荐
相关产品推荐

