如何在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
相关产品推荐
相关产品推荐

