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

基于Seaborn KDE图获取累积计数并绘制指定可视化图表的问询

实现累积计数C并绘制A-C带B等高线的图表

要实现你的需求,我们可以通过**Scipy的高斯核密度估计(KDE)**来直接获取密度值,再计算累积计数,最后构建所需数据框并绘制目标图表。以下是完整的分步解决方案:

1. 导入依赖库并准备数据

首先导入所需的库,同时加载你的原始数据:

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

# 原始数据
df_1 = pd.DataFrame({'A':[1,2,1,2,3,4,2,1,4], 'B': [2,1,2,1,2,3,4,2,1]})

2. 计算联合KDE密度值并构建A-B-H数据框

Seaborn的kdeplot更偏向可视化,若要获取每个点的密度值(即你说的H),用Scipy的gaussian_kde会更灵活:

# 将A和B数据堆叠为KDE所需的格式
data = np.vstack([df_1['A'], df_1['B']])
# 创建KDE模型
kde = gaussian_kde(data)

# 生成A和B的连续网格(提升平滑度)
A_vals = np.linspace(df_1['A'].min(), df_1['A'].max(), 100)
B_vals = np.linspace(df_1['B'].min(), df_1['B'].max(), 100)
A_grid, B_grid = np.meshgrid(A_vals, B_vals)

# 计算网格中每个点的密度值H
grid_points = np.vstack([A_grid.ravel(), B_grid.ravel()])
H = kde.evaluate(grid_points).reshape(A_grid.shape)

# 构建包含A、B、H的数据框
df_kde = pd.DataFrame({
    'A': A_grid.ravel(),
    'B': B_grid.ravel(),
    'H': H.ravel()
})

3. 计算累积计数C

这里的累积计数C定义为:对每个A值,累积所有小于等于当前B值的密度总和,再转换为近似的实际计数(乘以样本量和网格步长,将概率密度转为计数):

# 按A分组、B排序后计算累积密度和
df_kde = df_kde.sort_values(['A', 'B'])
df_kde['C'] = df_kde.groupby('A')['H'].cumsum()

# 将密度累积转换为近似实际计数
A_step = A_vals[1] - A_vals[0]
B_step = B_vals[1] - B_vals[0]
df_kde['C'] = df_kde['C'] * A_step * B_step * len(df_1)

4. 绘制A为X轴、C为Y轴、B为等高线的图表

我们可以用Matplotlib的contour函数来实现B作为等高线的可视化:

# 将数据透视为A-行、B-列、C-值的矩阵,适配等高线绘制
pivot_df = df_kde.pivot(index='A', columns='B', values='C')

# 绘制等高线图
plt.figure(figsize=(10, 6))
contour_plot = plt.contour(pivot_df.index, pivot_df.columns, pivot_df.T, cmap='viridis')
# 添加等高线标签
plt.clabel(contour_plot, inline=True, fontsize=10)
# 设置轴标签和标题
plt.xlabel('A')
plt.ylabel('Cumulative Count (C)')
plt.title('Cumulative Count (C) vs A with B as Contours')
# 添加颜色条对应B值
plt.colorbar(contour_plot, label='B')
plt.show()

如果你更倾向于用曲线展示不同B值下A与C的关系,可以用Seaborn的折线图:

plt.figure(figsize=(10, 6))
sns.lineplot(data=df_kde, x='A', y='C', hue='B', palette='viridis', linewidth=2)
plt.xlabel('A')
plt.ylabel('Cumulative Count (C)')
plt.title('Cumulative Count (C) vs A by B Value')
plt.show()

内容的提问来源于stack exchange,提问作者R. Cox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:44:34