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

Matplotlib散点图如何根据数值优雅设置离散自定义颜色

散点图按数值设置离散分段颜色的优雅实现

你目前用循环+条件判断生成颜色列表的写法可以正常运行,但并不是最简便、可维护性最高的方案,以下几种写法更简洁,也更符合Python数据可视化的常规实践。

你给出的默认连续色带示例代码和效果如下:

import numpy as np
import matplotlib.pyplot as plt
x=np.arange(100)
plt.scatter(x,x,c=x,cmap='jet')
plt.show()

默认jet连续色带效果

你的需求是按数值区间给点分配固定颜色(注:你描述里写<40和40-60都为绿色,仅>60为红色,但示例颜色列表出现了蓝色,以下代码按<40蓝、40-60绿、>60红的三段配色写,如果需要两段绿直接调整颜色列表即可),循环实现的效果如下:
循环实现的分段配色效果


方案1:使用matplotlib内置分段映射工具(最推荐)

这是扩展性最好的方案,不需要手动遍历每个点做判断,直接用官方提供的离散色映射工具即可:

from matplotlib.colors import ListedColormap, BoundaryNorm

# 定义分段边界:边界数 = 颜色段数 + 1
bounds = [0, 40, 60, 99]
# 定义每个区间对应的颜色
colors = ["blue", "green", "red"]
# 生成自定义色带和归一化规则
cmap = ListedColormap(colors)
norm = BoundaryNorm(bounds, cmap.N)

plt.scatter(x, x, c=x, cmap=cmap, norm=norm)
plt.show()

这种写法的优势非常明显:后续不管是调整分段阈值、增减颜色区间,都只需要修改bounds和colors两个列表,哪怕分10个以上的颜色段,代码逻辑也不会变复杂,完全不需要写多层条件判断。


方案2:numpy向量化生成颜色数组(高性能)

如果不想额外导入颜色工具,可以用numpy的向量化操作直接生成颜色数组,比Python原生循环快几个量级,数据量越大优势越明显:

# 按条件匹配对应颜色
colors = np.select(
    [x < 40, (x >= 40) & (x < 60), x >= 60],
    ["blue", "green", "red"]
)
plt.scatter(x, x, c=colors)
plt.show()

如果分段很少,还可以写得更短:

# 先全部填充为中间段的绿色
colors = np.full(len(x), "green", dtype=object)
# 再覆盖两端区间的颜色
colors[x < 40] = "blue"
colors[x >= 60] = "red"

总结

  • 数据量小、只有2-3个分段的时候,循环写法没有任何问题,只是调整起来稍麻烦
  • 分段多、后续可能频繁调整配色和阈值的时候,优先用ListedColormap+BoundaryNorm的方案
  • 数据量很大(万级以上点)的时候,优先用numpy向量化操作,避免Python循环的性能损耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:51:17