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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:05:14