pandas 1.5.3
seaborn 0.12.2
我的代码和部分数据如下所示。我试图绘制在dataframe (val_lo,val_hi)
中预先计算的错误条。似乎sns.catplot
与kind=bar
支持使用errorbar
,正如提到的here-我如何让它工作?或者如何使用matplotlib错误条的任何指导?
import pandas as pd
import re
import seaborn as sns
from matplotlib.ticker import PercentFormatter
df = pd.DataFrame([
['C', 'G1', 'gbt', 'auc', 0.7999, 0.7944, 0.8032],
['C', 'G1', 'gbtv2', 'auc', 0.8199, 0.8144, 0.8232],
['C', 'G1', 'gbt', 'pr@2%', 0.0883, 0.0841, 0.0909],
['C', 'G1', 'gbt', 'pr@10%', 0.0430, 0.0416, 0.0435],
['C', 'G2', 'gbt', 'auc', 0.7554, 0.7506, 0.7573],
['C', 'G2', 'gbt', 'pr@2%', 0.0842, 0.0795, 0.0872],
['C', 'G2', 'gbt', 'pr@10%', 0.0572, 0.0556, 0.0585],
['C', 'G3', 'gbt', 'auc', 0.7442, 0.7404, 0.7460],
['C', 'G3', 'gbt', 'pr@2%', 0.0894, 0.0836, 0.0913],
['C', 'G3', 'gbt', 'pr@10%', 0.0736, 0.0714, 0.0742],
['E', 'G1', 'gbt', 'auc', 0.7988, 0.7939, 0.8017],
['E', 'G1', 'gbt', 'pr@2%', 0.0810, 0.0770, 0.0832],
['E', 'G1', 'gbt', 'pr@10%', 0.0354, 0.0342, 0.0361],
['E', 'G1', 'gbtv3','pr@10%',0.0454, 0.0442, 0.0461],
['E', 'G2', 'gbt', 'auc', 0.7296, 0.7253, 0.7311],
['E', 'G2', 'gbt', 'pr@2%', 0.1071, 0.1034, 0.1083],
['E', 'G2', 'gbt', 'pr@10%', 0.0528, 0.0508, 0.0532],
['E', 'G3', 'gbt', 'auc', 0.6958, 0.6914, 0.6978],
['E', 'G3', 'gbt', 'pr@2%', 0.1007, 0.0961, 0.1030],
['E', 'G3', 'gbt', 'pr@10%', 0.0536, 0.0518, 0.0541],
], columns=["src","grp","model","metric","val","val_lo","val_hi"])
sns.reset_defaults()
sns.set(style="whitegrid", font_scale=1.)
g = sns.catplot(data=df, x="grp", y="val", hue="model",
col="metric", row="src", kind="bar", sharey=False)
for ax in g.axes.flat:
ax.yaxis.set_major_formatter(PercentFormatter(1))
if re.search("metric = auc",ax.get_title(),re.IGNORECASE):
_ = ax.set_ylim((.5,1.))
plt.show()
1条答案
按热度按时间8gsdolmq1#
ax.set_ylim((.5, 1.))
是一个可怕的方式来呈现酒吧。seaborn
图中作为误差条,但这违背了目的,而且很麻烦。seaborn
是matplotlib
的高级API,这使得一些事情更容易实现,但是,如果您的绘图需要自定义,那么直接使用matplotlib
可能是更好的选择g.map(plt.errorbar, 'grp', 'val', 'yerr', marker='none', color='r', ls='none')
没有正确地避开错误条以与条对齐,如here所示。pandas.DataFrame.plot
使用matplotlib
作为默认绘图后端。pandas
和matplotlib.pyplot.subplots
创建相同的图。*在
python 3.11.2
、pandas 2.0.0
、matplotlib 3.7.1
、seaborn 0.12.2
中测试'val_lo'
和'val_hi'
关于杆顶对称df.val_hi.sub(df.val_lo)
计算yerr
,然后使用pandas.DataFrame.plot
中的yerr=
参数添加误差线。'val_lo'
和'val_hi'
不对称于杆顶.vlines
绘制一条垂直线作为误差线'val_lo'
和'val_hi'
分别作为ymin
和ymax
。.get_center
提取相应的bar容器的xtick位置,可以将其传递给x
df