局部与整体类可视化图像(韦恩图、饼图、环形图、旭日图、圆堆积图)的特点及应用场景总结
一、韦恩图
1.图表特点
直观展示集合关系:通过重叠的圆圈直观地表示集合之间的交集、并集和差集关系。
简洁易懂:适合展示少量集合(通常2-3个)之间的关系,结构简单,易于理解。
灵活表示:可以用于表示任意集合之间的逻辑关系,包括完全独立、完全包含、部分重叠等。
视觉吸引力:图形化展示,易于在报告、演示或教学中使用。
2.应用场景
数据分析:用于分析不同数据集之间的重叠部分,例如用户群体分析、市场调研等。
教育领域:在数学、逻辑学和科学教育中,用于解释集合论和逻辑关系。
商业分析:比较不同产品、服务或市场细分之间的共同点和差异。
生物信息学:用于展示基因集合之间的共同基因或差异基因。
市场研究:分析不同品牌或产品功能的重叠与差异。
3.图表实现
import matplotlib.pyplot as plt
from matplotlib_venn import venn2, venn3
# 示例1:两个集合的韦恩图
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# 绘制两个集合的韦恩图
venn2([set_a, set_b], set_labels=('集合A', '集合B'))
plt.title("两个集合的韦恩图")
plt.show()
# 示例2:三个集合的韦恩图
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
set_c = {4, 5, 6, 7}
# 绘制三个集合的韦恩图
venn3([set_a, set_b, set_c], set_labels=('集合A', '集合B', '集合C'))
plt.title("三个集合的韦恩图")
plt.show()
两个集合的韦恩图:
两个圆圈分别表示集合A和集合B。
重叠部分表示集合A和集合B的交集。
非重叠部分表示集合A和集合B的差集。
三个集合的韦恩图:
三个圆圈分别表示集合A、集合B和集合C。
重叠部分表示集合之间的交集。
非重叠部分表示集合之间的差集。
二、饼图
1.图表特点
直观展示比例关系:通过扇形的面积直观地展示各部分在整体中所占的比例。
结构简单:整个圆代表整体,每个扇形代表一个分类,易于理解和解释。
视觉冲击力强:色彩鲜明,适合在报告、演示或展示中吸引观众的注意力。
适合少量分类:通常用于展示3-7个分类,分类过多时,扇形会变得过小,难以区分。
2.应用场景
市场分析:展示市场份额、产品销售占比、客户分布等。
财务分析:展示预算分配、收入来源、成本分布等。
人口统计:展示人口分布、年龄结构、性别比例等。
教育领域:展示考试成绩分布、学科兴趣分布等。
商业报告:在商业演示中展示关键指标的占比情况,如销售占比、市场份额等。
3.图表实现
import matplotlib.pyplot as plt
# 数据
sizes = [215, 130, 245, 210] # 各部分的数值
labels = ['产品A', '产品B', '产品C', '产品D'] # 各部分的标签
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue'] # 各部分的颜色
explode = (0.1, 0, 0, 0) # 突出显示某一部分(这里是产品A)
# 绘制饼图
plt.figure(figsize=(8, 6)) # 设置图形大小
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140)
plt.axis('equal') # 等轴比例,确保饼图是圆形
plt.title("产品销售占比") # 添加标题
plt.show()
图形:一个圆形饼图,每个扇形代表一个产品。
突出显示:产品A被突出显示(稍微分离)。
标签和百分比:每个扇形上显示对应的标签和百分比。
颜色区分:不同颜色区分不同的产品。
三、环形图
1.图表特点
直观展示比例关系:与饼图类似,环形图通过扇形的弧长直观地展示各部分在整体中所占的比例。
视觉重心转移:相较于饼图,环形图将视觉重心从面积转移到长度上,更容易通过弧长比较各部分数据的相对大小。
空间利用率高:环形图中间的空白区域可以用于添加额外信息或进行设计,使图表更加美观。
适合少量分类:适合展示3-9个分类,分类过多时,扇形会变得过小,难以区分。
2.应用场景
经济统计:展示GDP、财政收支、劳动力等在某个时间段的占比。
人口统计:展示人口构成、性别比例、年龄分布等情况。
营销分析:展示市场份额、销售额、产品类别等占比情况。
网站分析:展示流量来源、访问时间、用户行为等情况。
多层数据展示:嵌套环形图可用于展示数据的集合与子集之间的关系,例如网站流量的来源分析
3.图表实现
import matplotlib.pyplot as plt
# 数据
labels = ['产品A', '产品B', '产品C', '产品D']
sizes = [215, 130, 245, 210]
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']
# 绘制环形图
fig, ax = plt.subplots(figsize=(8, 6))
wedges, texts = ax.pie(sizes, labels=labels, colors=colors, wedgeprops=dict(width=0.3), startangle=140)
# 添加内圆
centre_circle = plt.Circle((0, 0), 0.70, fc='white')
fig = plt.gcf()
fig.gca().add_artist(centre_circle)
# 添加标题
ax.set_title("产品销售占比")
plt.show()
图形:一个环形图,每个扇形代表一个产品。
颜色区分:不同颜色区分不同的产品。
中间空白区域:可用于添加额外信息或进行设计。
标题:图表上方显示标题“产品销售占比。
四、旭日图
1.图表特点
层级结构清晰:旭日图通过多层圆环展示数据的层级关系,中心表示根节点,外层环形区域表示子节点。
数据比例直观:每个扇形区域的角度或面积大小表示该节点的值或占比。
视觉吸引力强:独特的放射状布局和丰富的色彩,能够吸引观众的注意力。
交互性强:现代工具支持悬停、点击等交互操作,可以动态显示某个层次的详细信息。
2.应用场景
组织结构分析:展示公司组织架构、部门层级关系。
财务报表分析:分解财务数据,展示不同业务部门、产品类型、成本项目的占比。
网站流量分析:展示用户浏览路径,从首页到子页面的流量分布。
产品分类销售数据:展示多层级的产品类别和销售数据。
服务器资源管理:展示服务器资源的分配情况。
软件系统分析:展示软件系统的模块结构和代码层次
3.图表实现
import matplotlib.pyplot as plt
import numpy as np
# 数据
sizes = [215, 130, 245, 210] # 各部分的数值
labels = ['产品A', '产品B', '产品C', '产品D'] # 各部分的标签
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue'] # 各部分的颜色
# 绘制嵌套饼图
fig, ax = plt.subplots()
size = 0.3
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
ax.pie(sizes, radius=1, labels=labels, colors=colors,
wedgeprops=dict(width=size, edgecolor='w'))
ax.pie([1, 1, 1, 1, 1, 1], radius=1-size, colors=inner_colors,
wedgeprops=dict(width=size, edgecolor='w'))
ax.set(aspect="equal", title='嵌套饼图模拟旭日图')
plt.show()
一个嵌套的饼图,模拟旭日图的效果。
每个扇形区域的角度或面积大小表示该节点的值或占比。
通过旭日图,可以直观地展示多层级数据的分布和占比关系,非常适合用于展示复杂的层级结构数据。
五、圆堆积图
1.图表特点
多层级展示:通过层层嵌套的圆形结构,可以同时展示多个层级的数据关系,直观呈现各部分在不同层级中的占比情况。
视觉对比明显:利用圆形的大小和颜色区分不同的数据部分,便于进行视觉对比,快速识别数据差异。
灵活展示比例:既能展示数据的比例,又能清晰呈现层次关系。
设计吸引人:强调视觉冲击力,适合用于展示复杂数据结构。
2.应用场景
销售数据分析:展示按地区和产品类别的销售分布,帮助企业了解不同区域、不同产品的销售情况。
市场份额分析:分析不同品牌在不同细分市场的份额,以及细分市场在整体市场中的占比。
资源分配展示:展示公司在不同部门、不同项目上的资源(如预算、人力等)分配情况。
人口结构分析:展示不同年龄段、性别、民族等人口群体的比例关系。
文件系统存储分布:展示文件系统中不同目录的存储占用情况。
电商商品分类层级分析:展示商品分类的层级结构,帮助用户了解商品分布。
3.图表实现
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
from matplotlib.patches import Wedge
def create_circular_packing(layers_data, colors, labels, bg_color='#f5f5f5',
figsize=(10, 10), edgecolor='white', edgewidth=1.5):
"""
创建带图例和注释的圆形堆积图
参数:
layers_data: 每层的值和宽度列表,例如[[10, 20, 30], [15, 25], [40]]
colors: 每层对应的颜色列表
labels: 每层每个分段的标签列表
bg_color: 背景颜色
figsize: 图形大小
edgecolor: 边缘颜色
edgewidth: 边缘宽度
"""
fig, ax = plt.subplots(figsize=figsize, facecolor=bg_color)
ax.set_facecolor(bg_color)
ax.set_aspect('equal', adjustable='datalim')
ax.axis('off')
total_radius = sum(len(layer) for layer in layers_data) * 0.5 + 2
current_radius = 0
for i, (layer, color_group, label_group) in enumerate(zip(layers_data, colors, labels)):
layer_total = sum(layer)
layer_width = len(layer) * 0.5
angles = [2 * np.pi * (sum(layer[:j]) / layer_total) for j in range(len(layer) + 1)]
wedges = []
for j in range(len(layer)):
wedge = Wedge((0, 0), current_radius + layer_width,
np.degrees(angles[j]), np.degrees(angles[j + 1]),
width=layer_width)
wedges.append(wedge)
mid_angle = np.degrees((angles[j] + angles[j + 1]) / 2)
text_radius = current_radius + layer_width / 2
x = text_radius * np.cos((angles[j] + angles[j + 1]) / 2)
y = text_radius * np.sin((angles[j] + angles[j + 1]) / 2)
ha = 'left' if -90 <= mid_angle <= 90 else 'right'
va = 'center'
ax.text(x, y, label_group[j], ha=ha, va=va,
fontsize=10, color='#333333',
rotation=mid_angle if -90 <= mid_angle <= 90 else mid_angle + 180)
patches = PatchCollection(wedges, facecolor=color_group,
edgecolor=edgecolor, linewidth=edgewidth)
ax.add_collection(patches)
current_radius += layer_width
center_circle = plt.Circle((0, 0), 0.2, color='#333333', zorder=10)
ax.add_patch(center_circle)
ax.autoscale_view()
plt.title('Sales Distribution by Region and Product Category', fontsize=18, pad=20, color='#333333')
legend_elements = []
for i, (color_group, label_group) in enumerate(zip(colors, labels)):
for j, (color, label) in enumerate(zip(color_group, label_group)):
legend_elements.append(plt.Line2D([0], [0],
marker='o',
color='w',
label=f'Layer {i + 1} - {label}',
markerfacecolor=color,
markersize=10))
legend = ax.legend(handles=legend_elements,
loc='center left',
bbox_to_anchor=(1.05, 0.5),
frameon=False,
title="Categories")
plt.setp(legend.get_title(), color='#333333', fontsize=12)
for text in legend.get_texts():
text.set_color('#333333')
text.set_fontsize(10)
plt.tight_layout()
return fig, ax
# 示例数据
layers_data = [
[120, 180, 250, 150, 100, 200],
[300, 250, 450],
[600, 400]
]
colors = [
['#8ECAE6', '#219EBC', '#023047', '#FFB703', '#FB8500', '#FF6B6B'],
['#78C679', '#31A354', '#006837'],
['#984EA3', '#6A3D9A']
]
labels = [
['North', 'South', 'East', 'West', 'Central', 'Overseas'],
['Electronics', 'Clothing', 'Home Goods'],
['Premium', 'Standard']
]
# 绘制圆堆积图
fig, ax = create_circular_packing(layers_data, colors, labels, bg_color='#f8f9fa')
plt.figtext(0.5, 0.01, "Data Source: Company Sales Report 2023",
ha="center", fontsize=10, color="#666666")
plt.show()
图形:一个嵌套的圆形堆积图,每个圆形的大小和颜色表示不同的数据部分。
图例:每层的每个部分都有对应的图例说明。
标题:显示图表的标题。
注释:显示数据来源等附加信息。
通过圆堆积图,可以直观地展示多层级数据的比例和层次关系,非常适合用于展示复杂的层级结构数据。