马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在数据分析中,我们常说:“一张好的图表赛过千言万语。”
但许多时间,我们做出来的图表却是“千言万语堵在心口难开”。读者看了半天,抓不住重点。
这是为什么?
由于人类的视觉感知遵照一套被称为 格式塔(Gestalt) 的生理学原理。
简朴来说,当我们看到一组物体时,大脑会自动将它们视为一个团体或一种模式,而不是孤立的碎片。
下面我们用 Python 的 Matplotlib 库,来演示 格式塔(Gestalt) 生理学中的 6 个焦点原理,看看怎样利用这些原理“控制”读者的注意力。
1. 相近原理:隔断产生“关系”
相近原理就是隔断越近,关系越亲,我们的大脑会自动把靠得近的物体归为一类。
就像在一个派对上,站在一起谈天的几个人,你会下意识以为他们是一伙的。- # 邻近原理
- # 创建测试数据
- np.random.seed(42)
- data_a = np.random.normal(5, 1.5, 30)
- data_b = np.random.normal(10, 1.5, 30)
- data_c = np.random.normal(15, 1.5, 30)
- # 不使用邻近原理
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
- # 左侧:未应用邻近原理(所有点均匀分布)
- all_data = np.concatenate([data_a, data_b, data_c])
- x_positions = np.arange(90)
- ax1.scatter(x_positions, all_data, alpha=0.7)
- ax1.grid(True, alpha=0.3)
- # 右侧:应用邻近原理(按组聚集)
- for i, (data, x_offset) in enumerate(zip([data_a, data_b, data_c], [0, 30, 60])):
- x_positions = np.arange(len(data)) + x_offset
- ax2.scatter(x_positions, data, alpha=0.7, label=f'组{i+1}')
- plt.tight_layout()
- plt.show()
复制代码
计划要点:将相干的数据点或元素放在靠近的位置,可以让观众天然地明白它们属于同一种别或具有某种关联。
2. 相似原理:相似的“性格”吸引
相似原理就是长得像的,就是一家人,当物体在颜色、形状或巨细上相似时,大脑会将它们分为一组。
好比在足球场上,穿着类似颜色球衣的人,你不须要看清他们的脸,就知道他们是队友。- # 相似原理
- # 创建测试数据
- categories = ["A", "B", "C", "D", "E"]
- values1 = [12, 16, 14, 18, 15]
- values2 = [8, 11, 9, 12, 10]
- x_pos = np.arange(len(categories))
- # 相似原理示例
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
- # 左侧:未应用相似原理(随机颜色和样式)
- bars1 = ax1.bar(x_pos - 0.2, values1, 0.4, color=colors1, edgecolor="black")
- bars2 = ax1.bar(
- x_pos + 0.2, values2, 0.4, color=colors2, edgecolor="black", hatch=hatches[0]
- )
- # 为每组条形添加不同图案
- for i, bar in enumerate(bars2):
- bar.set_hatch(hatches[i % len(hatches)])
- # 右侧:应用相似原理(一致的颜色和样式)
- ax2.bar(x_pos - 0.2, values1, 0.4, color="skyblue", edgecolor="black", label="数据集1")
- ax2.bar(
- x_pos + 0.2, values2, 0.4, color="lightcoral", edgecolor="black", label="数据集2"
- )
- plt.tight_layout()
- plt.show()
复制代码
计划要点:利用同等的颜色、形状或样式来表现类似范例的数据,可以大大低落观众的认知负担。
3. 困绕原理:界限创造"归属感"
困绕原理就是有围墙的地方就是家。假如在某些物体附近加上界限或配景致,它们就被视为一个独立的群体。
这个原理乃至比 “相近” 和 “相似” 更强大。
好比,草地上散落着羊群,一旦你用栅栏圈住此中几只,各人就会以为这几只是被特殊选中的。- # 包围原理
- # 创建测试数据
- np.random.seed(42)
- x1 = np.random.normal(2, 0.8, 50)
- y1 = np.random.normal(3, 0.8, 50)
- x2 = np.random.normal(5, 0.8, 50)
- y2 = np.random.normal(5, 0.8, 50)
- # 包围原理示例
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
- # 左侧:未应用包围原理
- ax1.scatter(x1, y1, alpha=0.7, color="blue")
- ax1.scatter(x2, y2, alpha=0.7, color="red")
- # 右侧:应用包围原理
- from matplotlib.patches import Ellipse
- ax2.scatter(x1, y1, alpha=0.7, color="blue", label="组A")
- ax2.scatter(x2, y2, alpha=0.7, color="red", label="组B")
- # 添加包围区域
- ellipse1 = Ellipse((2, 3), width=4, height=3, edgecolor="blue")
- ellipse2 = Ellipse((5, 5), width=4, height=3, edgecolor="red")
- ax2.add_patch(ellipse1)
- ax2.add_patch(ellipse2)
- plt.tight_layout()
- plt.show()
复制代码
计划要点:利用界限、配景致或容器将相干的数据元素困绕起来,可以明白地告诉观众这些元素属于同一组。
4. 闭合原理:大脑的"自动补全"
闭合原理就是大脑是天生的“补图高手”。纵然图形不完备,只要有充足的提示,大脑也会自动脑补出缺失的部门。
好比看到一个虚线画圆,你不会以为那是断断续续的线段,你会直接说:“这是一个圆”。- # 闭合原理示例
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
- # 创建一些不完整的数据点
- np.random.seed(42)
- angles = np.linspace(0, 2*np.pi, 7)[:-1] # 故意少一个点形成不闭合
- radii = np.random.uniform(3, 5, 6)
- x = radii * np.cos(angles)
- y = radii * np.sin(angles)
- # 左侧:不完整的形状(未利用闭合原理)
- ax1.plot(x, y, 'o-', linewidth=2, markersize=8)
- # 右侧:闭合的形状(应用闭合原理)
- # 添加缺失的点使形状闭合
- angles_closed = np.linspace(0, 2*np.pi, 7)
- radii_closed = np.append(radii, radii[0]) # 回到起点
- x_closed = radii_closed * np.cos(angles_closed)
- y_closed = radii_closed * np.sin(angles_closed)
- ax2.plot(x_closed, y_closed, 'o-', linewidth=2, markersize=8)
- ax2.fill(x_closed, y_closed, alpha=0.3) # 填充增强闭合感
- plt.tight_layout()
- plt.show()
复制代码
计划要点:我们不须要展示每一个细节,可以利用观众的自动补万本领来简化图表。
但要注意,过于不完备的图形大概导致误解。
5. 一连原理:流通的"视觉路径"
一连原理就是顺藤摸瓜。我们的视线倾向于跟随平滑、一连的路径,而不是剧烈折线或不规则的分列。
好比列队时,假如队伍弯弯曲曲但每个人都看着前一个人的后脑勺,你知道这还是一条队。- # 连续原理示例
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
- # 创建数据
- np.random.seed(42)
- time = np.arange(0, 10, 0.1)
- signal1 = np.sin(time) + np.random.normal(0, 0.1, len(time))
- signal2 = np.cos(time) + np.random.normal(0, 0.1, len(time))
- # 左侧:不连续的展示
- ax1.plot(time[:50], signal1[:50], 'b-', linewidth=2, label='信号A (第一部分)')
- ax1.plot(time[70:], signal1[70:], 'b--', linewidth=2, label='信号A (第二部分)')
- ax1.plot(time[:40], signal2[:40], 'r-', linewidth=2, label='信号B (第一部分)')
- ax1.plot(time[60:], signal2[60:], 'r--', linewidth=2, label='信号B (第二部分)')
- # 右侧:连续的展示
- ax2.plot(time, signal1, 'b-', linewidth=2, label='信号A')
- ax2.plot(time, signal2, 'r-', linewidth=2, label='信号B')
- plt.tight_layout()
- plt.show()
复制代码
计划要点:保持线条、形状或元素的一连性可以资助观众追踪数据的变革趋势。在折线图、面积图中尤其紧张。
6. 毗连原理:看得见的"关系线"
毗连原理就是难舍难分。被线毗连的物体,被视为强关联。这个视觉信号比颜色和隔断都要强。
好比,两个人站得再远,假如手里牵着一根绳子,你也会以为他们俩在互动。- # 连接原理示例 - 散点图版本
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
- # 创建散点数据:4个相关点集,每个点集有5个点
- np.random.seed(42)
- n_points = 5
- n_groups = 4
- # 为每组生成相关点
- groups = []
- for i in range(n_groups):
- center_x = np.random.uniform(2, 8)
- center_y = np.random.uniform(2, 8)
- # 生成围绕中心的相关点
- x_points = center_x + np.random.normal(0, 0.8, n_points)
- y_points = center_y + np.random.normal(0, 0.8, n_points)
- # 添加一些趋势
- trend = np.random.uniform(-1, 1)
- y_points = y_points + trend * (x_points - center_x)
- groups.append((x_points, y_points))
- # 左侧:未应用连接原理(独立的散点)
- colors = ["blue", "red", "green", "orange"]
- markers = ["o", "s", "^", "D"]
- for i, (x_points, y_points) in enumerate(groups):
- ax1.scatter(
- x_points,
- y_points,
- color=colors[i],
- marker=markers[i],
- alpha=0.7,
- s=80,
- label=f"数据集{i+1}",
- )
- # 右侧:应用连接原理(连接相关散点)
- for i, (x_points, y_points) in enumerate(groups):
- # 首先绘制连接线
- # 按照x值排序,使连接线更有序
- sorted_indices = np.argsort(x_points)
- sorted_x = x_points[sorted_indices]
- sorted_y = y_points[sorted_indices]
- ax2.plot(
- sorted_x,
- sorted_y,
- color=colors[i],
- linewidth=2,
- alpha=0.5,
- line,
- label=f"数据集{i+1}趋势线",
- )
- # 然后绘制散点(在线上方,避免被线遮挡)
- ax2.scatter(
- x_points,
- y_points,
- color=colors[i],
- marker=markers[i],
- alpha=0.7,
- s=80,
- edgecolor="black",
- linewidth=1,
- )
- plt.tight_layout()
- plt.show()
复制代码
计划要点:在散点图中,毗连相干数据点的线可以资助观众辨认出数据的模式、趋势或分组关系。
这就像在舆图上毗连各个都会来表现观光蹊径一样,使相干的点之间创建了明白的视觉接洽。
7. 总结
做数据可视化,不光仅是写代码绘图,更是一场 “注意力夺取战”。
通过这 6 个格式塔原理,我们不是在改变数据本身,而是在优化数据的出现方式,让读者的脑力斲丧降到最低。
每次我们绘图时,不妨问本身一句:
- “这些数据应该是一组吗?它们靠得够近吗?”(相近)
- “重点数据突出了吗?”(困绕/相似)
- “视线活动顺畅吗?”(一连)
最好的可视化不是展示全部数据,而是引导观众看到最紧张的信息。格式塔原理就是我们实现这一目标的强大工具。
盼望这篇文章能资助你在创建数据可视化时,更加故意地引导观众的注意力。
|