【发布时间】: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