如何绘制颜色随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
相关产品推荐
相关产品推荐

