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

求助:如何在Python中绘制按X值条件填充的连续密度脊线图

实现按X值条件填充的连续密度脊线图

要实现单一连续密度曲线按X值(>0和<=0)分色填充的效果,不能通过hue参数拆分数据(这会生成两个独立的KDE曲线),而是需要先计算完整的KDE曲线数据,再分别填充指定区间的区域。

完整实现代码

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy.stats import gaussian_kde

# 生成数据
data = pd.DataFrame({
    'A': np.random.normal(0, 0.25, 4000),
    'B': np.random.normal(0.2, 0.25, 4000),
    'C': np.random.normal(0.4, 0.25, 4000)
})

data_melted = pd.melt(data, var_name='recipe', value_name='values')

# 为每个类别绘制带条件填充的密度图
for recipe in data_melted['recipe'].unique():
    recipe_data = data_melted[data_melted['recipe'] == recipe]['values'].values
    
    # 计算KDE曲线数据
    kde = gaussian_kde(recipe_data)
    x_vals = np.linspace(recipe_data.min() - 0.2, recipe_data.max() + 0.2, 1000)
    y_vals = kde(x_vals)
    
    # 创建画布
    plt.figure(figsize=(8, 4))
    
    # 填充x <= 0的区域
    mask = x_vals <= 0
    plt.fill_between(x_vals[mask], y_vals[mask], color='red', alpha=0.5)
    
    # 填充x > 0的区域
    mask = x_vals > 0
    plt.fill_between(x_vals[mask], y_vals[mask], color='blue', alpha=0.5)
    
    # 绘制连续的KDE曲线
    plt.plot(x_vals, y_vals, color='black', linewidth=0.5)
    
    # 设置图表属性
    plt.title(f"Ridge Plot for Recipe {recipe}")
    plt.xlabel('Values')
    plt.ylabel('Density')
    plt.tight_layout()
    plt.show()

关键说明

  • 计算完整KDE曲线:使用scipy.stats.gaussian_kde对单组数据估计密度,生成连续的x和y值序列,保证曲线是单一连续的。
  • 分区间填充:通过plt.fill_between结合掩码(x_vals <= 0和x_vals > 0),分别对曲线下方的指定区域进行填充,实现分色效果。
  • 避免拆分数据:不再用hue参数分割数据集,确保KDE曲线是基于全部数据生成的单一连续曲线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:32:41