seaborn 的标准偏差误差条似乎太小
Standard deviation error bars from seaborn seem too small
我最初在我的数据帧上使用 numpy 函数 .std 来获取标准偏差并使用 matplotlib 绘制它。后来,我尝试使用 seaborn 制作相同的图表。这两张图看起来足够接近,直到我将它们叠加起来,发现 seaborn 的所有误差条都更小——它们越大,差异越明显。
我检查了不同的软件,.std 的结果是正确的,并且它们也被正确绘制。问题的根源是什么(我似乎无法从 seaborn 中提取图形源数据)?
我使用了这段代码:
ax_sns = sns.barplot(x = 'name', y = column_to_plot, data=data, hue='method', capsize=0.1, ci='sd', errwidth=0.9)
the graph - seaborn errorbars are smaller - the darker ones
您没有提供计算标准偏差的代码。也许您使用了 pandas .std()
。 Seaborn 使用 numpy 的。 Numpy 的 std
使用 "Bessel's correction"。当数据点数量较少时(/ n
vs / (n-1)
较大时),差异最为明显。
以下代码可视化了通过 seaborn、numpy 和 pandas 计算的误差条之间的差异。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
flights = sns.load_dataset('flights')
fig, ax = plt.subplots(figsize=(12, 5))
sns.barplot(x='month', y='passengers', data=flights, capsize=0.1, ci='sd', errwidth=0.9, fc='yellow', ec='blue', ax=ax)
flights['month'] = flights['month'].cat.codes # change to a numeric format
for month, data in flights.groupby('month'):
mean = data['passengers'].mean()
pandas_std = data['passengers'].std()
numpy_std = np.std(data['passengers'])
ax.errorbar(month - 0.2, mean, yerr=numpy_std, ecolor='crimson', capsize=8,
label='numpy std()' if month == 0 else None)
ax.errorbar(month + 0.2, mean, yerr=pandas_std, ecolor='darkgreen', capsize=8,
label='pandas std()' if month == 0 else None)
ax.margins(x=0.015)
ax.legend()
plt.tight_layout()
plt.show()
PS:一些带有附加信息的相关帖子:
- Different std in pandas vs numpy
- Why does numpy std() give a different result to matlab std()?
我最初在我的数据帧上使用 numpy 函数 .std 来获取标准偏差并使用 matplotlib 绘制它。后来,我尝试使用 seaborn 制作相同的图表。这两张图看起来足够接近,直到我将它们叠加起来,发现 seaborn 的所有误差条都更小——它们越大,差异越明显。 我检查了不同的软件,.std 的结果是正确的,并且它们也被正确绘制。问题的根源是什么(我似乎无法从 seaborn 中提取图形源数据)?
我使用了这段代码:
ax_sns = sns.barplot(x = 'name', y = column_to_plot, data=data, hue='method', capsize=0.1, ci='sd', errwidth=0.9)
the graph - seaborn errorbars are smaller - the darker ones
您没有提供计算标准偏差的代码。也许您使用了 pandas .std()
。 Seaborn 使用 numpy 的。 Numpy 的 std
使用 "Bessel's correction"。当数据点数量较少时(/ n
vs / (n-1)
较大时),差异最为明显。
以下代码可视化了通过 seaborn、numpy 和 pandas 计算的误差条之间的差异。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
flights = sns.load_dataset('flights')
fig, ax = plt.subplots(figsize=(12, 5))
sns.barplot(x='month', y='passengers', data=flights, capsize=0.1, ci='sd', errwidth=0.9, fc='yellow', ec='blue', ax=ax)
flights['month'] = flights['month'].cat.codes # change to a numeric format
for month, data in flights.groupby('month'):
mean = data['passengers'].mean()
pandas_std = data['passengers'].std()
numpy_std = np.std(data['passengers'])
ax.errorbar(month - 0.2, mean, yerr=numpy_std, ecolor='crimson', capsize=8,
label='numpy std()' if month == 0 else None)
ax.errorbar(month + 0.2, mean, yerr=pandas_std, ecolor='darkgreen', capsize=8,
label='pandas std()' if month == 0 else None)
ax.margins(x=0.015)
ax.legend()
plt.tight_layout()
plt.show()
PS:一些带有附加信息的相关帖子:
- Different std in pandas vs numpy
- Why does numpy std() give a different result to matlab std()?