如何绘制每10个值区间使用不同颜色的直方图?
解决方案:按10值区间设置彩色直方图
问题分析
你之前用list(range(100))作为bins,会生成99个宽度为1的细碎区间,和目标效果不符。要实现每10个值的区间用不同颜色,需要调整bins的分组逻辑,同时为每个区间单独设置颜色。
步骤1:调整bins分组
把bins设置为间隔10的序列,比如0-10、10-20……90-100,每个区间覆盖10个值。如果你的数据里有超过100的数值(比如示例中的500),可以选择过滤掉这些值,或者把bins范围扩展到最大数值以上。
步骤2:为每个区间设置不同颜色
绘制直方图后,遍历每个bar的patch对象分配不同颜色;也可以直接在plt.hist中传入自定义颜色列表。
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 你的原始数据 y = [500, 477, 455, 434, 415, 396, 378, 361, 344, 328, 314, 299, 286, 273, 260, 248, 237, 226, 216, 206, 197, 188, 179, 171, 163, 156, 149, 142, 135, 129, 123, 118, 112, 107, 102, 98, 93, 89, 85, 81, 77, 74, 70, 67, 64, 61, 58, 56, 53, 51, 48, 46, 44, 42, 40, 38, 36, 35, 33, 32, 30, 29, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 15, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5] # 过滤掉大于100的值(如果需要保留,可跳过这步并扩展bins范围) filtered_y = [val for val in y if val <= 100] # 设置每10个值一个区间的bins bins = np.arange(0, 101, 10) # 绘制直方图,获取每个bar的patch对象 n, bins, patches = plt.hist(filtered_y, bins=bins, edgecolor='black') # 为每个区间分配不同颜色(使用viridis渐变配色) colors = plt.cm.viridis(np.linspace(0, 1, len(patches))) for patch, color in zip(patches, colors): patch.set_facecolor(color) # 添加图表元素 plt.xlabel('数值区间') plt.ylabel('频数') plt.title('每10值区间分组的彩色直方图') plt.grid(axis='y', alpha=0.75) plt.show()
扩展说明
- 如果要保留大于100的值,只需把
bins改为np.arange(0, max(y)+10, 10),所有数据都会被分到对应的10值区间中。 - 可以替换
plt.cm.viridis为其他配色方案,比如plt.cm.tab10(离散配色更适合区分独立区间)。
内容的提问来源于stack exchange,提问作者Siddeshwar Raghavan
相关产品推荐
相关产品推荐

