You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将分色调柱状图与次坐标轴单折线图结合

解决方案

要实现分色柱状图展示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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:57:19