如何从pandas.DataFrame.plot.kde()提取生成的数据?
问题描述
我编写了如下代码:
ax1 = fig.add_subplot(221) plot.confax(ax1) ax1.set_ylabel('Extinction') ax1.text(0.5, 0.8, 'Morning scatter', transform=ax1.transAxes, color='k', fontsize=8) ax1 = dataframe.plot.kde()
请问如何提取上述代码中dataframe.plot.kde()生成的数据?我查阅了相关文档但未找到有用信息,尝试了Stack Overflow上的其他问题建议,但均无效,我认为原因是我试图从Axes对象而非绘图中提取数据。
解决方案
方法1:从Axes对象提取已绘制的线条数据
dataframe.plot.kde()返回的Axes对象本身不存储KDE数据,数据实际保存在Axes下的Line2D线条对象中,可以通过以下方式提取:
# 获取Axes中的所有线条对象 lines = ax1.get_lines() for line in lines: # 获取线条对应的列名 col_name = line.get_label() # 提取x轴和y轴的KDE数据 x_data = line.get_xdata() y_data = line.get_ydata() # 按需处理数据,比如存入字典或打印 print(f"列 {col_name} 的KDE数据:") print("X值序列:", x_data) print("Y值序列:", y_data)
方法2:直接计算KDE数据(更高效)
如果不需要绘图只需要数据,直接调用pandas底层的计算逻辑,跳过绘图步骤,避免不必要的开销:
from scipy.stats import gaussian_kde import numpy as np kde_results = {} for col in dataframe.columns: # 清理列中的缺失值 clean_data = dataframe[col].dropna().values # 初始化KDE模型 kde_model = gaussian_kde(clean_data) # 生成和plot.kde默认范围一致的x轴序列 x_min = clean_data.min() - 3 * clean_data.std() x_max = clean_data.max() + 3 * clean_data.std() x_values = np.linspace(x_min, x_max, 1000) # 计算对应的KDE值 y_values = kde_model(x_values) kde_results[col] = (x_values, y_values)
关键说明
dataframe.plot.kde()本质是调用scipy.stats.gaussian_kde计算数据后再绘图,直接计算的方式支持自定义带宽、x轴范围等参数,灵活性更高。- 从Axes提取的方式适合已经完成绘图,需要回溯获取数据的场景。
内容的提问来源于stack exchange,提问作者jaynorton
相关产品推荐
相关产品推荐

