seaborn errorbar options: sd, ci, se, pi (tested)
In seaborn 0.12+, errorbar= picks what the bars show: ("ci", 95) (default, a bootstrap confidence interval of the mean), "sd" (mean ± standard deviation), "se" (mean ± standard error), ("pi", 50) (percentile interval) or None. The old ci= parameter is deprecated.
1. All errorbar options on the same data
b1.py draws one barplot per option and reads the error-bar extent off each bar (group a = 1, 2, 3, 4, 10):
import warnings
import matplotlib
matplotlib.use("Agg")
import numpy as np, pandas as pd, seaborn as sns
df = pd.DataFrame({"group": ["a"] * 5 + ["b"] * 5,
"value": [1, 2, 3, 4, 10, 5, 6, 7, 8, 9]})
def bar_extent(**kw):
ax = sns.barplot(df, x="group", y="value", seed=0, **kw) # seed: bootstrap CI
out = []
for line in ax.lines: # one error-bar line per bar
y = line.get_ydata()
out.append(f"{y.min():.2f}..{y.max():.2f}")
ax.figure.clf()
return out or "no error bars"
print("mean of a, b:", df.groupby("group")["value"].mean().tolist())
print("default (ci, 95) ", bar_extent())
print("errorbar='sd' ", bar_extent(errorbar="sd"))
print("errorbar='se' ", bar_extent(errorbar="se"))
print("errorbar=('ci', 68)", bar_extent(errorbar=("ci", 68)))
print("errorbar=('pi', 50)", bar_extent(errorbar=("pi", 50)))
print("errorbar=None ", bar_extent(errorbar=None))
print("std of a (ddof=1):", round(df[df.group == "a"].value.std(), 2))
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
print("ci='sd' (old API) ", bar_extent(ci="sd"))
print(" ", w[0].category.__name__, " ".join(str(w[0].message).split()))
Output (seaborn 0.13.2, pandas 3.1.0, numpy 2.5.4, Python 3.13.5):
mean of a, b: [4.0, 7.0]
default (ci, 95) ['1.80..7.00', '5.80..8.20']
errorbar='sd' ['0.46..7.54', '5.42..8.58']
errorbar='se' ['2.42..5.58', '6.29..7.71']
errorbar=('ci', 68) ['2.57..5.60', '6.40..7.60']
errorbar=('pi', 50) ['2.00..4.00', '6.00..8.00']
errorbar=None no error bars
std of a (ddof=1): 3.54
ci='sd' (old API) ['0.46..7.54', '5.42..8.58']
FutureWarning The `ci` parameter is deprecated. Use `errorbar='sd'` for the same effect.
2. What each option means
("ci", 95)is the default forbarplot,pointplotandlineplot(checked viainspect.signature). It is a bootstrap confidence interval of the mean, so it is random: passseed=0for repeatable plots. Note it is asymmetric here (1.80..7.00 around a mean of 4.0) because of the outlier 10."sd": mean ± standard deviation (4.0 ± 3.54 = 0.46..7.54; pandas.std(), ddof=1, gives the same 3.54). Describes the spread of the data."se": mean ± standard error (3.54 / √5 = 1.58, so 2.42..5.58). Describes uncertainty of the mean.("pi", 50): percentile interval, here the 25th to 75th percentile of the raw values (2..4). Does not use the mean.errorbar=Noneremoves the bars (the plot has no error-bar lines).
3. The old ci= parameter
ci="sd" still works in 0.13.2 and gives the same bars, with a FutureWarning telling you to use errorbar="sd". Likewise ci=None becomes errorbar=None and ci=68 becomes errorbar=("ci", 68).
Frequently asked questions
What is the default errorbar in seaborn barplot?
("ci", 95): a 95% bootstrap confidence interval of the mean. Pass seed= to make it repeatable.
How do I show standard deviation error bars in seaborn?
Use errorbar="sd". The old ci="sd" still works in 0.13.2 but raises a FutureWarning.
How do I remove error bars in seaborn?
Pass errorbar=None.
Written with AI assistance. Measured on 2026-10-23 with seaborn 0.13.2, pandas 3.1.0, numpy 2.5.4 and Python 3.13.5 on Linux. The script ran verbatim and the output was pasted unedited. PlainTables is our extension; seaborn is free.