You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

参数相同但绘图差异大?Matplotlib与Seaborn对数绘图疑问

为何参数看似相同的直方图呈现明显差异?Matplotlib与Seaborn对数绘图对比

核心差异原因

Seaborn的log_scale=True与Matplotlib的plt.xscale("log")实现逻辑完全不同:

  • Seaborn是先对数据做对数转换,再在对数空间内均匀分箱,分箱间隔在对数轴上是等距的。
  • Matplotlib是先在原始数据的线性空间均匀分箱,再将x轴切换为对数刻度,分箱间隔在对数轴上会呈现前密后疏的不均匀分布,这就是两者直方图形状差异的根源。

以下是不同实现方式的对比示例:

1. 使用Seaborn histplot

import seaborn as sns

plot = sns.histplot(data = adata.obs, x = 'n_counts',  bins=50, log_scale=True)
plot.set_xlim(1, 100000)

Seaborn对数直方图

2. 使用Matplotlib plt.hist + plt.xscale

adata = org_1
data = adata.obs['n_counts']
plt.hist(data, bins=50, range=(1, 100000))
plt.xscale("log")

Matplotlib对数刻度直方图

3. 使用Matplotlib plt.hist先对数据做对数转换

额外问题:如何让x轴显示为10^n格式(如第一张图)?

data = np.log10(adata.obs['n_counts'])
plt.hist(data, bins=50)
plt.xlabel('log nUMI')

Matplotlib先对数转换的直方图

4. 使用Matplotlib plt.hist先对数转换并指定范围

注意:此案例中range=(1, 10000)是错误的——这里的范围是对数转换后的数据范围,对应原始数据的101到1010000,远超出实际数据区间,导致直方图异常。

data = np.log10(adata.obs['n_counts'])
plt.hist(data, bins=50, range = (1, 10000))
plt.xlabel('log nUMI')

Matplotlib先对数转换并指定错误范围的直方图

额外问题解答:让Matplotlib x轴显示为10^n格式

有两种场景的实现方式:

场景1:直接用plt.xscale("log")的情况

使用Matplotlib的ticker模块设置刻度格式:

import matplotlib.pyplot as plt
from matplotlib.ticker import LogFormatterSciNotation

adata = org_1
data = adata.obs['n_counts']
plt.hist(data, bins=50, range=(1, 100000))
plt.xscale("log")
# 设置x轴刻度为10^n格式
plt.gca().xaxis.set_major_formatter(LogFormatterSciNotation(base=10, labelOnlyBase=False))
plt.show()

场景2:先对数据做对数转换的情况

手动替换x轴刻度标签为10^n格式:

import numpy as np
import matplotlib.pyplot as plt

data = np.log10(adata.obs['n_counts'])
plt.hist(data, bins=50)
# 自定义刻度与标签,比如对应原始数据10^1到10^5
plt.xticks([1, 2, 3, 4, 5], ['$10^1$', '$10^2$', '$10^3$', '$10^4$', '$10^5$'])
plt.xlabel('n_counts')
plt.show()

内容的提问来源于stack exchange,提问作者Carmen Sandoval

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:01:15