如何在 seaborn 条形图上绘制错误条?
How to plot errorbars on seaborn barplot?
我有以下数据框:
data = {'Value':[6.25, 4.55, 4.74, 1.36, 2.56, 1.4, 3.55, 3.21, 3.2, 3.65, 3.45, 3.86, 13.9, 10.3, 15],
'Name':['Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke'],
'Param': ['Param1', 'Param1', 'Param1',
'Param2', 'Param2', 'Param2',
'Param3', 'Param3', 'Param3',
'Param4', 'Param4', 'Param4',
'Param5', 'Param5', 'Param5'],
'error': [2.55, 1.24, 0, 0.04, 0.97, 0, 0.87, 0.7, 0, 0.73, 0.62, 0, 0, 0, 0]}
df = pd.DataFrame(data)
我想将误差线(在误差列中预先定义)添加到条形图中,但我似乎无法获得正确的 x 坐标?它显示 Param5
的错误栏,但 Param5
没有错误?同样对于 Luke
,没有错误,但在 Param1
中绘制了一个错误栏。
plt.figure()
ax = sns.barplot(x = 'Param', y = 'Value', data = df, hue = 'Name', palette = sns.color_palette('CMRmap_r', n_colors = 3))
x_coords = [p.get_x() + 0.5*p.get_width() for p in ax.patches]
y_coords = [p.get_height() for p in ax.patches]
plt.errorbar(x=x_coords, y=y_coords, yerr=df["error"], fmt="none", c= "k")
ax.patches
中的柱状图按 hue
值排序。要以相同的顺序获取条形图和数据框,可以先按 Name
排序数据框,然后按 Param
:
排序
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
data = {'Value': [6.25, 4.55, 4.74, 1.36, 2.56, 1.4, 3.55, 3.21, 3.2, 3.65, 3.45, 3.86, 13.9, 10.3, 15],
'Name': ['Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke'],
'Param': ['Param1', 'Param1', 'Param1',
'Param2', 'Param2', 'Param2',
'Param3', 'Param3', 'Param3',
'Param4', 'Param4', 'Param4',
'Param5', 'Param5', 'Param5'],
'error': [2.55, 1.24, 0, 0.04, 0.97, 0, 0.87, 0.7, 0, 0.73, 0.62, 0, 0, 0, 0]}
df = pd.DataFrame(data)
df = df.sort_values(['Name', 'Param'])
plt.figure()
ax = sns.barplot(x='Param', y='Value', data=df, hue='Name', palette='CMRmap_r')
x_coords = [p.get_x() + 0.5 * p.get_width() for p in ax.patches]
y_coords = [p.get_height() for p in ax.patches]
ax.errorbar(x=x_coords, y=y_coords, yerr=df["error"], fmt="none", c="k")
plt.show()
PS:请注意,默认情况下,列按字母顺序排序。如果要保持原始顺序,可以通过 pd.Categorical(df['Name'], df['Name'].unique())
.
使列分类
df = pd.DataFrame(data)
df['Name'] = pd.Categorical(df['Name'], df['Name'].unique())
df['Param'] = pd.Categorical(df['Param'], df['Param'].unique())
df = df.sort_values(['Name', 'Param'])
我有以下数据框:
data = {'Value':[6.25, 4.55, 4.74, 1.36, 2.56, 1.4, 3.55, 3.21, 3.2, 3.65, 3.45, 3.86, 13.9, 10.3, 15],
'Name':['Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke'],
'Param': ['Param1', 'Param1', 'Param1',
'Param2', 'Param2', 'Param2',
'Param3', 'Param3', 'Param3',
'Param4', 'Param4', 'Param4',
'Param5', 'Param5', 'Param5'],
'error': [2.55, 1.24, 0, 0.04, 0.97, 0, 0.87, 0.7, 0, 0.73, 0.62, 0, 0, 0, 0]}
df = pd.DataFrame(data)
我想将误差线(在误差列中预先定义)添加到条形图中,但我似乎无法获得正确的 x 坐标?它显示 Param5
的错误栏,但 Param5
没有错误?同样对于 Luke
,没有错误,但在 Param1
中绘制了一个错误栏。
plt.figure()
ax = sns.barplot(x = 'Param', y = 'Value', data = df, hue = 'Name', palette = sns.color_palette('CMRmap_r', n_colors = 3))
x_coords = [p.get_x() + 0.5*p.get_width() for p in ax.patches]
y_coords = [p.get_height() for p in ax.patches]
plt.errorbar(x=x_coords, y=y_coords, yerr=df["error"], fmt="none", c= "k")
ax.patches
中的柱状图按 hue
值排序。要以相同的顺序获取条形图和数据框,可以先按 Name
排序数据框,然后按 Param
:
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
data = {'Value': [6.25, 4.55, 4.74, 1.36, 2.56, 1.4, 3.55, 3.21, 3.2, 3.65, 3.45, 3.86, 13.9, 10.3, 15],
'Name': ['Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke',
'Peter', 'Anna', 'Luke'],
'Param': ['Param1', 'Param1', 'Param1',
'Param2', 'Param2', 'Param2',
'Param3', 'Param3', 'Param3',
'Param4', 'Param4', 'Param4',
'Param5', 'Param5', 'Param5'],
'error': [2.55, 1.24, 0, 0.04, 0.97, 0, 0.87, 0.7, 0, 0.73, 0.62, 0, 0, 0, 0]}
df = pd.DataFrame(data)
df = df.sort_values(['Name', 'Param'])
plt.figure()
ax = sns.barplot(x='Param', y='Value', data=df, hue='Name', palette='CMRmap_r')
x_coords = [p.get_x() + 0.5 * p.get_width() for p in ax.patches]
y_coords = [p.get_height() for p in ax.patches]
ax.errorbar(x=x_coords, y=y_coords, yerr=df["error"], fmt="none", c="k")
plt.show()
PS:请注意,默认情况下,列按字母顺序排序。如果要保持原始顺序,可以通过 pd.Categorical(df['Name'], df['Name'].unique())
.
df = pd.DataFrame(data)
df['Name'] = pd.Categorical(df['Name'], df['Name'].unique())
df['Param'] = pd.Categorical(df['Param'], df['Param'].unique())
df = df.sort_values(['Name', 'Param'])