如何用Python/Matplotlib绘制横轴累计纵轴非累计的2D直方图
横轴为累计分布、纵轴为非累计分布的2D直方图实现方案
可以直接通过Python+Matplotlib实现,核心思路是先对横轴变量做经验累积分布转换,再调用原生2D直方图接口绘制即可。
完整可运行代码
import numpy as np import matplotlib.pyplot as plt # 1. 生成配对随机变量样本 x = np.random.normal(size=1000) y = np.random.normal(size=1000) # 2. 计算x对应的经验累积分布值作为新横轴(无需额外依赖) x_sorted = np.sort(x) x_cdf = np.searchsorted(x_sorted, x) / len(x) # 可选:如果已经安装scipy,也可以用更标准化的ECDF接口计算 # from scipy.stats import ecdf # x_cdf = ecdf(x).cdf.evaluate(x) # 3. 绘制目标2D直方图 plt.figure(figsize=(8, 6)) # 横轴为x的累计分布,纵轴为原始y的非累计分布,bins参数可调整分箱精度 plt.hist2d(x_cdf, y, bins=30, cmap='Blues') # 补充图表标注 plt.xlabel('X的经验累积分布') plt.ylabel('Y的原始取值') plt.colorbar(label='样本计数') plt.show()
实现逻辑说明
- 首先通过排序+位置映射的方式,把原始x的每个取值转换成它在样本中的累计占比,取值范围固定为0~1,完全符合累计分布的横轴要求
- 纵轴保持原始y的取值不变,
hist2d默认就是按y的非累计频次统计计数,刚好匹配需求 - 如果需要调整分箱精度、配色等样式,直接修改
hist2d的bins、cmap等参数即可,和普通2D直方图的参数完全通用
内容的提问来源于stack exchange,提问作者Galen
相关产品推荐
相关产品推荐

