局部与整体类可视化图像

#数据可视化#Python

本文总结局部与整体类可视化图像,包括韦恩图、饼图、环形图、旭日图、漏斗图、圆堆积图、矩形树图等。总结内容包括但不限于图表的特点、应用场景和使用某一工具的实现过程及结果。

时间序列数据是在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化状态或程度,它是根据时间进行分组的。
同样地,在比例数据中也有分组依据,比例数据是根据类别、子类别或群体来进行划分的本章将讨论如何展现比例数据各个类别之间的占比情况,或者类别之间的关联关系。

对于比例数据,我们通常想要得到最大值、最小值和总体分布。前两者比较简单,将数据由小到大进行排列,位于两端的分别就是最小值和最大值。例如,投票选举结果的最小值和最大值,分别就代表了得票最少和得票最多的被选举人;如果你绘制了食物各部分的卡路里含量图,那么它们就分别对应了卡路里含量最少和最多的部分。
其实,研究者真正感兴趣的应该是比例的分布及其相互关系等。如脂肪、蛋白质、碳水化合物都含有同样多的卡路里吗?是不是存在某一种成分的卡路里含量占绝大多数?本文涉及的图表类型将会为大家解答类似的问题。

整体与部分是比例的基本呈现形式。这一类可视化图形既可以呈现各个部分与其他部分的相对关系,还可以呈现整体的构成情况。

一、韦恩图

1、概念

韦恩图是一种用于表示集合之间关系的图形工具,通过重叠的圆圈或形状来展示不同集合之间的交集与并集,它能够直观地展现多个集合之间的共同元素和独特元素,从而帮助人们理解和分析集合论中的集合操作和元素分布情况。

2、特点

韦恩图的特点包括:

  1. 直观性:韦恩图通过图形化的方式,直观地展示了集合之间的交集、并集和补集等关系,使得复杂的数据关系一目了然。

  2. 简洁性:它用简单的闭合图形(通常是圆圈)来代表集合,图形的交集和并集通过图形的重叠和组合来表示,避免了繁琐的文字描述。

  3. 灵活性:韦恩图可以适用于任意数量的集合,无论是两个、三个还是更多的集合,都可以通过适当的设计来表示它们之间的关系。

  4. 可扩展性:韦恩图可以根据需要轻松地添加或移除集合,以适应不同的数据集和分析需求。

  5. 通用性:韦恩图不仅适用于数学和计算机科学中的集合论,还可以应用于其他领域,如生物学、信息科学、市场研究等,用于展示不同群体或类别的交集和差异。

  6. 易于理解:由于其直观的特点,韦恩图对于非专业人士来说也比较容易理解,是一种很好的教育和沟通工具。

  7. 局限性:虽然韦恩图在表示集合关系时非常有效,但当集合数量过多或集合之间的关系非常复杂时,韦恩图可能会变得难以绘制和理解。

  8. 对称性:理想的韦恩图在设计上追求对称性,使得图形更加美观和易于解读,但在处理不对称的数据关系时,这种对称性可能会受到影响。

3、应用场景

韦恩图作为一种常用的图表工具,在多种场景中都有广泛的应用,以下是一些典型的应用场景:

  1. 教育领域:

    • 数学教学:用于讲解集合论的基本概念,如交集、并集、补集等。
    • 逻辑推理:帮助学生理解条件语句、推理和论证中的关系。
  2. 计算机科学:

    • 数据库设计:表示不同数据表之间的关系,帮助设计数据库的架构。
    • 信息检索:展示搜索查询之间的相似性和差异性。
  3. 生物信息学:

    • 基因组学:比较不同基因或基因组的相似性和差异性。
    • 蛋白质组学:分析不同蛋白质之间的相互作用和网络关系。
  4. 商业和市场研究:

    • 市场细分:分析不同市场细分之间的重叠和差异。
    • 竞争分析:比较不同竞争对手的产品或服务特点。
  5. 图书馆和信息科学:

    • 文献检索:帮助用户理解不同文献资源之间的关联性。
    • 知识管理:组织和展示不同知识领域之间的关系。
  6. 项目管理:

    • 资源分配:分析不同项目或任务之间的资源共享情况。
    • 风险评估:识别不同风险因素之间的相互影响。
  7. 心理学和社会学:

    • 群体分析:研究不同社会群体或心理特征群体之间的交叉和差异。
    • 行为研究:探索不同行为模式之间的关联。
  8. 法律和伦理学:

    • 法律分析:比较不同法律条款或案例之间的适用范围。
    • 伦理决策:分析不同伦理原则之间的冲突和一致性。
  9. 个人生活和决策:

    • 时间管理:规划不同任务或活动的时间分配。
    • 购物决策:比较不同产品或服务的特性,做出购买决策。

韦恩图因其直观和易于理解的特点,在需要清晰展示元素之间关系的任何场合都可以发挥作用。

4、案例实现

使用 matplotlib-venn在一个窗口中显示两个子图,第一个是两组的韦恩图,第二个是三组的韦恩图,分别展示了不同部门的人员分布情况。

import matplotlib.pyplot as plt
from matplotlib_venn import venn2, venn3
import matplotlib

# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统可用
# plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # Mac系统可用
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 创建图形
plt.figure(figsize=(12, 5))

# 两组韦恩图
plt.subplot(121)
venn2(subsets=(30, 20, 10),  # (A独有, B独有, AB共有)
      set_labels=('产品部', '技术部'),
      set_colors=('#66c2a5', '#fc8d62'),
      alpha=0.7)
plt.title("部门人员分布")

# 三组韦恩图
plt.subplot(122)
venn3(subsets=(20, 15, 10, 12, 8, 5, 3),  # (A独有, B独有, AB共有, C独有, AC共有, BC共有, ABC共有)
      set_labels=('产品部', '技术部', '市场部'),
      set_colors=('#66c2a5', '#fc8d62', '#8da0cb'),
      alpha=0.7)
plt.title("三部门人员分布")

plt.tight_layout()
plt.show()

5、如何避免韦恩图不对称的问题

韦恩图的不对称性通常是由于集合元素的不均匀分布造成的。为了避免韦恩图不对称,可以采取以下几种方法:

  1. 平衡集合大小:尽量确保参与绘制的集合大小相似。如果集合之间的大小差异很大,韦恩图可能会显得不对称。

  2. 调整元素分布:尝试调整集合中的元素,使得各个交集区域的大小尽可能接近。

  3. 使用精确的集合:确保你使用的集合是精确的,没有错误或遗漏的元素。

  4. 使用软件的自动调整功能:一些绘图软件或库具有自动调整韦恩图对称性的功能。

二、饼图

1、概念

饼图(Pie Chart)是一种常用的统计图表,用于展示数据的相对比例关系。它将整体数据分成几个部分,每个部分代表一个类别,各部分的大小(即角度和面积)与该类别在整体中的比例成正比。饼图通常用于展示各部分占整体的比例,非常适合展示百分比构成的数据。

2、特点

饼图(Pie Chart)是一种常见的统计图表,用于展示数据的相对比例关系,以下是其主要特点:

  1. 比例展示:饼图通过不同的扇形区域来表示不同类别的数据在整体中的占比,直观地展示各部分与整体的关系。

  2. 圆形布局:所有数据类别都分布在同一个圆内,圆的总面积代表数据的总和。

  3. 易于理解:饼图非常直观,即使是不熟悉统计图表的观众也能快速理解各部分数据的大小关系。

  4. 分类限制:饼图适合展示的数据类别不宜过多,一般建议不超过7个类别,因为过多的类别会使图表难以阅读和理解。

  5. 不精确的数值比较:虽然饼图可以显示各部分的比例,但人类对角度的感知并不精确,因此不太适合用来比较各部分之间的具体数值差异。

  6. 无法显示数据变化:饼图适合静态数据的展示,不适合展示数据随时间的变化趋势。

  7. 需要标注:为了使饼图更加清晰,通常需要添加图例、标签或百分比标注,以便观众更好地理解图表。

  8. 不适合零或负值:饼图通常不适用于包含零或负值的数据集,因为这些值在饼图中难以直观地表示。

  9. 强调部分与整体的关系:饼图的优势在于强调每个部分在整体中的重要性,而不是具体的数值。

  10. 视觉吸引力:饼图的圆形设计通常具有一定的视觉吸引力,适合在报告中或展示中使用。

总的来说,饼图是一种有效的数据展示工具,尤其适合用于展示构成整体的各部分比例,但在使用时需要注意其局限性。

3、应用场景

  1. 市场份额分析:展示不同公司或产品在市场中的占比,帮助分析市场竞争格局。

  2. 预算分配:在财务报告中,展示不同项目或部门在总预算中的分配比例。

  3. 资源分配:展示企业资源(如人力、资金、设备等)在不同任务或部门中的分配情况。

  4. 投票结果:在选举或调查中,展示不同候选者或选项所获得的票数比例。

  5. 人口统计:展示人口中不同年龄段、性别、种族等群体的比例。

  6. 时间管理:个人或团队用于展示不同活动或任务所占用的总时间比例,如一周内工作时间分配。

  7. 网站流量来源:在互联网数据分析中,展示网站访问者来源的比例,如搜索引擎、直接访问、推荐链接等。

  8. 投资组合分布:在金融领域,展示投资组合中不同资产类别(如股票、债券、现金等)的比例。

  9. 教育领域:展示不同学科、年级或班级的学生比例,或者教育经费的分配情况。

  10. 健康数据分析:展示不同疾病、健康状况或医疗支出的比例。

4、注意事项

  • 数据类别不宜过多,以免图表显得杂乱无章。
  • 避免使用饼图来展示数据的变化趋势或比较精确数值。
  • 确保图表清晰易懂,必要时添加图例、标签和百分比说明。

饼图的适用场景要求数据能够被清晰地划分为几个互不重叠的部分,并且每一部分相对于整体的重要性是分析的关键。

5、案例实现

1、简单饼图

(1)导入库:

import matplotlib.pyplot as plt
  • 导入了matplotlib库中的pyplot模块,这是进行绘图的主要接口。

(2)定义数据:

labels = 'Part A', 'Part B', 'Part C', 'Part D'
sizes = [25, 35, 20, 20]
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']
explode = (0.1, 0, 0, 0)  # 突出显示第一个部分(Part A)
  • labels 是一个元组,包含了饼图中每个部分的标签。
  • sizes 是一个列表,包含了每个部分的大小(通常表示为百分比)。
  • colors 是一个列表,定义了每个部分的颜色。
  • explode 是一个元组,用于突出显示饼图中的某个部分。这里,第一个部分(Part A)被突显示,其他部分保持不变。

(3)绘制饼图:

plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=140)
plt.axis('equal')  # 保持饼图为圆形
  • plt.figure(figsize=(8, 8)) 创建了一个新的图形,并设置了图形的大小为8x8英寸。
  • plt.pie() 是绘制饼图的主要函数,它接受多个参数来定制饼图的外观:
    • sizes:每个部分的相对大小。
    • explode:突出显示的切片。
    • labels:每个切片的标签。
    • colors:每个切片的颜色。
    • autopct:用于显示每个切片的百分比,'%1.1f%%'表示格式化为一位小数的百分比。
    • shadow:为饼图添加阴影,使其更有立体感。
    • startangle:饼图的起始角度,这里设置为140度。

(4)设置等轴比例:

plt.axis('equal')
  • 确保饼图是圆形的,而不是椭圆形。

(5)显示图形:

plt.show()
  • 在屏幕上显示绘制的饼图。

通过这些步骤,matplotlib库将根据提供的数据和参数生成一个饼图,并展示在屏幕上。

2、多层环形饼图(太阳花图)

Plotly 将创建一个多层饼图,其中外层环形图表示顶级类别,内层环形图表示各个子类别的销售数据。

import plotly.graph_objects as go

# 示例数据
categories = ['电子产品', '服装', '食品', '家居']
sub_categories = {
    '电子产品': ['手机', '电脑', '平板', '配件'],
    '服装': ['男装', '女装', '童装', '配饰'],
    '食品': ['生鲜', '零食', '饮料', '粮油'],
    '家居': ['家具', '家纺', '厨具', '装饰']
}
values = {
    '电子产品': [45, 30, 15, 10],
    '服装': [35, 30, 20, 15],
    '食品': [40, 25, 20, 15],
    '家居': [30, 25, 25, 20]
}

# 创建图形
fig = go.Figure()

# 添加外层环形
fig.add_trace(go.Pie(
    labels=categories,
    values=[sum(v) for v in values.values()],
    domain=dict(x=[0, 1], y=[0, 1]),
    name="大类",
    hole=0.5,
    marker_colors=['#636EFA', '#EF553B', '#00CC96', '#AB63FA'],
    textinfo='label+percent',
    textposition='inside'
))

# 添加内层环形(每个大类一个扇形区)
for i, (cat, sub_cats) in enumerate(sub_categories.items()):
    fig.add_trace(go.Pie(
        labels=sub_cats,
        values=values[cat],
        domain=dict(
            x=[0.2 + 0.15 * (i % 2), 0.8 - 0.15 * (i % 2)],
            y=[0.2 + 0.15 * (i // 2), 0.8 - 0.15 * (i // 2)]
        ),
        name=cat,
        hole=0.7,
        textinfo='label+value',
        textposition='inside',
        marker=dict(colors=['#B6E880', '#FF97FF', '#FECB52', '#19D3F3']),
        direction='clockwise',
        sort=False
    ))

# 更新布局
fig.update_layout(
    title='<b>销售分类多层饼图</b>',
    title_x=0.5,
    annotations=[
        dict(text='大类', x=0.5, y=0.5, font_size=20, showarrow=False),
        dict(text='电子产品', x=0.25, y=0.75, font_size=14, showarrow=False),
        dict(text='服装', x=0.75, y=0.75, font_size=14, showarrow=False),
        dict(text='食品', x=0.25, y=0.25, font_size=14, showarrow=False),
        dict(text='家居', x=0.75, y=0.25, font_size=14, showarrow=False)
    ],
    showlegend=False
)

fig.show()

3、带爆炸效果和自定义标签的饼图

带爆炸效果和自定义标签的饼图是指对传统的饼图进行了一些视觉上的增强,以更好地传达信息。

  1. 带爆炸效果的饼图:

    • 爆炸效果(Exploded Pie Chart)是指将饼图中的一个或多个切片从中心点向外拉出一段距离,使得这些切片从饼图中分离出来。这样做可以强调这些切片,使它们更加显眼,通常用于突出显示饼图中最重要的部分或类别。
    • 在 matplotlib 中,通过设置 explode 参数可以实现爆炸效果。这个参数是一个与饼图数据相对应的列表,其中的元素代表每个切片从中心点拉出的距离。例如,如果有一个包含五个切片的饼图,并且你想要突出显示第一个和最后一个切片,你可以设置 explode=(0.1, 0, 0, 0, 0.1),这样第一个和最后一个切片就会从饼图中拉出来。
  2. 自定义标签:

    • 自定义标签是指在饼图的每个切片旁边添加文字说明,用于描述每个切片代表的数据内容。这些标签可以是类别名称、百分比、数值等,有助于观众理解每个切片的具体含义。
    • 在 matplotlib 中,可以通过 labels 参数来设置自定义标签,并且可以通过 autopct 参数来设置标签中显示的百分比格式。此外,还可以通过 textprops 参数来设置标签的字体大小、颜色等样式。

综合这两个特点,一个带爆炸效果和自定义标签的饼图会具有以下特点:

  • 饼图的一个或多个切片被拉出,以突出显示。
  • 每个切片旁边都有清晰的文字标签,说明该切片代表的类别或数据。

通过matplotlib 创建一个环形饼图,每个部分代表一个电子产品类别的销售比例,并且第一项和最后一项通过 explode 参数进行了突出显示。

import matplotlib.pyplot as plt

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题

# 示例数据
labels = ['手机', '笔记本', '平板', '智能手表', '耳机']
sizes = [35, 25, 20, 15, 5]
explode = (0.1, 0, 0, 0, 0.2)  # 突出显示第一项和最后一项
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99','#c2c2f0']
textprops = {'fontsize': 12, 'color': 'darkred'}

# 创建图形
fig, ax = plt.subplots(figsize=(10, 8))
wedges, texts, autotexts = ax.pie(
    sizes,
    explode=explode,
    labels=labels,
    colors=colors,
    autopct='%1.1f%%',
    startangle=90,
    shadow=True,
    textprops=textprops,
    pctdistance=0.85,
    wedgeprops=dict(width=0.4, edgecolor='w')  # 环形效果
)

# 自定义标签
plt.setp(autotexts, size=12, weight="bold", color='white')
plt.setp(texts, size=12, weight="bold")

# 添加中心圆
centre_circle = plt.Circle((0,0), 0.3, color='white', fc='white', linewidth=1.25)
fig.gca().add_artist(centre_circle)

# 添加标题和图例
ax.set_title('电子产品销售分布 - 带爆炸效果环形饼图', pad=20, fontsize=16, fontweight='bold')
ax.legend(
    wedges,
    labels,
    title="产品类别",
    loc="center left",
    bbox_to_anchor=(1, 0, 0.5, 1),
    prop={'size': 12}
)

plt.tight_layout()
plt.show()

4、交互式嵌套饼图

通过生成一个嵌套饼图,其中每个切片代表一个子类,切片的大小对应销售额,颜色对应利润率。悬停时,会显示子类名称、销售额和利润率。

import plotly.express as px
import pandas as pd

# 创建示例数据
data = pd.DataFrame({
    "主类": ["电子产品"]*4 + ["服装"]*4 + ["食品"]*4,
    "子类": ["手机", "电脑", "平板", "配件"]*3,
    "销售额": [45, 30, 15, 10, 35, 30, 20, 15, 40, 25, 20, 15],
    "利润率": [25, 30, 20, 15, 35, 40, 25, 20, 20, 25, 30, 15]
})

# 创建嵌套饼图
fig = px.sunburst(
    data,
    path=['主类', '子类'],
    values='销售额',
    color='利润率',  # 用颜色表示利润率
    color_continuous_scale='RdYlGn',
    title='<b>销售数据分析嵌套饼图</b>',
    width=800,
    height=800
)

# 自定义悬停文本
fig.update_traces(
    textinfo='label+percent parent',
    hovertemplate="<b>%{label}</b><br>销售额: %{value}<br>利润率: %{color}%<extra></extra>"
)

# 更新布局
fig.update_layout(
    margin=dict(t=50, b=10, l=10, r=10),
    coloraxis_colorbar=dict(
        title="利润率(%)",
        thicknessmode="pixels",
        thickness=20,
        lenmode="pixels",
        len=300,
        yanchor="middle",
        y=0.5
    )
)

fig.show()

三、环形图

1、概念

环形图是一种数据可视化工具,它通过多个同心的圆环来表示数据集的各个部分,每个圆环代表一个整体的不同分类,其宽度与分类的比例成正比,常用于展示各分类在整体中的占比关系,非常适合比较多个分类的相对大小。

2、特点

环形图具有以下特点:

  1. 环形结构:环形图由一个或多个同心的圆环组成,每个圆环代表数据集的一个层级或分类。

  2. 易于比较:环形图的环形布局使得不同分类之间的比例关系一目了然,便于观察和比较各部分的大小。

  3. 中心空白:环形图中心通常是空的,可以用来放置标题、标签或其他信息,增强了图表的可读性。

  4. 灵活性:环形图可以展示多层级的数据,通过不同的圆环表示不同的层级,从而展示更复杂的数据结构。

  5. 颜色编码:环形图的每个部分可以用不同的颜色表示,这有助于区分不同的数据分类。

  6. 视觉吸引力:环形图的形状和颜色使其在视觉上更具吸引力,适合用于报告和演示。

  7. 有限的空间效率:与饼图相比,环形图在相同的空间内可以展示更多的数据分类,因为它利用了中心空白区域。

  8. 比例表达:环形图的每个部分的大小直接对应于数据中各分类的相对比例,使得观众可以快速理解数据。

  9. 适用性:环形图适用于展示分类数据的占比,尤其是在需要强调各部分与整体关系的情况下。

  10. 局限性:虽然环形图在展示比例方面很有效,但它可能不适合展示过于复杂或数据点过多的数据集,因为这可能会导致图表过于拥挤,难以解读。

3、应用场景

环形图在多种应用场景中都非常有用,以下是一些常见的使用环形图的场景:

  1. 市场分析:

    • 展示不同产品或服务在市场中的占比。
    • 比较不同品牌的市场份额。
  2. 预算分配:

    • 显示不同项目或部门在总预算中的占比。
    • 分析预算在不同类别(如广告、研发、运营等)的分配情况。
  3. 时间管理:

    • 展示个人或团队在各项活动上花费的时间比例。
    • 分析时间分配的有效性。
  4. 网站流量来源:

    • 显示网站访问量来自不同渠道(如搜索引擎、社交媒体、直接访问等)的比例。
  5. 人口统计:

    • 展示人口中不同年龄段、性别、种族等的比例。
    • 分析人口结构的变化趋势。
  6. 教育领域:

    • 展示不同学科的学生人数比例。
    • 分析不同教育层次(如本科、硕士、博士)的学生分布。
  7. 健康和医疗:

    • 展示不同疾病或健康状况在人群中的占比。
    • 分析医疗资源在不同治疗领域的分配。
  8. 投资组合:

    • 显示投资组合中不同资产类别(如股票、债券、现金等)的比例。
    • 分析投资风险和回报的分布。
  9. 投票和选举:

    • 展示不同候选人或政党的得票比例。
    • 分析不同地区的投票趋势。
  10. 资源分配:

    • 展示资源(如人力、物资、资金)在不同项目或地区中的分配比例。

环形图通过其直观的比例展示,使得这些场景中的数据分析和决策过程更加清晰和高效。

4、案例实现

1、使用 Plotly(交互式)

import plotly.graph_objects as go

# 数据
labels = ['手机', '笔记本', '平板', '配件']
values = [35, 25, 20, 20]
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#FFA07A']

# 创建环形图
fig = go.Figure(go.Pie(
    labels=labels,
    values=values,
    hole=0.5,  # 设置中间空心部分的大小(0-1)
    marker_colors=colors,
    textinfo='label+percent',
    textposition='inside'
))

# 添加标题
fig.update_layout(
    title_text='电子产品销售占比(环形图)',
    title_x=0.5,
    showlegend=True
)

fig.show()

2、使用 Matplotlib(静态图)

import matplotlib.pyplot as plt

# 设置matplotlib支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# 数据
labels = ['手机', '笔记本', '平板', '配件']
sizes = [35, 25, 20, 20]
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#FFA07A']
explode = (0.05, 0, 0, 0)  # 突出第一块

# 创建图形
fig, ax = plt.subplots(figsize=(8, 6))

# 绘制环形图(通过设置wedgeprops的width参数)
ax.pie(sizes, 
       explode=explode, 
       labels=labels, 
       colors=colors,
       autopct='%1.1f%%',
       startangle=90,
       wedgeprops=dict(width=0.4, edgecolor='w'))  # width控制环的宽度

# 添加中心空白圆
centre_circle = plt.Circle((0,0), 0.2, color='white', fc='white', linewidth=0)
fig.gca().add_artist(centre_circle)

# 添加标题
ax.set_title('电子产品销售占比(环形图)', pad=20, fontsize=14)

# 保证图形是正圆形
ax.axis('equal')

plt.tight_layout()
plt.show()

5、环形图和饼图的区别

特性环形图饼图
数据表示使用环形的环段来表示数据的比例。使用圆形的扇形区域来表示数据的比例。
可视化效果由于中心是空的,环形图可以更容易地比较各个部分的大小。饼图可能使比较各个部分的大小变得困难,因为它们是连续的。
空间利用环形图中心的空间可以被用来放置标题或其他信息。饼图通常没有额外的空间来放置其他信息。
部分与整体关系环形图可以更清楚地展示部分与整体的关系,因为中心通常是空的。饼图展示部分与整体的关系,但可能不如环形图直观。
适合的数据量当类别较多时,环形图可能比饼图更易于解读。当类别较少时,饼图通常更容易解读。
读取数值环形图可以显示百分比或数值在环段旁边,但空间可能有限。饼图可以在扇形区域旁边显示百分比或数值,但可能会显得拥挤。
常见用途常用于显示多个类别在整体中的相对比例,尤其是当类别较多时。常用于显示几个类别在整体中的相对比例,尤其是当类别较少时。
视觉吸引力环形图有时被认为在视觉上更具吸引力,因为它们可以设计得更加独特。饼图是传统的数据可视化工具,可能在视觉上较为普通。

四、旭日图

1、概念

旭日图是一种数据可视化工具,通过环形切片的形式展示分层数据结构,中心点代表顶层分类,向外延伸的每一层代表数据的不同层级,切片大小与数据值成比例,颜色和标签帮助识别不同类别,交互性允许用户深入探索层级关系,常用于组织结构、预算分析和市场份额展示。

2、特点

旭日图(Sunburst Chart)是一种用于展示层次结构数据的图表,它以中心向外发散的形式展示数据,类似于太阳发出的光芒。以下是旭日图的主要特点:

  1. 层次结构:旭日图非常适合展示数据的层次结构,可以清晰地表示不同层级之间的关系。

  2. 中心向外:数据从中心向外发散,中心通常代表最顶层的分类,而外层则代表更细分的子分类。

  3. 大小表示:旭日图中,每个片段的大小通常与其代表的数值成比例,这样可以直观地展示不同类别数据的大小关系。

  4. 颜色编码:不同的类别可以用不同的颜色来表示,这样可以帮助观众更快地区分不同的数据块。

  5. 交互性:旭日图通常具有交互性,用户可以通过点击来探索不同层级的数据,或者查看更详细的信息。

  6. 视觉吸引力:由于其独特的视觉风格,旭日图在视觉上通常比较吸引人,适合用于报告和演示。

3、应用场景

以下是旭日图的一些具体应用场景:

  • 组织结构:展示公司或组织的层级结构。
  • 分类数据:展示产品类别、市场细分或其他分类数据的占比。
  • 预算分布:在财务分析中,展示预算在不同项目和部门中的分配情况。
  • 网站流量:展示网站的不同部分(如页面、板块)的访问量占比。
  • 时间分配:展示不同活动或任务在总时间中的占比。

需要注意的是,旭日图不适合展示大量数据,因为随着层级的增加,外层的片段可能会变得非常小,难以阅读。

4、案例实现

1、使用 Plotly Express 

import plotly.express as px

# 示例数据
data = {
    "类别": ["电子产品", "电子产品-手机", "电子产品-电脑",
           "服装", "服装-男装", "服装-女装",
           "食品", "食品-生鲜", "食品-零食"],
    "销售额": [100, 60, 40, 80, 50, 30, 70, 40, 30],
    "利润率": [25, 30, 20, 35, 40, 30, 20, 25, 15]
}

# 创建旭日图
fig = px.sunburst(
    data,
    path=['类别'],  # 层次结构路径
    values='销售额',  # 决定扇形大小的值
    color='利润率',   # 用颜色表示利润率
    color_continuous_scale='RdYlGn',  # 红-黄-绿色阶
    title='销售数据旭日图'
)

fig.show()

2、使用 Plotly Graph Objects (更灵活)

import plotly.graph_objects as go

# 示例数据
labels = ["总销售", "电子产品", "服装", "食品",
         "手机", "电脑", "男装", "女装", "生鲜", "零食"]
parents = ["", "总销售", "总销售", "总销售",
          "电子产品", "电子产品", "服装", "服装", "食品", "食品"]
values = [250, 100, 80, 70, 60, 40, 50, 30, 40, 30]

# 创建旭日图
fig = go.Figure(go.Sunburst(
    labels=labels,
    parents=parents,
    values=values,
    branchvalues="total",  # 值表示子节点总和
    marker=dict(
        colors=[10, 25, 35, 20, 30, 20, 40, 30, 25, 15],
        colorscale='RdYlGn'
    ),
    hovertemplate='<b>%{label}</b><br>销售额: %{value}<br>利润率: %{color}%'
))

# 添加标题
fig.update_layout(
    title_text='销售数据旭日图',
    margin=dict(t=30, l=0, r=0, b=0)
)

fig.show()

3、旭日图和环形图的复杂可视化实现

使用 Plotly 的 graph_objects 模块创建了一个包含环形图和旭日图的组合图表,用于展示多层次的销售数据分析。

import plotly.graph_objects as go
import pandas as pd

# 创建正确长度的示例数据
data = pd.DataFrame({
    "层级1": ["总销售额"]*5 + ["电子产品"]*4 + ["服装"]*3 + ["食品"]*3,
    "层级2": ["电子产品", "服装", "食品", "家居", "其他"] +
            ["手机", "电脑", "平板", "配件"] +
            ["男装", "女装", "童装"] +
            ["生鲜", "零食", "饮料"],
    "层级3": ["总销售额"]*5 +  # 确保长度一致
            ["旗舰机", "中端机", "入门机", ""] +  # 添加空字符串使长度匹配
            ["夏季", "冬季", ""] +
            ["进口", "国产", ""],
    "销售额": [500, 300, 200, 100, 50] +
            [200, 150, 100, 50] +
            [120, 100, 80] +
            [80, 70, 50],
    "利润率": [20, 25, 15, 10, 5] +
            [25, 30, 20, 15] +
            [30, 35, 25] +
            [15, 20, 10]
})

# 创建图形
fig = go.Figure()

# 添加环形图轨迹
fig.add_trace(go.Pie(
    labels=data[data["层级1"]=="总销售额"]["层级2"],
    values=data[data["层级1"]=="总销售额"]["销售额"],
    hole=0.5,
    domain=dict(x=[0.1, 0.9], y=[0.1, 0.9]),
    marker=dict(colors=['#636EFA', '#EF553B', '#00CC96', '#AB63FA', '#FFA15A']),
    textinfo='label+percent',
    textposition='inside',
    name="总销售额",
    hoverinfo='label+value+percent',
    sort=False
))

# 添加旭日图轨迹 - 只使用前两层数据
sunburst_data = data[data["层级1"]!="总销售额"]
fig.add_trace(go.Sunburst(
    labels=sunburst_data["层级2"],
    parents=sunburst_data["层级1"],
    values=sunburst_data["销售额"],
    branchvalues="total",
    domain=dict(x=[0.25, 0.75], y=[0.25, 0.75]),
    marker=dict(
        colors=sunburst_data["利润率"],
        colorscale='RdYlGn',
        cmid=20,
        colorbar=dict(title="利润率(%)")
    ),
    hovertemplate="<b>%{label}</b><br>销售额: %{value}<br>利润率: %{color:.1f}%<extra></extra>",
    name="分类详情",
    maxdepth=2
))

# 添加最内层环形标签
fig.add_trace(go.Pie(
    labels=["销售数据分析"],
    values=[1],
    hole=0.9,
    domain=dict(x=[0.4, 0.6], y=[0.4, 0.6]),
    marker=dict(colors=['white']),
    textinfo='label',
    textfont=dict(size=18, color='darkblue'),
    hoverinfo='none'
))

# 更新布局
fig.update_layout(
    title={
        'text': "<b>多层次销售数据分析旭日图</b>",
        'y':0.95,
        'x':0.5,
        'xanchor': 'center',
        'yanchor': 'top',
        'font': dict(size=24)
    },
    annotations=[
        dict(
            text="利润率",
            x=0.95, y=0.5,
            xanchor='left',
            showarrow=False,
            font=dict(size=12)
        )
    ],
    showlegend=False,
    height=700,
    width=800
)

fig.show()

五、漏斗图

1、概念

漏斗图是一种数据可视化工具,通过一系列按顺序排列的梯形或金字塔形图形来表示业务流程中的各个阶段,以及各阶段用户转化或流失的情况,常用于分析用户行为、产品转化率等关键指标,帮助企业识别流程中的瓶颈和优化点。

2、特点

漏斗图具有以下特点:

  1. 层次分明:漏斗图将复杂的过程简化为几个关键阶段,每个阶段清晰展示,便于理解整个流程的步骤。

  2. 直观展示流失:通过每个阶段的宽度变化,直观地展示出用户在每个阶段的转化率或流失情况。

  3. 易于比较:可以同时展示多个漏斗图,比如不同产品、不同时间段的转化情况,便于比较分析。

  4. 突出关键节点:漏斗图能够迅速指出流程中最关键的流失点,帮助决策者集中精力解决最紧迫的问题。

  5. 数据驱动:漏斗图基于实际数据绘制,使得决策更加科学和有据可依。

  6. 适用性广:适用于各种转化流程分析,如销售漏斗、用户注册流程、购物车结账流程等。

  7. 动态性:漏斗图可以随着时间的变化而更新,反映流程的动态变化。

  8. 交互性:在许多现代数据分析工具中,漏斗图可以与用户交互,如点击查看具体数据或进行深入分析。

  9. 简洁性:相较于其他复杂的数据图表,漏斗图更为简洁明了,便于非专业人士快速把握信息。

  10. 局限性:漏斗图虽然直观,但可能无法展示每个阶段内部的具体细节,对于复杂流程的分析可能不够全面。

3、应用场景

漏斗图在多个行业和领域都有广泛的应用,以下是一些常见的应用场景:

  1. 电子商务

    • 购物流程分析:从商品浏览到添加购物车、结算、支付等环节的转化率。
    • 用户注册转化:从访问网站到完成注册的转化情况。
  2. 市场营销

    • 营销渠道效果评估:分析不同营销渠道带来的用户转化情况。
    • 邮件营销:跟踪邮件打开、点击、转化等阶段的用户流失情况。
  3. 软件开发

    • 用户留存分析:从用户下载应用到活跃、留存的过程。
    • 应用内购买转化:分析用户从打开应用到完成购买的转化路径。
  4. 金融服务

    • 投资转化:从潜在客户接触到完成投资的过程。
    • 贷款申请流程:从申请到审批、放款的转化率。
  5. 教育行业

    • 学生招生流程:从咨询到报名、缴费的转化情况。
    • 在线课程完成率:从课程注册到完成学习的转化率。
  6. 医疗保健

    • 患者就诊流程:从预约到实际就诊、治疗的转化。
    • 健康管理服务:从注册到持续使用服务的用户转化。
  7. 客户服务

    • 客户支持流程:从问题提出到解决的客户满意度转化。
    • 客户流失分析:识别客户流失的关键阶段。
  8. 人力资源

    • 招聘流程:从简历筛选到面试、录用的人才转化率。
    • 员工培训与留存:从入职培训到员工留存的转化情况。
  9. 内容创作与媒体

    • 内容消费分析:从内容浏览到互动、分享的用户行为转化。
    • 订阅转化:从免费用户到付费订阅者的转化路径。

漏斗图通过这些场景中的应用,帮助企业和组织优化流程、提高效率并增加转化率。

4、案例实现

生成交互式图表,可以悬停查看详细信息。

import plotly.graph_objects as go

# 漏斗阶段数据
stages = ["潜在客户", "需求确认", "方案报价", "谈判", "成交"]
values = [1000, 800, 600, 400, 200]  # 每个阶段的数值(需递减)

# 创建漏斗图
fig = go.Figure(go.Funnel(
    y=stages,
    x=values,
    textinfo="value+percent initial",
    opacity=0.8,
    marker={
        "color": ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"],
        "line": {"width": 2, "color": "white"}
    },
    connector={"line": {"color": "gray", "dash": "dot", "width": 3}}
))

# 设置布局
fig.update_layout(
    title="销售转化漏斗图",
    font=dict(size=14),
    margin=dict(l=100, r=100, t=80, b=80),
    showlegend=False
)

# 显示图表
fig.show()

六、矩形树图

1、概念

1、树图的概念

树图(Treemap)是一种数据可视化工具,用于展示分层数据结构,即数据的树状结构。树图将整个数据集分割成多个矩形区域,每个矩形代表树结构中的一个节点,矩形的大小和颜色通常表示不同属性的大小或重要性。树图非常适合于展示大型复杂数据集,尤其是在空间有限的情况下。

2、矩形树图的概念

矩形树图(Treemap)是一种基于面积的可视化方式,它通过使用嵌套的矩形来表示层次结构中的数据。每个矩形代表一个节点,其面积通常与某个度量(如数量、大小或频率)成比例。矩形树图非常适合展示大量分层数据,因为它们能够有效地利用空间,并且可以清晰地展示不同部分之间的相对大小。

2、特点

1、树图的特点

  1. 空间利用率高:树图通过将数据集分割成嵌套的矩形,能够高效地利用可用空间,适合展示大量数据。

  2. 层次结构明显:树图清晰地展示了数据的层次结构,使得用户能够直观地看到不同数据点之间的层级关系。

  3. 大小表示数值:矩形的大小直接映射到数据的大小,使得用户能够快速识别哪些数据项更为重要或具有更大的影响。

  4. 颜色编码:树图通常使用颜色来区分不同的类别或属性,增强了数据的可读性和视觉吸引力。

  5. 交互性:许多树图实现都支持交互功能,如点击、悬停等,用户可以通过这些交互来探索数据的更多细节。

  6. 可扩展性:树图可以轻松地扩展以包含更多的数据层级或细节,而不需要大幅改变图表的整体布局。

2、矩形树图的特点

  1. 空间利用率高:它能够有效地利用可用空间,展示大量层次化数据,适合于展现具有多级分类的数据集。

  2. 层次结构清晰:通过矩形的嵌套和排列,矩形树图能够清晰地展示数据的层次结构和类别关系。

  3. 易于比较大小:矩形的大小直观地代表了数据的大小或频数,使得用户可以快速比较不同类别或项目的重要性。

  4. 可视化维度丰富:除了大小,矩形树图还可以通过颜色、标签、阴影等视觉属性来传达额外的数据维度。

  5. 交互性:矩形树图通常可以与用户交互,如点击查看更多细节、缩放、搜索等,增强了用户体验。

  6. 灵活性:可以适应不同大小的数据集,无论是小型数据集还是大型复杂数据集。

  7. 可定制性:可以根据需求定制外观和布局,以适应特定的数据展示需求。

  8. 信息密度高:能够在有限的空间内展示大量的信息,适合于需要在有限区域内展示复杂数据的场景。

  9. 适合多级分类:对于具有多个分类层级的数据,矩形树图能够有效地展示每一层级的数据分布。

  10. 识别模式:通过视觉布局,用户可以更容易地识别数据中的模式、趋势和异常。

3、应用场景

1、树图的应用场景

  • 文件系统分析:展示硬盘上不同文件夹和文件的大小。
  • 网站流量分析:展示网站不同部分的访问量。
  • 财务分析:展示公司不同部门或产品的收入和利润。
  • 市场分析:展示不同市场细分或产品的市场份额。

2、矩形树图的应用场景

矩形树图(Treemap)是一种数据可视化工具,它通过使用嵌套的矩形来表示层次结构的数据。以下是矩形树图的一些常见应用场景:

  1. 文件系统分析:显示硬盘上文件夹和文件的大小,帮助用户识别哪些文件或文件夹占用了最多的空间。

  2. 网站流量分析:展示网站中各个部分或页面的访问量,帮助网站管理员了解哪些部分更受欢迎。

  3. 市场份额分析:在商业分析中,用于展示不同产品、公司或市场在整体市场中的占比。

  4. 财务数据展示:展示公司不同部门或项目的成本、收入和利润分布。

  5. 资产组合管理:在金融领域,用于展示投资组合中不同资产类别的权重和表现。

  6. 商品类别销售分析:在零售业中,用于展示不同商品类别或品牌的销售情况。

  7. 社交媒体分析:展示社交媒体平台上不同话题、标签或用户的影响力分布。

  8. 软件包依赖关系:在软件开发中,用于展示项目中不同库和模块的大小及其依赖关系。

  9. 教育资源分配:在教育机构中,用于展示不同学科、课程或项目的资源分配情况。

  10. 健康数据分析:展示不同疾病、症状或治疗方法的统计数据,帮助医疗专业人员和研究者的分析。

  11. 地理信息系统(GIS):展示不同地理区域的人口、经济或环境数据。

矩形树图由于其信息密度高和层次结构展示的能力,非常适合于需要快速理解和比较大量分类数据的场景。

4、案例实现

1、使用 Plotly Express 

Plotly Express 将创建一个包含指定数据的矩形树图,并显示在默认的浏览器中。用户可以通过鼠标悬停、点击等操作来查看每个节点的详细信息。图表的颜色和大小都会根据销售额的值来表示。

import plotly.express as px

# 示例数据
data = {
    "分类": ["电子产品", "电子产品-手机", "电子产品-平板", "电子产品-电脑",
            "手机-A品牌", "手机-B品牌", "电脑-笔记本", "电脑-台式机"],
    "销售额": [100, 60, 15, 25, 40, 20, 15, 10],
    "父类": ["", "电子产品", "电子产品", "电子产品",
            "电子产品-手机", "电子产品-手机", "电子产品-电脑", "电子产品-电脑"]
}

# 创建矩形树图
fig = px.treemap(
    data,
    path=['分类'],  # 层次结构路径
    values='销售额',  # 决定矩形大小的值
    title='电子产品销售分布矩形树图',
    color='销售额',  # 用颜色表示销售额
    color_continuous_scale='Blues'
)

fig.update_layout(margin=dict(t=50, l=25, r=25, b=25))
fig.show()

2、使用 Squarify + Matplotlib

创建一个矩形树图,其中每个矩形代表一个电子产品类别,其大小和颜色表示销售数据。

import matplotlib.pyplot as plt
import squarify

# 示例数据
categories = ['手机', '平板', '笔记本', '台式机']
sales = [60, 15, 15, 10]
colors = ['#4B8BBE', '#306998', '#FFE873', '#FFD43B']

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# 创建矩形树图
plt.figure(figsize=(10, 6))
squarify.plot(
    sizes=sales,
    label=[f"{cat}\n{sale}%" for cat, sale in zip(categories, sales)],
    color=colors,
    alpha=0.7,
    text_kwargs={'fontsize':12}
)

plt.title("电子产品销售分布矩形树图", fontsize=16)
plt.axis('off')  # 关闭坐标轴
plt.show()

3、交互式矩形树图 (Plotly)

Plotly 将创建一个包含指定数据的交互式矩形树图,用户可以通过鼠标悬停、点击等操作来查看每个节点的详细信息。

import plotly.graph_objects as go

# 示例数据
labels = ["电子产品", "手机", "平板", "电脑", "A品牌", "B品牌", "笔记本", "台式机"]
parents = ["", "电子产品", "电子产品", "电子产品",
           "手机", "手机", "电脑", "电脑"]
values = [100, 60, 15, 25, 40, 20, 15, 10]

# 创建交互式矩形树图
fig = go.Figure(go.Treemap(
    labels=labels,
    parents=parents,
    values=values,
    marker_colorscale='Blues',
    textinfo="label+value+percent parent+percent entry"
))

fig.update_layout(
    title="电子产品销售分布(交互式矩形树图)",
    margin=dict(t=50, l=25, r=25, b=25)
)

fig.show()

七、圆堆积图

1、概念

圆堆积图,也称为环形堆积图,是一种多层次的圆形图表,它通过同心圆环的形式来展示数据的层次结构。每个圆环代表数据的一个层级,而圆环内的各个扇形区域(切片)则代表该层级中的不同分类或组。这些切片的大小与其代表的数据值成比例,可以堆积或并列展示,以清晰地表现出每个分类在整体中的相对大小和比例关系。圆堆积图特别适用于展示包含多个层级和分类的数据集,它能够有效地利用圆环的面积和排列来传达复杂的分层数据,使得观众能够一目了然地理解数据的组成和比例。

2、特点

圆堆积图(Circular Stacked Bar Chart 或 Circle Stacked Bar Chart)是一种特殊类型的堆积图,它将堆积条形图的概念应用于圆形布局中。以下是圆堆积图的一些主要特点:

  1. 圆形布局:与传统的条形图或堆积条形图不同,圆堆积图的数据是以圆形的方式呈现的,每个扇形区域代表一个类别。

  2. 堆积显示:圆堆积图通过堆积的方式显示多个组的数据,每个组的数据以不同的颜色或阴影表示,相互堆叠在一起。

  3. 角度表示数量:每个扇形区域的角度大小表示该类别的数据量或比例,角度越大,表示的数据量越多。

  4. 易于比较比例:由于圆堆积图的圆形布局,观察者可以更容易地比较不同类别或组之间的比例关系。

  5. 视觉吸引力:圆堆积图通常比传统的条形图更具视觉吸引力,可以更有效地吸引观众的注意力。

  6. 适合展示分类数据:圆堆积图特别适合展示分类数据,尤其是当类别数量较多时,它可以有效地利用空间。

  7. 层次结构:圆堆积图可以展示数据的层次结构,例如,外层圆可以表示主要类别,内层圆可以表示子类别。

  8. 颜色编码:圆堆积图通常使用不同的颜色来区分不同的数据组或类别,这有助于观众识别和比较数据。

  9. 交互性:在一些高级的实现中,圆堆积图可以具有交互性,允许用户悬停、点击或过滤以查看更多细节。

  10. 局限性:虽然圆堆积图在视觉上很有吸引力,但它可能不适合展示大量的数据细节,因为圆形布局可能在空间上不如线性布局那样清晰。

圆堆积图在数据可视化中是一种相对较新的图表类型,它结合了传统的堆积图和饼图的优点,但在使用时需要注意确保数据的清晰性和可读性。

3、应用场景

圆堆积图由于其独特的视觉呈现方式,适用于多种数据分析和展示的场景。以下是一些圆堆积图的应用场景:

  1. 市场份额分析:圆堆积图可以用来展示不同产品或品牌在市场中的占比,以及它们随时间的变化情况。

  2. 预算分配:在财务分析中,圆堆积图可以用来展示不同项目或部门在总预算中的分配比例。

  3. 资源分配:圆堆积图可以展示资源(如人力资源、设备、资金等)在不同任务或项目中的分配情况。

  4. 时间管理:个人或团队可以使用圆堆积图来分析时间在不同活动或任务上的分配情况。

  5. 分类数据比较:当需要比较多个类别中的子类别数据时,圆堆积图可以直观地展示这些比例关系。

  6. 人口统计:圆堆积图可以用来展示人口统计数据,如不同年龄段、性别、种族等在总人口中的比例。

  7. 投票和选举分析:在政治分析中,圆堆积图可以用来展示不同政党或候选人在选举中的得票比例。

  8. 产品组成分析:在制造业,圆堆积图可以用来展示产品中不同组件或材料的使用比例。

  9. 网站流量来源:在数字营销中,圆堆积图可以用来展示网站流量来自不同渠道(如搜索引擎、社交媒体、直接访问等)的比例。

  10. 能源消耗分析:圆堆积图可以用来展示不同能源类型(如电力、天然气、石油等)在总能源消耗中的占比。

  11. 教育领域:在教育机构中,圆堆积图可以用来展示不同学科的学生人数比例,或者不同教育项目的预算分配。

  12. 环境监测:圆堆积图可以用来展示不同污染物在总污染量中的比例,或者不同地区的环境质量比较。

在选择使用圆堆积图时,重要的是要考虑数据的特性和展示的目的,确保图表能够有效地传达信息,同时也要注意避免误导观众。圆堆积图虽然视觉上吸引人,但可能不适合展示过于复杂或详细的数据。

4、案例实现

1、使用 circlify 库

生成的圆堆积图会显示多个大小不一的圆紧密排列,数值越大的圆面积越大。所有圆被约束在一个更大的圆形边界内,形成美观的堆积效果。

import circlify
import matplotlib.pyplot as plt

# 示例数据:每个数值代表圆的面积
data = [19, 17, 13, 11, 7, 5]

# 计算圆的位置和半径(默认归一化到单位圆内)
circles = circlify.circlify(
    data,
    show_enclosure=True,
    target_enclosure=circlify.Circle(x=0, y=0, r=1)
)

# 创建画布
fig, ax = plt.subplots(figsize=(10, 10))
ax.set_title("圆堆积图示例", fontsize=14)

# 设置字体以支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

ax.axis('off')  # 隐藏坐标轴
ax.set_aspect('equal')  # 确保比例一致

# 遍历所有圆并绘制
for circle in circles:
    # 跳过最外层的容器圆(无数据关联)
    if circle.ex is None:
        continue

    # 获取圆心坐标和半径
    x, y, r = circle.x, circle.y, circle.r
    # 绘制圆形
    ax.add_patch(
        plt.Circle(
            (x, y),
            r,
            ec='black',  # 边框颜色
            fc='#8dd3c7',  # 填充颜色
            alpha=0.6,  # 透明度
            lw=1  # 边框宽度
        )
    )
    # 添加数据标签
    label = f"{circle.ex['datum']}"  # 注意:circle.ex['datum'] 应该是 circle.ex['value']
    ax.text(x, y, label, ha='center', va='center', fontsize=10)

# 设置坐标范围
plt.xlim(-1.1, 1.1)
plt.ylim(-1.1, 1.1)

# 显示图形
plt.show()

2、使用 plotly 实现交互式圆堆积图

import plotly.graph_objects as go
import circlify

# 示例数据
data = {
    "name": "总数据",
    "children": [
        {"name": "类别A", "value": 100},
        {"name": "类别B", "value": 80},
        {"name": "类别C", "value": 60},
        {"name": "类别D", "value": 30}
    ]
}

# 计算圆形布局
circles = circlify.circlify(
    [item["value"] for item in data["children"]],
    show_enclosure=False
)

# 创建图形
fig = go.Figure()

# 添加圆形
for idx, circle in enumerate(circles):
    fig.add_trace(go.Scatter(
        x=[circle.x],
        y=[circle.y],
        mode="markers+text",
        marker=dict(
            size=circle.r*1000,  # 增加大小以适应图表
            sizemode="area",  # 使用面积来表示大小
            color=idx,  # 使用索引作为颜色
            colorscale="Viridis"  # 使用颜色比例尺
        ),
        text=data["children"][idx]["name"],
        textposition="middle center",
        hoverinfo="text+name",
        hovertext=f"{data['children'][idx]['name']}: {data['children'][idx]['value']}"
    ))

# 设置布局
fig.update_layout(
    title="交互式圆堆积图",
    xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
    yaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
    plot_bgcolor="white",
    height=600,
    width=600,  # 添加宽度以保持圆形
    showlegend=False
)

fig.show()

八、各图表对比

图表类型特点适用场景优点缺点
韦恩图显示集合之间的交集和并集关系比较不同集合的相似性和差异性直观展示集合关系,易于理解数据量较大时,图表可能变得复杂
饼图显示各部分占整体的比例关系展示单一数据集的组成比例易于理解,视觉效果好无法展示多个数据集的比较,信息量有限
环形图类似于饼图,但中心为空白展示单一数据集的组成比例,中心可添加其他信息中心空白区域可用于添加文字或图表,视觉效果较好信息量有限,不适合展示复杂数据
旭日图层级结构,显示父子关系展示多层级的组成关系清晰展示层级结构,易于理解数据量较大时,图表可能变得复杂
圆堆积图层级结构,各部分堆积成圆形展示多层级的组成关系和比例同时展示层级和比例关系,信息丰富数据量较大时,图表可能不够清晰
矩形树图层级结构,用矩形表示各部分展示多层级的组成关系和比例空间利用率高,适合展示大量数据层级较多时,可能不够直观
漏斗图层级结构,形状像漏斗展示用户转化过程或销售流程直观展示转化过程,易于发现瓶颈只能展示单向流程,不适合循环或多分支流程

九、总结

本文深入探讨了局部与整体关系的数据可视化技术,涵盖了韦恩图、饼图、环形图、旭日图、圆堆积图和矩形树图等多种图表形式。每种图表都具有其独特的视觉特性和分析优势,适用于不同的数据解读和应用场景。文章详细阐述了这些图表的特点,如韦恩图的集合关系展示、饼图的占比分析、环形图的层次分明、旭日图的递归结构、圆堆积图的群体分布以及矩形树图的面积映射。同时,本文还详细介绍了使用诸如matplotlib等工具实现这些图表的步骤和技巧,并展示了实际应用中的可视化结果,为数据科学家和分析师提供了全面的数据可视化解决方案和决策支持工具。

附录

表格内容对比了matplotlib、plotly和circlify这三个库在创建圆堆积图方面的特点:

特性/库

matplotlibplotlycirclify
类型Python的一个绘图库,主要用于2D绘图一个交互式图表库,支持多种图表类型一个专门用于生成圆形布局的库
易用性相对复杂,需要编写更多代码用户友好,高度封装,易于使用专门用于圆形布局,简单易用
交互性有限,支持基本的交互操作强大,支持丰富的交互功能无交互功能,但可以与其他库结合使用
图表类型支持多种图表,包括圆堆积图支持多种图表,包括圆堆积图专门用于生成圆形布局,如圆堆积图
可定制性高,可以详细定制图表的各个方面高,提供大量的配置选项专门定制圆形布局,有限的自定义选项
在线集成不支持在线直接集成支持在线集成,如Plotly Dash可以与其他库结合使用,如Jupyter
社区和支持大型社区,广泛的支持和文档大型社区,良好的支持和文档较小社区,有限的文档和资源
学习曲线中等到困难简单到中等简单
兼容性主要用于Python环境支持多种语言,包括Python主要用于Python环境
动画和过渡效果有限的支持强大的动画和过渡效果支持无动画支持,但可以静态展示

plotly.graph_objsplotly.express的对比:

特性plotly.graph_objsplotly.express
图表类型和定制选项提供最全面的图表类型和定制选项提供简洁的接口,快速生成图表
使用难度较复杂,需要更多代码简单易用,少量代码
用途适用于需要高度定制和复杂图表的场景适用于快速数据探索和常见图表的生成
交互性高度交互性良好的交互性
集成可以独立使用,也可与Dash集成主要用于快速可视化,不直接与Dash集成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值