如何将分箱条形图与折线图合并绘制在同一图表中?
如何将分箱条形图与折线图合并到同一图表中?
问题描述
需要在同一图表中展示两个数据集:一个用分箱条形图呈现,另一个用折线图呈现。单独绘制两种图表均正常,但合并时出现X轴错位,且无法移除分箱标签。
单独绘制分箱条形图的代码:
tobar = pd.melt(pd.DataFrame(np.random.randn(1000).cumsum())) tobar["bins"] = pd.qcut(tobar.index, 20) bp = sns.barplot(data=tobar, x="bins", y="value")
单独绘制折线图的代码:
toline = pd.melt(pd.DataFrame(np.random.randn(1000).cumsum())) lp = sns.lineplot(data=toline, x=toline.index, y="value")
合并尝试的代码(X轴混乱):
fig, ax = plt.subplots() ax2 = ax.twinx() bp = sns.barplot(data=tobar, x="bins", y="value", ax=ax) lp = sns.lineplot(data=toline, x=toline.index, y="value", ax=ax2) bp.set(xlabel=None)
解决方案
问题核心是条形图X轴为分类类型(分箱区间),折线图X轴为连续索引,两者轴类型不匹配导致错位;同时移除标签的方式不正确。以下是修正后的实现:
步骤1:预处理数据,统一X轴映射
先对两个数据集按分箱做聚合,确保每个分箱对应一个数据点,同时用连续的位置索引替代分类分箱作为X轴:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 生成并处理条形图数据:按分箱计算均值(可替换为中位数等统计量) tobar = pd.melt(pd.DataFrame(np.random.randn(1000).cumsum())) tobar["bins"] = pd.qcut(tobar.index, 20) bar_data = tobar.groupby("bins")["value"].mean().reset_index() # 生成并处理折线图数据:按分箱取区间末尾值(可根据需求替换为均值/中位数) toline = pd.melt(pd.DataFrame(np.random.randn(1000).cumsum())) toline["bins"] = pd.qcut(toline.index, 20) line_data = toline.groupby("bins")["value"].last().reset_index()
步骤2:对齐绘制并移除分箱标签
用连续位置索引作为X轴,确保两个图表对齐,同时通过set_xticks和set_xticklabels移除分箱标签:
fig, ax = plt.subplots(figsize=(12, 6)) # 绘制分箱条形图,X轴用0-19的连续位置 bp = sns.barplot(data=bar_data, x=np.arange(len(bar_data)), y="value", ax=ax) # 双Y轴绘制折线图,X轴与条形图完全对齐 ax2 = ax.twinx() lp = sns.lineplot(data=line_data, x=np.arange(len(line_data)), y="value", ax=ax2, color="#ff3333", marker="o") # 彻底移除分箱的X轴标签和刻度 ax.set_xticks([]) ax.set_xticklabels([]) # 设置轴标签与标题 ax.set_ylabel("条形图数值") ax2.set_ylabel("折线图数值") plt.title("分箱条形图与折线图合并展示") plt.tight_layout() plt.show()
关键说明
- 统一X轴为连续位置索引,解决分类轴与连续轴的错位问题
- 对折线图数据按分箱聚合,确保每个柱子对应一个折线数据点
- 使用
ax.set_xticks([])和ax.set_xticklabels([])彻底清除分箱标签 - 双Y轴(
twinx)适配两个数据集可能存在的数值范围差异
内容的提问来源于stack exchange,提问作者Whitehot
相关产品推荐
相关产品推荐

