在科研绘图中,柱状图适合比较数值大小,折线图适合呈现变化趋势。将二者结合之后,一张图便可以同时表达“不同模型之间的差异”和“同一样本下的变化关系”。这类图形的价值在于,它不是简单地把两种图拼接在一起,而是把定量比较与趋势观察压缩到同一视觉空间中,不必在多张图之间来回切换,信息获取效率会明显提高。
本文示例以RMSE 为指标,横轴为Sample,分组对象为Model。其中,柱状部分更强调“当前数值的高低”,折线部分则更强调“在不同模型之间的起伏变化”。当数据结构本身具有“分组”和“序列”两种属性时,这种画法尤其合适,例如模型对比、实验批次比较、样本分层分析等场景,都可以采用类似方式进行表达。(四个单图和一个组图)

示例数据来自Data.xlsx,核心字段只有四列:Sample、Model、Bar_RMSE 和Line_RMSE。其中,前两列用于定义分组关系,后两列分别对应柱状和折线的数值来源。这样的设计看似简单,但它体现了一种非常实用的科研绘图思路:同一份数据可以根据表达目标拆成不同视觉层级,而不是把所有信息堆在一条轴上。
从实现角度看,Sample 决定横轴上每一组的位置,Model 决定组内要放多少个对象,bar_width 则决定柱子之间的间距与疏密。这三个元素共同构成了图形的骨架。只要整体架构固定,后续无论更换颜色、标记方式还是字体风格,图的基本结构都不会乱。
df = pd.read_excel('Data.xlsx')
samples = df['Sample'].unique()
models = df['Model'].unique()
x = np.arange(len(samples))
bar_width = 0.15
柱状部分的关键在于“错位排列”。代码通过偏移量让同一Sample 下的多个Model 并排显示,从而避免柱子重叠。这个设计的核心目的,是把“同组比较”变成一眼可见的事情:同一组内谁更高、谁更低、差距是否明显,都可以直接从柱体高度读出,而不需要额外计算。
另外,柱体颜色采用分组内渐变式或分色式处理,也有助于提升辨识度。颜色并不是装饰,而是一种辅助编码:当模型数量较多时,颜色能够帮助大脑更快建立“这个柱子属于哪一组”的对应关系。
offset = (i - n_models / 2 + 0.5) * bar_width
ax.bar(x + offset, values, bar_width,
color=colors[i], edgecolor='black', linewidth=0.5)
折线部分用于补充趋势信息,它不是简单叠加在柱顶,而是按每个样本对应的分组位置逐点连接。这样做的好处在于,折线不再只是“装饰性的覆盖层”,而是成为一种明确的第二叙事:它告诉读者,同一个样本在不同模型之间是如何变化的,哪个点出现了上升,哪个点出现了回落。
虚线、圆点或三角标记可以增强区分度,zorder 也能保证折线始终位于视觉前景。这里的标记尤其重要,因为标记点承担着“强调节点”的作用,相当于在趋势路径上打上几个可读性很高的锚点。对于科研图而言,这类处理能够让读者先看到趋势,再回到柱状数值做细读,形成“先概览、后比较”的阅读节奏。
ax.plot(line_x_positions, line_y_values,
linestyle='--', marker='o', linewidth=2, zorder=10)
提供了四套配色,分别是蓝色系、棕橙色系、绿色系和紫灰色系。蓝色系更稳重,适合论文正文;棕橙色系更醒目,适合强调结果;绿色系更柔和,适合展示连续性较强的数据;紫灰色系则更克制,适合统一整篇文章的视觉风格。
最后生成的拼图版本则便于横向比较不同配色在同一数据上的表现。
plt.tight_layout()
plt.savefig('bar_with_grouped_lines_combined.jpeg', dpi=600, bbox_inches='tight')
现在绘图代码都不支持免费获取了,欢迎加入小编科研绘图VIP群,298/年,所有科研绘图相关文章代码免费获取,联系小编,也可以更换为其他模型(比如RF、LGBM和XGBoost等定制修改)。涵盖机器学习模型(回归和分类)的shap分析、还有各种如皮尔逊分析等相关的图,以及期刊复现图,源代码直接复制或者打开就能绘图。同时进群赠送SHAP科研分析软件6.0(文本版)科研软件 | 基于机器学习+SHAP的科研分析软件(文本版,SHAP6.0)和最优地理探测器软件最优地理探测器软件:从最优分类到交互探测的全流程可视化分析工具,且免费更新使用。VX:GISyanjiushengya