plt.scatter绘图中色条异常归一化问题求助
解决Matplotlib散点图色条异常归一化到0-1的问题
核心排查与修复步骤:
确认
c参数绑定正确数据
确保plt.scatter的c参数直接传入原始差值列(比如cumulative_diff_df['direct_indirect_diff']),而非经过0-1归一化处理后的数据。如果之前误对数据做了归一化,直接替换为原始差值数据。在
scatter中直接指定vmin和vmax
先计算差值数据的实际范围,然后在绘制散点图时直接传入这两个值,避免后续色条设置冲突:# 计算差值的实际极值 diff_min = cumulative_diff_df['差值列名'].min() diff_max = cumulative_diff_df['差值列名'].max() # 绘制散点图,绑定数据与范围 scatter = plt.scatter( x=cumulative_diff_df['x坐标列'], y=cumulative_diff_df['y坐标列'], c=cumulative_diff_df['差值列名'], vmin=diff_min, vmax=diff_max, cmap='viridis' # 可替换为你需要的颜色映射 ) # 基于散点图对象生成色条 plt.colorbar(scatter)避免重复设置色条范围
不要同时使用scatter的vmin/vmax和cbar.set_clim,二者选其一即可。优先用前者,因为它直接与散点图的数据绑定,不会出现覆盖问题。子图场景下的正确处理
若绘制两个子图,需为每个子图的散点图单独设置对应的数据范围,确保色条与子图数据匹配:import matplotlib.pyplot as plt fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6)) # 第一个子图:直接辐照度差值 diff_min1 = cumulative_diff_df['direct_diff'].min() diff_max1 = cumulative_diff_df['direct_diff'].max() sc1 = ax1.scatter( x=cumulative_diff_df['x'], y=cumulative_diff_df['y'], c=cumulative_diff_df['direct_diff'], vmin=diff_min1, vmax=diff_max1, cmap='coolwarm' ) ax1.set_title('直接辐照度差值') fig.colorbar(sc1, ax=ax1) # 第二个子图:间接辐照度差值 diff_min2 = cumulative_diff_df['indirect_diff'].min() diff_max2 = cumulative_diff_df['indirect_diff'].max() sc2 = ax2.scatter( x=cumulative_diff_df['x'], y=cumulative_diff_df['y'], c=cumulative_diff_df['indirect_diff'], vmin=diff_min2, vmax=diff_max2, cmap='coolwarm' ) ax2.set_title('间接辐照度差值') fig.colorbar(sc2, ax=ax2) plt.tight_layout() plt.show()排查是否误用归一化函数
检查代码中是否存在matplotlib.colors.Normalize或手动归一化(比如(data - min)/(max - min))的逻辑,若有则删除,直接使用原始差值数据传入c参数。
内容的提问来源于stack exchange,提问作者boléro
相关产品推荐
相关产品推荐

