首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sns.kdeplot中实现Z轴的对数变换

在sns.kdeplot中实现Z轴的对数变换
EN

Stack Overflow用户
提问于 2020-08-05 14:43:40
回答 1查看 180关注 0票数 1

我试图在z轴上对给定的曲线图进行对数变换,以便我可以看到图中存在的数据,其中数据是稀疏的。但是我不知道该怎么做。

代码语言:javascript
复制
sns.kdeplot( x , y , cmap='gist_gray_r', shade=True, shade_lowest=False)

来自上述命令的图像附在下面,(x,y是2个数据列表)。有没有人可以帮助我们进行对数变换(即,将对数应用到z轴)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-05 15:34:24

Seaborn的kdeplot将不能直接考虑日志。但您可以手动调用kde,计算网格上的值并记录日志。然后手动创建等值线图。

但是,如果x和y数组不是非常大,kde在稀疏区域中就不会有太多有意义的信息。一切都会好起来的。

另一个想法是scatterplot。使用逗号标记(marker=',')并去掉点边缘(linewidth=0)可以绘制非常小的点。根据点的数量,可以使用较小的alpha。散点图的好处是可以真实地显示数据,而不是通过kde进行任意近似。

下面的代码创建了3种方法的示例。共享X和Y轴是为了说明对数刻度级别占用的更大区域。

代码语言:javascript
复制
from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns
from scipy.stats import gaussian_kde

x = np.random.normal(np.tile([0.02, 0.03, 0.04, 0.06], 10000), 0.01)
y = np.random.normal(np.tile([-0.5, 0.5, 1, 0.9], 10000), 0.4)

fig, axes = plt.subplots(ncols=3, figsize=(14, 4), sharex=True, sharey=True)

# create a regular kdeplot
sns.kdeplot(x, y, cmap='gist_gray_r', shade=True, shade_lowest=False, ax=axes[0])
axes[0].set_title('standard kdeplot')

# create a kdeplot with logscale levels
kde = gaussian_kde([x, y])
xmin, xmax = x.min() - 0.02, x.max() + 0.02
ymin, ymax = y.min() - 0.8, y.max() + 0.8
xs, ys = np.meshgrid(np.linspace(xmin, xmax, 50), np.linspace(ymin, ymax, 50))
z = kde([xs.ravel(), ys.ravel()]).reshape(xs.shape)
N = 10
levels = np.logspace(-6, np.log10(z.max()), N + 1)
cmap = plt.get_cmap('inferno_r', N)
axes[1].contourf(xs, ys, z, levels=levels, colors=[cmap((i + 1) / N) for i in range(N)], alpha=0.5)
axes[1].yaxis.set_tick_params(labelleft=True) # 'sharey' removes the ticks, here they are added again
axes[1].set_title('kdeplot with logscale levels')

# draw a scatter plot
sns.scatterplot(x, y, color='r', marker=',', linewidth=0, s=1, alpha=0.2, ax=axes[2])
axes[2].yaxis.set_tick_params(labelleft=True)
axes[2].set_title('scatterplot')
plt.show()

另一个想法是将常规的kdeplot与远程点的散点图结合起来:

代码语言:javascript
复制
ax = sns.kdeplot(x, y, cmap='gist_gray_r', shade=True, shade_lowest=False)
sns.scatterplot(x, y, color='grey', marker=',', linewidth=0, s=1, alpha=1, zorder=0, ax=ax)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63259767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档