Matplotlib如何根据列表数值为各线段设置区分度高的颜色
实现方案
plt.plot() 一次性生成的整条折线不支持单独给某一段设置颜色,只要把相邻两点拆成独立线段逐段绘制,再把对应数值映射到调色板取色就能实现需求,完整可运行代码如下:
import matplotlib.pyplot as plt from matplotlib import cm from matplotlib.colors import Normalize l = [8, 5, 7, 10, 3, 3, 7, 5, 2, 6] x = list(range(len(l))) # 初始化颜色映射:数值范围对齐列表l的最值,选用区分度高的离散调色板 norm = Normalize(vmin=min(l), vmax=max(l)) cmap = cm.get_cmap('tab10') # 可替换为Set2、Paired、viridis等其他调色板 # 逐段画线段:第i条线段对应l[i]的数值配色 for i in range(len(l) - 1): plt.plot( [x[i], x[i+1]], [l[i], l[i+1]], color=cmap(norm(l[i])), linewidth=2 ) # 叠加绘制标记点,设置更高层级保证点显示在线段上方 plt.scatter(x, l, marker=".", s=400, c=[cmap(norm(v)) for v in l], zorder=10) plt.show()
说明
- 上述代码默认满足同值同色的规则:相同数值经过归一化和调色板映射后会得到完全一致的颜色,不同数值的颜色区分度足够
- 如果对配色不满意,只需要修改
cm.get_cmap()里的调色板名称即可,matplotlib内置了数十种可选调色板,可以根据自己的需求替换 - 线段粗细、标记点大小都可以通过修改
linewidth、s参数调整,和原有示例的视觉效果对齐
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

