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

如何绘制颜色随Y轴数值变化的单条形图?

实现颜色随Y轴数值变化的单条形图

核心思路

把目标单条形拆分为多个极小的分段,每个分段对应一组振幅数据,通过颜色映射将振幅数值转换为对应颜色,最终堆叠形成颜色渐变的单条形效果。以下是基于Python matplotlib库的实现方案:

代码实现(以Y轴对应频率为例)

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np

# 1. 处理输入数据:将字符串列表转为数值数组
amp_str_list = ['0.2', '1.2432', '0.8611', '0.95', '1.3', '0.72', '1.1', '0.6']
amps = np.array([float(val) for val in amp_str_list])

# 2. 定义频率序列(可替换为实际频率值,比如np.linspace(50, 400, len(amps)))
freqs = np.arange(len(amps))

# 3. 设置颜色映射规则:归一化振幅值,匹配渐变色彩
norm = mcolors.Normalize(vmin=amps.min(), vmax=amps.max())
cmap = plt.get_cmap('viridis')  # 可替换为'plasma'/'coolwarm'等渐变配色

# 4. 创建画布并绘制分段条形
fig, ax = plt.subplots(figsize=(3, 6))
bar_width = 0.8

# 循环绘制每个对应频率的小分段,堆叠形成完整条形
for y_pos, amp_val in zip(freqs, amps):
    segment_color = cmap(norm(amp_val))
    ax.bar(0, 1, bottom=y_pos, width=bar_width, color=segment_color)

# 5. 配置图表标签与刻度
ax.set_xlabel('振幅')
ax.set_ylabel('频率')
ax.set_yticks(freqs)
ax.set_yticklabels([f'{f}' for f in freqs])  # 替换为实际频率的显示文本

# 6. 添加颜色条,关联颜色与振幅值
color_bar = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
color_bar.set_array([])
fig.colorbar(color_bar, ax=ax, orientation='horizontal', pad=0.1, label='振幅数值')

plt.tight_layout()
plt.show()

变体:Y轴对应振幅的情况

如果需要Y轴直接表示振幅,颜色随振幅数值变化,可使用以下代码:

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np

amp_str_list = ['0.2', '1.2432', '0.8611', '0.95', '1.3', '0.72', '1.1', '0.6']
amps = np.array([float(val) for val in amp_str_list])

norm = mcolors.Normalize(vmin=amps.min(), vmax=amps.max())
cmap = plt.get_cmap('viridis')
colors = cmap(norm(amps))

# 生成振幅分段点
y_segments = np.linspace(0, amps.max(), len(amps))

fig, ax = plt.subplots(figsize=(3, 6))
# 绘制基础空白条形
ax.bar(0, amps.max(), width=1, color='white')

# 填充每个振幅区间的颜色
for i in range(len(amps)-1):
    ax.fill_between([-0.5, 0.5], y_segments[i], y_segments[i+1], color=colors[i])

ax.set_ylabel('振幅')
ax.set_xticks([0])
ax.set_xticklabels(['频率曲线'])

color_bar = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
color_bar.set_array([])
fig.colorbar(color_bar, ax=ax, label='振幅数值')

plt.tight_layout()
plt.show()

关键说明

  • 颜色映射可以根据需求替换为不同配色方案,比如coolwarm适合区分高低值,viridis适合友好的视觉呈现。
  • 若使用实际频率值,只需将freqs变量替换为你的频率数组即可,无需修改核心绘制逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:43:20