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

如何在plt.hist2d热图中为FacetGrid分面设置统一的颜色数值映射

解决方法

核心是给所有子图的hist2d指定全局统一的颜色映射上下限(vmin/vmax),避免每个子图自动适配当前分组的数据范围。具体修改步骤如下:

  • 第一步:提前基于全量数据和你设定的固定bins,计算全局计数的最大值,作为统一的颜色上限
  • 第二步:修改自定义绘图函数,移除内部的colorbar调用,接收统一的vmin/vmax参数传入hist2d
  • 第三步:分面绘图完成后,全局添加统一的色条即可

修改后完整代码

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 提前定义全局统一的bins和颜色映射范围
bins_x = np.arange(0,24+1.5,1.5)
bins_y = np.arange(0,36+3,2)
# 计算全量数据的直方图计数最大值,作为全局vmax
global_counts, _, _ = np.histogram2d(
    df_clean['start_time_hour_decimal'], 
    df_clean['avg_trip_speed_kmh'], 
    bins=[bins_x, bins_y]
)
vmin = 0
vmax = global_counts.max()

# 修改自定义绘图函数
def hist2dgrid(x, y, **kwargs):
    palette = kwargs.pop('color')
    vmin = kwargs.pop('vmin')
    vmax = kwargs.pop('vmax')
    plt.hist2d(
        x, y, 
        bins = [bins_x, bins_y], 
        cmap = palette, 
        cmin = 0.5,
        vmin = vmin,
        vmax = vmax
    )

# 生成分面网格
g= sns.FacetGrid(data=df_clean,col='start_time_day_name',col_wrap = 3)
# 映射绘图,传入统一的vmin/vmax
g.map(hist2dgrid, 'start_time_hour_decimal', 'avg_trip_speed_kmh',color='viridis_r', vmin=vmin, vmax=vmax)
# 全局添加统一色条,取第一个子图的mappable对象
plt.colorbar(g.axes[0].get_children()[0], ax=g.axes, label='count')
plt.show()

原问题原因

你原来的代码中plt.hist2d没有指定vmin和vmax参数,每次调用时会自动根据当前分组的数据的计数范围做颜色映射,导致不同子图的颜色和数值的对应关系不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:24:00