局部与整体类可视化图像是数据分析中常用的工具,用于展示数据集中各部分与整体之间的关系。本文以韦恩图、饼图、环形图、旭日图和圆堆积图为代表,涵盖它们的特点、应用场景以及使用工具的实现过程和结果。
1. 韦恩图
特点:
- 通过重叠的圆形展示多个集合之间的关系。
- 每个圆代表一个集合,重叠部分表示交集,非重叠部分突出独有元素。
- 设计简单直观,具有很强的对比性,易于理解。
- 能够快速传递集合间的共有部分和差异部分的关键信息。
应用场景:
- 在市场细分中展示不同客户群体的重叠特征。
- 在教育领域中比较不同课程内容的交叉部分。
- 在生物学中分析基因组数据的共有与独有区域。
- 在演示文稿或报告中帮助观众快速抓住集合间的关系。
实现过程:
在 Python 中,使用 matplotlib_venn
,定义集合及其交集数据,然后调用函数绘制韦恩图。
from matplotlib_venn import venn2, venn2_circles
import matplotlib.pyplot as plt
from matplotlib_venn import venn3, venn3_circles
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure()
venn3(subsets = (20, 10, 12, 5, 8, 4, 2),
set_labels = ('集合 X', '集合 Y', '集合 Z'),
set_colors=('red', 'green', 'blue'),
alpha = 0.6,
subset_label_formatter=lambda x: f"{x}")
venn3_circles(subsets = (20, 10, 12, 5, 8, 4, 2),
linestyle='solid', linewidth=1, color='darkgrey')
plt.title("三个集合的韦恩图")
plt.show()
结果:
清晰展示集合之间的重叠关系,便于理解交集和差异。
2. 饼图
特点:
- 将圆按比例分割成多个扇区,每个扇区代表一个类别的占比。
- 设计简单明了,直观性强,观众可一眼看出比例分布。
- 通过颜色和标签增强视觉效果,适合非专业人士阅读。
- 突出各类别在整体中的相对大小。
应用场景:
- 展示市场份额的分布。
- 显示问卷调查的结果(不同选项的支持率)。
- 表示时间管理的分配(一天中各项活动的时间占比)。
实现过程:
在 Python 的 matplotlib
中,输入数据和标签,设置颜色、百分比标签参数,调用绘图函数生成饼图。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = [15, 30, 55]
labels = ['A', 'B', 'C']
colors = ['pink', 'blue', 'yellow']
plt.pie(data, labels=labels, colors=colors, autopct='%.1f%%')
plt.title('饼图')
plt.axis('equal')
plt.show()
结果:
图像清晰展示各部分的比例,便于快速比较类别占比。
3. 环形图
特点:
- 饼图的变体,中间有空心圆,增加视觉层次感和现代感。
- 保留饼图的直观性,同时减少视觉拥挤感。
- 可叠加多层环形展示更复杂的数据关系。
- 在视觉效果上更具吸引力。
应用场景:
- 展示不同地区的销售额分布(全国各省市的销售占比)。
- 分析产品类别的层级比例(电子产品中手机、电脑等的销量)。
- 表示多阶段项目的进展情况(研发、测试、生产各阶段的资源分配)。
- 用于仪表盘设计中,提升数据展示的美观性。
实现过程:
通过设置中间空心圆的参数(如宽度)生成环形图。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = [23, 36, 41]
labels = ['A', 'B', 'C']
colors = ['yellow', 'blue', 'green']
plt.pie(data, labels=labels, colors=colors, autopct='%.1f%%', wedgeprops=dict(width=0.5))
plt.title('环形图')
plt.axis('equal')
plt.show()
结果:
在展示比例的基础上,增加了层次感,视觉效果更丰富。
4. 旭日图
特点:
- 多层次环形图,从中心向外扩展,每层环代表不同层级。
- 扇区大小反映该部分的占比,清晰展示层次结构和比例分布。
- 通过放射状布局分解复杂信息,兼具美观性和信息密度。
- 适合展示多维度的数据关系。
应用场景:
- 可视化文件系统的目录结构(展示文件夹和文件的嵌套关系)。
- 表示组织架构的层级分布(从公司到部门再到团队)。
- 分析网站流量来源(从总体访问量到具体页面)。
- 展示家谱或分类数据的多级分解。
实现过程:
在Python中,定义层次数据,设置颜色和布局参数,调用函数绘制旭日图。
import plotly.graph_objects as go
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义层次数据
fig = go.Figure(go.Sunburst(
ids=[
"北美洲", "欧洲", "澳大利亚", "北美洲-足球", "足球",
"北美洲-橄榄球", "欧洲-足球", "橄榄球",
"欧洲-美式足球", "澳大利亚-足球", "协会足球",
"澳大利亚规则足球", "澳大利亚-美式足球", "澳大利亚-橄榄球",
"橄榄球联盟", "橄榄球联合会"
],
labels=[
"北美洲", "欧洲", "澳大利亚", "足球", "足球", "橄榄球", "足球", "橄榄球", "美式足球",
"足球", "协会足球", "澳大利亚规则足球", "美式足球", "橄榄球", "橄榄球联盟", "橄榄球联合会"
],
parents=[
"", "", "", "北美洲", "北美洲", "北美洲", "欧洲", "欧洲", "欧洲",
"澳大利亚", "澳大利亚-足球", "澳大利亚-足球", "澳大利亚-足球", "澳大利亚-足球",
"澳大利亚-橄榄球", "澳大利亚-橄榄球"
],
marker=dict(colors=["#FF6347", "#4682B4", "#32CD32", "#FFD700", "#FF4500", "#8A2BE2", "#7FFF00", "#D2691E", "#FF1493", "#00FFFF", "#8B0000", "#FF00FF", "#0000FF", "#008000", "#800080", "#FFC0CB"]),
))
# 设置布局参数
fig.update_layout(
margin=dict(t=0, l=0, r=0, b=0),
title="体育项目层次结构旭日图",
sunburstcolorway=["#FF6347", "#4682B4", "#32CD32", "#FFD700", "#FF4500", "#8A2BE2", "#7FFF00", "#D2691E", "#FF1493", "#00FFFF", "#8B0000", "#FF00FF", "#0000FF", "#008000", "#800080", "#FFC0CB"]
)
# 绘制图形
fig.show()
结果:
图像直观展示数据的层次结构和各部分的相对大小,适合复杂数据的可视化。
5. 圆堆积图
特点:
- 通过圆形的大小和嵌套关系表示数据,圆的大小反映数值。
- 圆之间的包含关系展示层次结构,直观且灵活。
- 既能展示数据的比例,又能清晰呈现层次关系。
- 设计吸引人,强调视觉冲击力。
应用场景:
- 表示人口统计中的年龄和性别分布(从总体到具体群体)。
- 分析网站流量来源的层级(从域名到子页面)。
- 展示产品销售的类别细分(从大类到具体型号)。
- 可视化生态系统中物种的层次关系。
实现过程:
输入层次数据和标签,设置圆的大小(对应数值)和颜色,生成圆堆积图。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 显示负号
# 数据设置
categories = ['A', 'B', 'C']
data = [
[25, 30, 45], # 内层环数据
[15, 25, 30], # 中层环数据
[10, 20, 30] # 外层环数据
]
# 颜色设置(每个环的不同颜色)
colors = [
['#ff9999', '#66b3ff', '#99ff99'], # 内层环颜色
['#ffcc99', '#c2c2f0', '#ffb3e6'], # 中层环颜色
['#ff6666', '#b3b3cc', '#99ff99'] # 外层环颜色
]
# 创建图形
fig, ax = plt.subplots(figsize=(8, 8))
# 绘制每个环
for i in range(len(data)):
radius = 0.3 + 0.2 * i # 环的半径(从0.3开始,每层增加0.2)
width = 0.2 # 环的宽度
if i == len(data) - 1: # 只在最外层环显示标签和百分比
ax.pie(data[i],
radius=radius,
wedgeprops=dict(width=width),
colors=colors[i],
startangle=90,
autopct='%1.1f%%',
labels=categories)
else:
ax.pie(data[i],
radius=radius,
wedgeprops=dict(width=width),
colors=colors[i],
startangle=90,
autopct='%1.1f%%',
labels=None) # 隐藏内部环的标签
# 设置图形属性
ax.set(aspect='equal', title='Circular Stacked Plot')
plt.tight_layout()
plt.show()
结果:
通过圆的大小和嵌套关系,直观呈现数据的层次和比例,适合动态交互展示。
综合总结
局部与整体类可视化图像在数据展示中具有重要作用,选择适合的图表类型需根据数据特性和展示目标决定:
- 韦恩图:突出集合间的关系,适合交集分析。
- 饼图与环形图:强调分类数据的比例,适合简单或多层比例展示。
- 旭日图与圆堆积图:擅长呈现层次结构数据,适合复杂数据集。
根据数据的特性和展示目标选择合适的图表,能更有效地传递信息。
总结对比表
图表类型 | 适用场景 | 优势 | 劣势 |
---|---|---|---|
韦恩图 | 集合间逻辑关系(交集/并集) | 直观展示交集,逻辑清晰 | 集合过多时可读性差,无定量数据 |
饼图 | 整体与部分比例(少量类别) | 简单直观,强调占比 | 类别过多时混乱,无法展示趋势 |
环形图 | 多组分布对比 | 空间高效,支持多组叠加 | 环过多时干扰大,依赖颜色区分 |
旭日图 | 多级分类数据(树状结构) | 清晰展示层级关系 | 层级过多时复杂,需交互辅助 |
圆堆积图 | 多维度分布对比(同心环结构) | 空间高效,多维度对比 | 复杂度高,比例计算需谨慎 |