如何为使用归一化KDE值的多DataFrame散点图设置统一vmax
解决多DataFrame散点图颜色统一映射问题
问题根源
你的代码中,每个图表的颜色归一化(colors.Normalize)都绑定了当前DataFrame自身的冲突频率范围,而非全局计算的maxer,导致颜色映射和色条范围无法统一。同时KDE值的归一逻辑也依赖单表数据,无法对齐全局刻度。
修改方案
- 提前创建全局归一化器,固定使用
0到maxer的统一范围 - 调整KDE值的归一逻辑:先保留其聚类的相对差异,再映射到全局冲突数刻度
- 所有图表的散点图和颜色条复用同一个全局归一化器
修改后的完整代码
from matplotlib import colors import matplotlib.pyplot as plt import matplotlib.cm as cm from scipy.stats import gaussian_kde # Calculate the maximum conflicts across all data frames maxer = 0 for i, (name, df) in enumerate(my_dfs_p2v.items()): grouped_df = df.groupby(['conflict_x', 'conflict_y']).size().reset_index(name='frequency') actual_conflicts = grouped_df['frequency'] if actual_conflicts.max() > maxer: maxer = actual_conflicts.max() # 创建全局归一化器,统一使用0到maxer的范围 global_norm = colors.Normalize(vmin=0, vmax=maxer) for i, (name, df) in enumerate(my_dfs_p2v.items()): plt.figure(figsize=(7, 5)) grouped_df = df.groupby(['conflict_x', 'conflict_y']).size().reset_index(name='frequency') actual_conflicts = grouped_df['frequency'] # 计算KDE密度 kde = gaussian_kde([grouped_df['conflict_x'], grouped_df['conflict_y']]) kde_values = kde([grouped_df['conflict_x'], grouped_df['conflict_y']]) # 先将KDE值归一化到自身0-1范围,保留聚类相对差异 kde_self_norm = colors.Normalize(vmin=kde_values.min(), vmax=kde_values.max())(kde_values) # 映射到全局冲突数范围,对齐颜色刻度 kde_scaled = kde_self_norm * maxer # 散点图使用全局归一化器,确保颜色映射统一 plt.scatter(grouped_df['conflict_x'], 960 - grouped_df['conflict_y'], s=100, c=kde_scaled, cmap='viridis', norm=global_norm, alpha=0.7) # ...无关的背景图代码保持不变... plt.xlim(0, 1280) plt.ylim(0, 960) plt.title(f'Conflicts for {name}') # 颜色条绑定全局归一化器,刻度统一为0到maxer scalar_mappable = cm.ScalarMappable(cmap='viridis', norm=global_norm) scalar_mappable.set_array([]) # 无需传入具体数值,norm已定义范围 cbar = plt.colorbar(scalar_mappable) cbar.set_label('Density of Conflicts (scaled to global max frequency)') plt.show()
关键修改说明
- 全局归一化器:仅创建一次,所有图表共用,彻底解决颜色基准不统一的问题
- KDE值处理:先保留KDE聚类的相对差异,再映射到全局刻度,兼顾聚类效果和颜色统一要求
- 散点图与颜色条:统一使用
global_norm,确保色条刻度固定为0到maxer,所有图表的颜色深浅可直接对比
内容的提问来源于stack exchange,提问作者stapmoshun
相关产品推荐
相关产品推荐

