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()

你的需求是按数值区间给点分配固定颜色(注:你描述里写<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
相关产品推荐
相关产品推荐

