You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现条形图条形随数值减小渐隐效果(附Python水平条形图代码优化需求)

动态生成渐变色彩的水平条形图解决方案

嘿,手动硬编码颜色列表确实太不灵活了——咱们来用动态映射数值到渐变色彩的方法,完美实现你要的“数值越大颜色越深、越小越淡(近乎透明)”的效果,而且代码还能自适应数据变化,维护起来超省心!

核心思路

利用Matplotlib的颜色映射(colormap)和归一化工具,把条形的数值大小直接映射到颜色深浅上:

  • 用Normalize将数值范围压缩到0-1区间,方便对应色彩渐变的起点和终点
  • 选择蓝色系的colormap(比如Blues),让数值最大的条形对应最深的蓝色,最小的对应最浅的淡蓝色(近乎透明)
  • 动态生成每个条形的颜色,无需手动写死颜色值

修改后的完整代码

import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import Normalize

# 你的原始数据处理部分
x_state = df_top_states["Percent"].nlargest(10).sort_values(ascending=True).index
y_percent = df_top_states["Percent"].nlargest(10).sort_values(ascending=True).values

plt_size = plt.figure(figsize=(9,6))

# 关键:生成渐变色彩
# 1. 归一化数值到0-1范围
norm = Normalize(vmin=y_percent.min(), vmax=y_percent.max())
# 2. 选择蓝色系的颜色映射(Blues从浅到深,符合需求)
cmap = cm.get_cmap('Blues')
# 3. 为每个数值生成对应的颜色
colors = [cmap(norm(value)) for value in y_percent]

# 绘制水平条形图,传入动态生成的颜色
plt.barh(x_state, y_percent, color=colors)

# 你的原始图表配置部分
plt.title("Top 10 States with the most number of accidents (2016 - 2021)", fontsize=16)
plt.ylabel("State", fontsize=13)
plt.yticks(size=13)
plt.xlabel("% of Total Accidents", fontsize=13)
plt.xticks(size=13)
plt.tight_layout()
plt.show()

细节说明

  • 如果想要更明显的透明效果,可以调整alpha通道,比如把颜色生成改成:
    # 固定蓝色RGB值,让alpha随数值大小变化(数值越小alpha越低)
    colors = [(0.1, 0.3, 0.6, norm(value)) for value in y_percent]
    
    这样最小的数值会呈现近乎完全透明的淡蓝色,最大的则是不透明的深蓝色。
  • Blues是Matplotlib内置的colormap,你也可以换成其他蓝色系(比如Blues_r是反向渐变,但这里我们需要数值大对应深色,所以用默认的Blues就好)
  • 这种方法的优势:不管数据怎么变化(比如换年份、换Top N的数量),颜色都会自动适配,不用手动修改颜色列表

内容的提问来源于stack exchange,提问作者lyubol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:37:43