Matplotlib带中点值的散点图色标归一化问题求助
解决Matplotlib散点图色条中点对齐0且自定义范围的问题
你当前的问题核心是没有将TwoSlopeNorm实际应用到散点图的归一化逻辑中,而且初始设置的vmax=5也不符合你要的3.95上限。以下是修正后的代码,完全匹配你的需求:
import matplotlib.pyplot as plt from matplotlib.colors import TwoSlopeNorm # 必须导入这个类 import contextily as ctx # 按你的需求设置色标范围:最小值-5,中点0,最大值3.95 vmin = -5.00 vcenter = 0 vmax = 3.95 # 初始化TwoSlopeNorm归一化对象,确保0对应色条中点(白色) norm = TwoSlopeNorm(vmin=vmin, vcenter=vcenter, vmax=vmax) fig, ax = plt.subplots(1, 1, figsize=(10, 10)) # 关键:在scatter中传入norm参数,同时把vmin/vmax换成你的目标值 scatter = ax.scatter(x=results_df.geometry.x, y=results_df.geometry.y, c=results_df['Trend'], norm=norm, alpha=0.75, cmap='RdBu_r', s=20) # 创建色条,设置对应的刻度 ticks = [-5, -3, -1, 0, 1, 2, 3.95] cbar = fig.colorbar(scatter, ax=ax, ticks=ticks) # 设置刻度标签,直接按需求格式化 tick_labels = [f"{tick:.2f}" for tick in ticks] # 给最大值添加特殊标记 tick_labels[-1] = f"Max: {vmax:.2f}" cbar.ax.set_yticklabels(tick_labels) # 添加底图 ctx.add_basemap(ax, crs=results_df.crs.to_string(), source=ctx.providers.OpenStreetMap.Mapnik) # 设置显示范围 ax.set_xlim([results_df.total_bounds[0], results_df.total_bounds[2]]) ax.set_ylim([results_df.total_bounds[1], results_df.total_bounds[3]]) plt.show()
关键修改说明:
- 必须导入
TwoSlopeNorm并实例化,把它传给scatter的norm参数,这才是实现中点对齐0的核心 - 直接把
vmax设为你要的3.95,不再用之前的5,确保色条上限匹配需求 - 调整了色条刻度,覆盖从-5到3.95的关键节点,让色标显示更清晰
- 因为你确认数据没有超出范围,所以移除了原来处理
actual_min的冗余逻辑
这样修改后,色条会完美呈现:-5对应深蓝色,0对应白色中点,3.95对应深红色,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

