如何基于幅值为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
相关产品推荐
相关产品推荐

