格式塔原理:数据可视化如何引导观众的注意力

在数据分析中,我们常说:“一张好的图表胜过千言万语。”

但很多时候,我们做出来的图表却是“千言万语堵在心口难开”。读者看了半天,抓不住重点。

这是为什么?

因为人类的视觉感知遵循一套被称为 格式塔(Gestalt) 的心理学原理。

简单来说,当我们看到一组物体时,大脑会自动将它们视为一个整体或一种模式,而不是孤立的碎片。

下面我们用 PythonMatplotlib 库,来演示 格式塔(Gestalt) 心理学中的 6 个核心原理,看看如何利用这些原理“控制”读者的注意力。

1. 邻近原理:距离产生“关系”

邻近原理就是距离越近,关系越亲,我们的大脑会自动把靠得近的物体归为一类。

就像在一个派对上,站在一起聊天的几个人,你会下意识觉得他们是一伙的。

/* by 01022.hk - online tools website : 01022.hk/zh/calcheat.html */
# 邻近原理
# 创建测试数据
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. 相似原理:相似的“性格”吸引

相似原理就是长得像的,就是一家人,当物体在颜色、形状或大小上相似时,大脑会将它们分为一组。

比如在足球场上,穿着相同颜色球衣的人,你不需要看清他们的脸,就知道他们是队友。

/* by 01022.hk - online tools website : 01022.hk/zh/calcheat.html */
# 相似原理
# 创建测试数据
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,
        linestyle="--",
        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 个格式塔原理,我们不是在改变数据本身,而是在优化数据的呈现方式,让读者的脑力消耗降到最低。

每次我们画图时,不妨问自己一句:

  • “这些数据应该是一组吗?它们靠得够近吗?”(邻近)
  • “重点数据突出了吗?”(包围/相似)
  • “视线流动顺畅吗?”(连续)

最好的可视化不是展示所有数据,而是引导观众看到最重要的信息。格式塔原理就是我们实现这一目标的强大工具。

希望这篇文章能帮助你在创建数据可视化时,更加有意地引导观众的注意力。

成都市作为中国西部地区具有战略地位的核心都市,其人口的空间分布状况对于城市规划、社会经济发展及公共资源配置等研究具有基础性数据价值。本文聚焦于2019年度成都市人口分布的空间数据集,该数据以矢量格式存储,属于地理信息系统中常用的数据交换形式。以下将对数据集内容及其相关技术要点进行系统阐述。 Shapefile 是一种由 Esri 公司提出的开放型地理空间数据格式,用于记录点、线、面等几何要素。该格式通常由一组相互关联的文件构成,主要包括存储几何信息的 SHP 文件、记录属性信息的 DBF 文件、定义坐标系统的 PRJ 文件以及提供快速检索功能的 SHX 文件。 1. **DBF 文件**:该文件以 dBase 表格形式保存与各地理要素相关联的属性信息,例如各区域的人口统计数值、行政区划名称及编码等。这类表格结构便于在各类 GIS 平台中进行查询与编辑。 2. **PRJ 文件**:此文件明确了数据所采用的空间参考系统。本数据集基于 WGS84 地理坐标系,该坐标系在全球范围内广泛应用于定位与空间分析,有助于实现跨区域数据的准确整合。 3. **SHP 文件**:该文件存储成都市各区(县)的几何边界,以多边形要素表示。每个多边形均配有唯一标识符,可与属性表中的相应记录关联,实现空间数据与统计数据的联结。 4. **SHX 文件**:作为形状索引文件,它提升了在大型数据集中定位特定几何对象的效率,支持快速读取与显示。 基于上述数据,可开展以下几类空间分析: - **人口密度评估**:结合各区域面积与对应人口数,计算并比较人口密度,识别高密度与低密度区域。 - **空间集聚识别**:运用热点分析(如 Getis-Ord Gi* 统计)或聚类算法(如 DBSCAN),探测人口在空间上的聚集特征。 - **空间相关性检验**:通过莫兰指数等空间自相关方法,分析人口分布是否呈现显著的空间关联模式。 - **多要素叠加分析**:将人口分布数据与地形、交通网络、环境指标等其他地理图层进行叠加,探究自然与人文因素对人口布局的影响机制。 2019 年成都市人口空间数据集为深入解析城市人口格局、优化国土空间规划及完善公共服务体系提供了重要的数据基础。借助地理信息系统工具,可开展多尺度、多维度的定量分析,从而为城市管理与学术研究提供科学依据。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的技术资源,重点围绕电力系统中连锁故障的传播路径展开研究,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法,用于提升电力系统在复杂故障条件下的安全性与鲁棒性。该模型通过Matlab代码实现,具备较强的工程应用价值和学术参考意义,适用于电力系统风险评估、脆弱性分析及预防控制策略设计等场景。文中还列举了大量相关的科研技术支持方向,涵盖智能优化算法、机器学习、路径规划、信号处理、电力系统管理等多个领域,展示了广泛的仿真与复现能力。; 适合人群:具备电力系统、自动化、电气工程等相关背景,熟悉Matlab编程,有一定科研基础的研究生、高校教师及工程技术人员。; 使用场景及目标:①用于电力系统连锁故障建模与风险评估研究;②支撑高水平论文(如EI/SCI)的模型复现与算法验证;③为电网安全分析、故障传播防控提供优化决策工具;④结合YALMIP等工具进行数学规划求解,提升科研效率。; 阅读建议:建议读者结合提供的网盘资源,下载完整代码与案例进行实践操作,重点关注双层优化结构与场景筛选逻辑的设计思路,同时可参考文档中提及的其他复现案例拓展研究视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值