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

如何为使用归一化KDE值的多DataFrame散点图设置统一vmax

解决多DataFrame散点图颜色统一映射问题

问题根源

你的代码中,每个图表的颜色归一化(colors.Normalize)都绑定了当前DataFrame自身的冲突频率范围,而非全局计算的maxer,导致颜色映射和色条范围无法统一。同时KDE值的归一逻辑也依赖单表数据,无法对齐全局刻度。

修改方案

  1. 提前创建全局归一化器,固定使用0到maxer的统一范围
  2. 调整KDE值的归一逻辑:先保留其聚类的相对差异,再映射到全局冲突数刻度
  3. 所有图表的散点图和颜色条复用同一个全局归一化器

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:55:53