【问题标题】:Plotting KDE with logarithmic x-data in Matplotlib在 Matplotlib 中用对数 x 数据绘制 KDE
【发布时间】:2018-02-28 11:11:01
【问题描述】:

我想为一些数据绘制一个 KDE,这些数据的 x 值范围很广。因此,我想对 x 轴使用对数刻度。对于绘图,我使用的是 seaborn 和来自Plotting 2D Kernel Density Estimation with Python 的解决方案,一旦我将 xscale 设置为对数,这两者都会失败。当我事先取 x 数据的对数时,一切看起来都很好,除了 tic 和 ticlabels 仍然与实际值的对数作为标签呈线性关系。我可以使用以下方法手动更改抽动:

labels = np.array(ax.get_xticks().tolist(), dtype=np.float64)
new_labels = [r'$10^{%.1f}$' % (labels[i]) for i in range(len(labels))]
ax.set_xticklabels(new_labels)

但在我看来,这看起来是错误的,并且在我只想使用时与轴标签(包括轻微抽动)没有任何关系

ax.set_xscale('log')

有没有更简单的方法来绘制带有对数 x 数据的 KDE?或者是否可以只更改 tic-或 label-scale 而不会更改数据的缩放比例,以便我可以绘制 x 的对数值并在之后更改标签的缩放比例?

编辑: 我要创建的情节如下所示: 右边的两列是它应该看起来的样子。在那里,我使用了已经应用对数的 x 数据。不过,我不喜欢 x 轴上的标签。

当原始数据用于 kde 和所有其他图时,左列显示图,然后使用

更改比例
ax.set_xscale('log')

由于某种原因,kde 看起来不像它应该的样子。这也不是错误数据的结果,因为如果使用对数数据,它看起来就很好。

编辑 2: 代码的一个工作示例是

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

data = np.random.multivariate_normal((0, 0), [[0.8, 0.05], [0.05, 0.7]], 100)
x = np.power(10, data[:, 0])
y = data[:, 1]
fig, ax = plt.subplots(2, 1)
sns.kdeplot(data=np.log10(x), data2=y, ax=ax[0])
sns.kdeplot(data=x, data2=y, ax=ax[1])
ax[1].set_xscale('log')
plt.show()

ax[1] 图对我来说显示不正确(x 轴是倒置的),但一般行为与上述情况相同。我认为问题出在 kde 的带宽上,这应该可以解释对数 x 数据。

【问题讨论】:

  • 我想你忘了清楚地说明实际问题。因为像ax.set_xscale('log') 这样的东西应该可以工作,所以我看不到在对数刻度上绘制 KDE 的问题。
  • 您能否提供一些数据样本,以便重现您的问题?
  • 我添加了一些进一步的解释,我将准备一些示例数据用于复制目的。

标签: python matplotlib kde


【解决方案1】:

我找到了一个适合我的答案,并想发布它以防其他人遇到类似问题。 根据this 帖子中接受的答案,我定义了一个函数,该函数首先将对数应用于 x 数据,在执行 KDE 之后,将 x 值转换回原始值。之后我可以简单地绘制轮廓并使用ax.set_xscale('log')

import numpy as np
import scipy.stats as st

def logx_kde(x, y, xmin, xmax, ymin, ymax):
    x = np.log10(x)

    # Peform the kernel density estimate
    xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
    positions = np.vstack([xx.ravel(), yy.ravel()])
    values = np.vstack([x, y])
    kernel = st.gaussian_kde(values)
    f = np.reshape(kernel(positions).T, xx.shape)
    return np.power(10, xx), yy, f

【讨论】:

  • 这里的st是什么对象?
  • 对不起@geo Mind,我没有在任何地方提到这一点。是的,它是scipy.stats
猜你喜欢
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2011-03-30
  • 2021-05-19
  • 2010-10-20
相关资源
最近更新 更多