MCM520 ← 资料站首页 图表选择可视化指南:柱状图:比大小与构成(深度版) 打开交互阅读器 →

图表选择可视化指南:柱状图:比大小与构成(深度版)

比较不同类别的数值大小,或展示构成比例(堆叠/百分比)。类别少而清晰时首选。

分类:📈 基础图 适用:各方案得分对比、各地区数量、构成占比

一、这个图适合谁(适用场景)

  • 各方案得分对比
  • 各地区数量
  • 构成占比

二、图表结构要素

  1. 横轴=类别(离散)
  2. 纵轴=数值
  3. 可分组/堆叠
  4. 排序更易读

三、可视化的底层逻辑

柱状图用的是"长度/高度"通道(感知精度第二档,仅次于位置),正好适合离散类别的大小比较——人对"哪根柱子更长"的判断又快又准。但它有一个致命前提:纵轴必须从 0 开始。因为长度比较依赖"从同一基线出发的绝对长度",一旦截断基线,视觉长度差被人为放大,真实比值与视觉比值脱节,这是柱状图最常见的误导性丑图。另一条经验:类别数遵循 Miller 的"7±2"短时记忆上限,超过约 10 类人类就难以同时比较,应聚合或改用横向条形图。核心思想:用高精度长度通道做精确比较,且绝不破坏基线。

四、视觉编码与感知推导

基线截断失真:显示长度 L显示=s⋅(v−vmin⁡)+bL_{\text{显示}}=s\cdot(v-v_{\min})+b,其中 bb 为纵轴起点偏移(正常 b=0b=0)。真实比值 v1/v2v_1/v_2 与视觉比值

L1L2=s(v1−b)+b′s(v2−b)+b′≠v1v2(当 b≠0) \frac{L_1}{L_2}=\frac{s(v_1-b)+b'}{s(v_2-b)+b'}\neq \frac{v_1}{v_2}\quad(\text{当 }b\neq0)

bb 越接近 0 失真越小。故"纵轴从 0"不是在美学,而是在保证视觉比=真实比。

排序降低搜索成本:类别按值降序排列后,最大值在视觉 O(1)O(1) 定位;未排序则需通读全部 nn 根柱子,搜索成本 O(n)O(n)。当 nn 大时排序的收益线性放大。

类别可辨上限:人可同时比较的离散类别数约 7±27\pm2(Miller 定律)。n>10n>10 时建议先聚合(如按区域合并)或转横向条形图(利用更长横向空间);否则读者无法在单图内完成全比较。

五、怎么画(步骤)

  1. 类别≤10 用柱状;太多改用条形图(横向)或先聚合。
  2. 要比较构成 → 堆叠柱状或 100% 堆叠。
  3. 按数值排序让高低一目了然。
  4. 纵轴从 0 开始,避免夸大差异。
  5. 加数据标签,省去读者猜高度。

六、何时用 / 何时不用 / 常见丑图

  • 何时用:类别间『谁大谁小』『占比多少』。
  • 何时不用:连续趋势 → 折线;关系 → 散点。
  • 常见丑图:纵轴不从0、3D 柱状扭曲、类别过多拥挤。

七、常见坑

  • 纵轴截断夸大差异
  • 3D 柱状图失真
  • 类别过多看不清

八、画图自检清单

  • 类别数合适或已聚合
  • 纵轴从0
  • 已排序/加标签
  • 构成用堆叠清晰

九、配套资源与搭配

  • 评价类问题怎么选方法
  • 论文图表规范与排版
  • 图表选择可视化指南

本指南由 MCM520 资料站自动生成(深度版),配套论文图表规范与可视化模板可在资源页下载。

十、实战案例——Python 绘制 + 图效果

假设你正在做一道数学建模题,需要从 5 个备选方案中选出最优。
你已用 AHP-熵权法算出各方案的综合得分,最直观的展示方式就是柱状图。

案例场景:某物流选址问题,方案 A-E 的综合评分如下:
方案 A:86.4 | 方案 B:92.1 | 方案 C:78.6 | 方案 D:88.9 | 方案 E:95.2

用柱状图展示时,记得:按得分降序排列、纵轴从 0 开始、加数据标签。

完整代码(Python + matplotlib)

import matplotlib.pyplot as plt

labels = ['方案E', '方案B', '方案D', '方案A', '方案C']
scores = [95.2, 92.1, 88.9, 86.4, 78.6]
colors = ['#dc2626', '#2563eb', '#7c3aed', '#f59e0b', '#16a34a']

plt.figure(figsize=(8, 4))
bars = plt.bar(labels, scores, color=colors, edgecolor='white', linewidth=1.2)
for bar, score in zip(bars, scores):
    plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1,
             f'{score:.1f}', ha='center', va='bottom', fontsize=11, fontweight='bold')
plt.ylabel('综合得分', fontsize=12)
plt.title('五个方案综合评分对比', fontsize=14, fontweight='bold')
plt.ylim(0, 105)
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()

运行效果图

图X1  五个方案综合评分对比柱状图


本指南由 MCM520 资料站生成,配套 Python 代码可直接运行。