基于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
相关产品推荐
相关产品推荐

