如何创建含多组折线图与独立直方图的组合可视化图表?
实现共享X轴的折线图+直方图组合图表
可以通过Matplotlib的子图布局结合Seaborn快速实现需求,核心是让两个子图共享X轴,分别绘制折线图与直方图,具体实现如下:
1. 准备示例数据
先模拟符合需求的数据集(实际使用时替换为你的真实数据):
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np # 生成折线图数据:变体A/B/C的epsilon随V变化 np.random.seed(42) V_values = np.linspace(0, 10, 50) df_lines = pd.DataFrame({ 'V': np.tile(V_values, 3), 'epsilon': np.concatenate([ V_values**0.5 + np.random.normal(0, 0.2, 50), # 变体A V_values**0.6 + np.random.normal(0, 0.2, 50), # 变体B V_values**0.4 + np.random.normal(0, 0.2, 50) # 变体C ]), 'variant': np.repeat(['A', 'B', 'C'], 50) }) # 生成直方图数据:V的采集点分布 df_hist = pd.DataFrame({ 'V': np.random.choice(V_values, size=2000, p=np.where(V_values > 5, 0.03, 0.017)) })
2. 创建共享X轴的组合图表
# 创建两个子图,共享X轴,设置高度比例(折线图占比更高) fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), sharex=True, gridspec_kw={'height_ratios': [3, 1]}) # 上方子图:绘制各变体的性能折线图 sns.lineplot(data=df_lines, x='V', y='epsilon', hue='variant', ax=ax1) ax1.set_title('各设计变体的性能变化') ax1.set_ylabel('epsilon') ax1.set_xlabel('') # 隐藏X轴标签,避免与下方子图重复 # 下方子图:绘制V值的采集点分布直方图 sns.histplot(data=df_hist, x='V', bins=20, ax=ax2, color='gray') ax2.set_ylabel('采集点数量H') ax2.set_xlabel('V') # 调整子图间距,优化显示效果 plt.tight_layout() plt.show()
关键细节说明
sharex=True:强制两个子图共享X轴,确保刻度完全对齐gridspec_kw:调整上下子图的高度比例,让折线图作为核心展示区更突出- 直方图的
bins参数:可根据X轴数据的粒度调整,保证与折线图的X轴精度匹配
内容的提问来源于stack exchange,提问作者Reid Johnson
相关产品推荐
相关产品推荐

