有没有办法在以log10为底的对数尺度上进行计算,并在seaborn的箱线图上以线性尺度显示结果?
我的数据表示每平方公里的项目数量,并分布在不同区域。我的数据框看起来是这样的:
| n_items | region |
|---|---|
| 28741 | region_1 |
| 192 | region_1 |
| 3856 | region_2 |
| 12345 | region_2 |
| 0 | region_3 |
| 297 | region_3 |
我的目标是显示一个箱线图,为每个区域展示不同的箱体,展示各区域的分布和统计特性。
由于我的数据遵循对数正态分布,我想做的是:
- 对 "n_items" 列取log10。
- 绘制一个seaborn的箱线图,使用log10(n_items) 来确定中位数、均值、四分位数等统计量。
- 按原始尺度显示箱线图,这相当于10^(log10(n_items))。
也就是说,对数据进行log10转换,在log10尺度上进行计算,随后再将数据变回原始尺度,最后绘制箱线图。
现在我有一个常规的箱线图,数据如下:
sns.boxplot(data=data,
x='n_items',
y='region',
hue='region',
ax=ax,
palette=palette,
legend=False,
whis=5,
fliersize=0.8,
showmeans=True,
meanprops={'marker': 'o', 'markerfacecolor': 'white', 'markeredgecolor': 'black', 'markersize': '8'}
)
我尝试把 data = np.log10(data) 作为数据参数,然后用 ax.set_xscale("linear") 手动设置刻度,但不起作用……
有没有办法做到?
解决方案
是的,但你很可能不想得到一个在对数空间中计算然后再转换回来的箱线图。
箱线图是由分位数(Q1、中位数、Q3、须)定义的。由于 log10() 是一个单调变换:
Q_p(X) = 10^(Q_p(log10(X)))
因此在 log10(n_items) 上绘制箱线图,然后对四分位数取指数,得到的四分位数与直接在原始数据上计算得到的一致。
通常的做法是只要:
sns.boxplot(
data=df,
x="n_items",
y="region",
whis=5,
showmeans=True,
)
ax.set_xscale("log")
这会在对数坐标轴上显示数据,同时保留原始数值。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。