Plotly R实现:按标准差为正态分布数据直方图着色
为正态分布直方图按标准差区间着色的实现方案
我来帮你搞定这个按标准差区间给直方图着色的需求!下面是一个基于NumPy和Matplotlib的完整可运行方案,每一步都做了详细注释,方便你理解:
import numpy as np import matplotlib.pyplot as plt # 1. 生成正态分布样本数据(也可以替换成你自己的数据集) np.random.seed(42) # 设置随机种子保证结果可复现 data = np.random.normal(loc=0, scale=1, size=10000) # 均值0,标准差1,10000个样本 # 2. 计算数据的均值和标准差,作为区间划分的依据 mean = np.mean(data) std_dev = np.std(data) # 3. 定义各个标准差区间的边界 sd1_low = mean - std_dev sd1_high = mean + std_dev sd2_low = mean - 2*std_dev sd2_high = mean + 2*std_dev sd3_low = mean - 3*std_dev sd3_high = mean + 3*std_dev # 4. 绘制直方图,同时获取柱子的关键信息(区间边界、高度、补丁对象) n, bins, patches = plt.hist(data, bins=30, edgecolor='white') # 5. 遍历每个柱子,根据所属区间分配对应颜色 for bin_left, bin_right, patch in zip(bins[:-1], bins[1:], patches): # 取柱子的中心位置判断所属区间(也可以用左右边界,效果差异不大) bin_center = (bin_left + bin_right) / 2 if sd1_low <= bin_center <= sd1_high: patch.set_facecolor('#1f77b4') # 1SD内:蓝色 elif sd2_low <= bin_center <= sd2_high: patch.set_facecolor('#2ca02c') # 1-2SD区间:绿色 elif sd3_low <= bin_center <= sd3_high: patch.set_facecolor('#ff7f0e') # 2-3SD区间:橙色 else: patch.set_facecolor('#d62728') # 超出3SD:红色(可选补充) # 6. 添加图表标注和自定义图例 plt.title('Normal Distribution Histogram Colored by SD Intervals') plt.xlabel('Value') plt.ylabel('Frequency') # 手动创建图例(因为柱子是逐个上色的,Matplotlib无法自动生成对应区间的图例) from matplotlib.patches import Patch legend_elements = [ Patch(facecolor='#1f77b4', label='Within 1 SD'), Patch(facecolor='#2ca02c', label='1-2 SD'), Patch(facecolor='#ff7f0e', label='2-3 SD'), Patch(facecolor='#d62728', label='Beyond 3 SD') ] plt.legend(handles=legend_elements) # 显示最终图表 plt.show()
关键逻辑说明:
- 区间划分:通过数据的均值和标准差计算出1/2/3倍标准差的边界,这是着色的核心依据。
- 柱子着色:遍历每个直方图柱子,通过柱子中心位置判断其所属区间,再设置对应填充色。
- 图例补充:由于直方图的颜色是逐个柱子设置的,无法自动生成区间图例,所以手动创建图例元素来明确颜色对应的区间范围。
如果你的数据不是标准正态分布,只需要替换data变量为你自己的数据集即可,核心着色逻辑完全通用。
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

