大家好,我是你们的小帅学长。
如果说折线图擅长讲“趋势”,那柱状图就是科研里最擅长讲的一件事:对比。谁高谁低、差多少、哪几个最重要——柱状图天生就是干这个的。
现实中很多同学的柱状图 密、挤、乱,还特别容易误导,比如 y 轴不从 0 开始。所以这篇我想要讲最通用、最稳、最像论文的柱状图形式:排序 + 水平条(horizontal bar)。
它的优势非常直接:
名字再长也不挤(尤其适合中文标签)
排序后结论像“排行榜”一样清楚
读者/审稿人不用找图例,不用来回比,几秒钟看懂
01.为什么我强烈推荐“水平条 + 排序”作为柱状图默认形态?
水平条更适合科研真实标签:实验处理组/指标名称/模型名通常都很长,竖向柱会挤成一团。
排序是“结论化表达”:不排序的柱状图只是在“展示数据”,排序后的柱状图是在“表达结论”。
读者/审稿人视线更自然:从上到下扫一遍就知道 Top/Bottom 和差距。
02.柱状图的论文级底线:y轴(或x轴)必须从 0 开始
这是柱状图最重要、也是最常被审稿人挑刺的一点:
柱状图用“长度”编码数值,如果轴不从 0 开始,会把差距夸大或缩小。
正确:从 0 起,差距真实
错误:从某个值起,视觉差距被放大
例外情况,除非你明确写明是“截断轴(broken axis)”,否则建议不要截断。
03.什么时候用误差线(error bar)?
如果你柱子代表的是均值,你最好给出不确定性:
± std(波动)
± sem(均值标准误)
95% CI(置信区间)
这不仅更“科学”,也能提前回答读者/审稿人的疑问:
“你这个差异稳不稳?”
04.最通用模板:排序水平条 + 误差线
下面给你一份可直接复用的“论文级水平条模板”:
import osimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fmfrom matplotlib.ticker import MaxNLocator, FormatStrFormatter# == 字体 ==win_fonts = r"C:\Windows\Fonts"for p in [os.path.join(win_fonts, "times.ttf"),os.path.join(win_fonts, "timesbd.ttf"),os.path.join(win_fonts, "timesi.ttf"),os.path.join(win_fonts, "simsun.ttc"),]:if os.path.exists(p):try:fm.fontManager.addfont(p)except Exception:passmpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = FalseOUT_DIR = r"D:\py_figs_bar"os.makedirs(OUT_DIR, exist_ok=True)# == 示例数据:你换成自己的数据即可 ==labels = ["Transforme / 模型A","Random Forest / 模型B","CNN / 模型C","SVR / 模型D","Baseline / 基线模型"]values = np.array([0.91, 0.87, 0.84, 0.82, 0.78]) # 例如 R² 或 Accuracyerrs = np.array([0.01, 0.015, 0.012, 0.02, 0.018]) # 例如 95% CI 半宽(示例)order = np.argsort(values)[::-1]labels_s = [labels[i] for i in order]values_s = values[order]errs_s = errs[order]fig, ax = plt.subplots(figsize=(7.2, 4.2))y = np.arange(len(labels_s))ax.barh(y, values_s,xerr=errs_s,height=0.62)ax.set_title("模型性能对比(排序后更像结论)", fontsize=14)ax.set_xlabel("R² / 决定系数", fontsize=12)ax.set_ylabel("") # 水平条一般不写 y 轴名,直接用标签ax.set_yticks(y)ax.set_yticklabels(labels_s, fontsize=11)ax.invert_yaxis()ax.set_xlim(left=0)ax.xaxis.set_major_locator(MaxNLocator(nbins=6))ax.xaxis.set_major_formatter(FormatStrFormatter("%.2f"))for yi, v in zip(y, values_s):ax.text(v+ 0.01, yi, f"{v:.2f}", va="center", fontsize=11)out_path = os.path.join(OUT_DIR, "barh_sorted_basic.jpg")fig.savefig(out_path, dpi=300, bbox_inches="tight", pad_inches=0.05)plt.close(fig)print("Saved:", out_path)

05.让柱状图立刻“像论文”的 5 个小习惯
1、先排序再画
2、水平条优先
3、轴从 0 开始
4、必要时加误差线
5、适度标注数值
柱状图的专业感来自“结论化表达”,排序让对比像排行榜一样清楚,水平条让长标签也不拥挤,再配上 0 基线与必要的误差线,你的柱状图就能直接进入论文交付状态。
下一篇我会把柱状图的对比能力再升级:《分组对比(分组柱/分面)》。当你要比较的不只是“谁更高”,而是“不同组别在多个指标上怎么差”,分组柱和分面才是最稳的表达方式,我会给你一套不乱的排版与标注策略。
——期待你的关注——