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

如何基于幅值为Matplotlib绘制的vlines设置不同颜色

实现Matplotlib垂直折线的正负值颜色区分

需求:把Matplotlib绘制的蓝色垂直折线(vlines)修改为:负值(<0)取绝对值后用与正值不同的颜色显示,正值保持原有颜色,仅展示幅值信息。

修改思路

将数据拆分为正值和负值两部分分别处理:

  • 筛选出正值的索引和对应数值,用原颜色(如蓝色)绘制
  • 筛选出负值的索引,对数值取绝对值后用另一种颜色(如红色)绘制

完整可运行代码

import numpy as np
import random
import matplotlib.pyplot as plt

# 生成peakmzs数据
peakmzs = np.array([random.uniform(506, 2000) for i in range(2080)])
peakmzs = peakmzs[peakmzs.argsort()[::1]]

# 生成带有正负值的shp_values数据
shp_values = np.zeros_like(peakmzs)
b = np.where((peakmzs > 1500) & (peakmzs < 1540))[0]
b_ = np.random.randint(1500, 1540, 10)
shp_values[b] = [random.uniform(-0.003, 0.002) for i in range(len(b))]
shp_values[b_] = 0 

b = np.where((peakmzs > 700) & (peakmzs < 820))[0]
shp_values[b] = [random.uniform(-0.004, 0.002) for i in range(len(b))]
b_ = np.random.randint(700, 820, 70)
shp_values[b_] = 0

# 处理正负值并绘制vlines
max_amp = np.abs(shp_values).max()  # 取所有幅值的最大值作为统一顶部基准

# 绘制正值的垂直折线,颜色用蓝色
pos_idx = shp_values > 0
plt.vlines(peakmzs[pos_idx], 0, shp_values[pos_idx], color='blue')

# 绘制负值的垂直折线,取绝对值后用红色
neg_idx = shp_values < 0
plt.vlines(peakmzs[neg_idx], 0, np.abs(shp_values[neg_idx]), color='red')

plt.show()

说明

  • 替换了原代码中plt.plot(shp_values)的折线绘制,改为分颜色处理的垂直折线
  • 通过pos_idx和neg_idx精准筛选正负值数据,负值使用np.abs()转换为幅值
  • 用所有数据的最大幅值作为统一顶部,保证视觉上的一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:45:27