Matplotlib循环绘制散点图时如何基于自定义颜色列表添加colorbar
原因说明
直接调用plt.colorbar()没有效果,是因为循环绘图时你给每批散点传入的是提前取好的固定RGB颜色值,整个绘图流程没有生成和自定义色卡绑定的可映射对象,colorbar找不到对应的颜色-数值映射规则,自然无法正常渲染。
实现方案
不需要改动你已有的循环绘图逻辑,只要在循环执行完成后,基于你自定义的colormap创建ScalarMappable对象传入colorbar即可,代码如下:
from matplotlib.cm import ScalarMappable # 以下是你原有的绘图代码,不需要修改 cm = LinearSegmentedColormap.from_list('defcol', ["#000000", "#FF0000"]) trace_color = cm(np.linspace(0,1,cycles)) for k, color in zip(range(cycles),trace_color): lis = KL_rest[k::cycles] plt.scatter(scanpoints, lis, color = color, marker = '^', alpha = 0.9) # 新增以下代码生成匹配的colorbar # 构建和自定义色卡一致的可映射对象,数值范围和k的取值范围对齐 sm = ScalarMappable(cmap=cm, norm=plt.Normalize(vmin=0, vmax=cycles-1)) sm.set_array([]) # 不需要绑定实际数据,传空数组即可 # 生成色条,刻度直接对应range(cycles)的取值 cbar = plt.colorbar(sm, ticks=range(cycles)) # 如需自定义刻度文本可以放开下面这行修改 # cbar.set_ticklabels([f"cycle {i}" for i in range(cycles)])
运行后生成的色条会和你给散点分配的颜色完全对应:最底端的黑色对应k=0的分组,最顶端的红色对应k=cycles-1的分组,刻度和循环的k值一一匹配。如果cycles数值较大导致刻度过密,也可以按需调整ticks参数的间隔。
内容的提问来源于stack exchange,提问作者IGY
相关产品推荐
相关产品推荐

