数据可视化进阶:饼图、环形图与南丁格尔玫瑰图实现占比分析

数据可视化进阶:饼图、环形图与南丁格尔玫瑰图实现占比分析

在数据可视化领域,占比分析是核心需求之一。不同图表类型通过独特的视觉编码方式,能有效传达数据间的比例关系。本文将深入解析三种主流占比可视化方案:饼图、环形图和南丁格尔玫瑰图,通过完整代码实现和参数详解,帮助开发者快速掌握不同场景下的数据表达技巧。

一、基础占比可视化:饼图实现

饼图作为最经典的占比可视化工具,通过扇形面积直观展示各分类占比。其核心实现步骤包括数据准备、图表初始化、样式配置和渲染输出。

1.1 基础饼图实现

  1. from pyecharts.charts import Pie
  2. from pyecharts import options as opts
  3. # 数据准备
  4. data = [("产品A", 35), ("产品B", 25), ("产品C", 20), ("产品D", 15), ("其他", 5)]
  5. # 图表初始化
  6. pie = (
  7. Pie(init_opts=opts.InitOpts(width="800px", height="600px"))
  8. .add(
  9. series_name="销售占比",
  10. data_pair=data,
  11. radius=["30%", "70%"], # 内外半径设置
  12. label_opts=opts.LabelOpts(formatter="{b}: {c}%")
  13. )
  14. .set_global_opts(
  15. title_opts=opts.TitleOpts(title="2023年产品销售占比"),
  16. legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%")
  17. )
  18. )
  19. pie.render("basic_pie.html")

1.2 关键参数解析

  • radius参数控制饼图大小:单值表示圆形,双值表示环形(内半径+外半径)
  • label_opts支持多种标签格式:{a}系列名、{b}分类名、{c}数值、{d}百分比
  • rosetype参数控制是否显示为南丁格尔玫瑰图模式

二、环形图:强化中心区域利用

环形图通过保留中心空白区域,既保持了占比表达的直观性,又为附加信息展示提供了空间。其实现关键在于合理设置内外半径参数。

2.1 环形图实现方案

  1. doughnut = (
  2. Pie(init_opts=opts.InitOpts(width="900px", height="700px"))
  3. .add(
  4. series_name="设备占比",
  5. data_pair=[("手机", 45), ("平板", 20), ("PC", 25), ("其他", 10)],
  6. radius=["40%", "65%"], # 内半径40%,外半径65%
  7. label_opts=opts.LabelOpts(position="outer", formatter="{b}\n{d}%")
  8. )
  9. .set_series_opts(
  10. tooltip_opts=opts.TooltipOpts(
  11. trigger="item",
  12. formatter="{a} <br/>{b}: {c} ({d}%)"
  13. )
  14. )
  15. .set_global_opts(
  16. title_opts=opts.TitleOpts(title="终端设备访问占比"),
  17. graphic_opts=[ # 中心区域添加文字
  18. opts.GraphicText(
  19. graphic_item=opts.GraphicItem(left="center", top="center"),
  20. graphic_textstyle_opts=opts.GraphicTextStyleOpts(
  21. text="总访问量\n12.5万",
  22. font="bold 20px Microsoft YaHei",
  23. graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(fill="#333")
  24. )
  25. )
  26. ]
  27. )
  28. )
  29. doughnut.render("doughnut_chart.html")

2.2 环形图应用场景

  • 需要同时展示占比和中心汇总信息时
  • 分类数量较多(超过6类)需要节省空间时
  • 需要与其他图表组合展示时

三、南丁格尔玫瑰图:强化差异感知

南丁格尔玫瑰图通过调整扇形半径而非面积来表达数值,能有效放大差异,特别适合展示数量级差异较大的数据。

3.1 基础玫瑰图实现

  1. rose = (
  2. Pie(init_opts=opts.InitOpts(width="1000px", height="800px"))
  3. .add(
  4. series_name="访问来源",
  5. data_pair=[
  6. ("直接访问", 385),
  7. ("邮件营销", 179),
  8. ("联盟广告", 234),
  9. ("搜索引擎", 290),
  10. ("视频广告", 154)
  11. ],
  12. radius=["30%", "75%"],
  13. rosetype="radius", # 关键参数:按半径显示
  14. label_opts=opts.LabelOpts(formatter="{b}: {c}次\n({d}%)")
  15. )
  16. .set_series_opts(
  17. itemstyle_opts=opts.ItemStyleOpts(
  18. border_color="#fff",
  19. border_width=2
  20. )
  21. )
  22. .set_global_opts(
  23. title_opts=opts.TitleOpts(title="网站访问来源分布"),
  24. visualmap_opts=opts.VisualMapOpts(
  25. max_=400,
  26. is_piecewise=True,
  27. range_color=["#50A3BA", "#EAC736", "#D94E5D"]
  28. )
  29. )
  30. )
  31. rose.render("nightingale_rose.html")

3.2 玫瑰图参数详解

  • rosetype参数:
    • "radius":按半径显示(面积与半径平方成正比)
    • "area":按面积显示(面积与数值成正比)
  • 视觉映射优化:
    • 使用visualmap组件建立数值与颜色的映射关系
    • 设置is_piecewise=True实现分段色阶
    • 通过border_width增强扇形区分度

四、进阶实践:多图表组合与动态交互

4.1 多图表组合展示

  1. from pyecharts.charts import Page
  2. page = Page(layout=Page.DraggablePageLayout)
  3. page.add(pie, doughnut, rose)
  4. page.render("dashboard.html")

4.2 动态数据更新实现

  1. import json
  2. from flask import Flask, render_template
  3. app = Flask(__name__)
  4. @app.route("/")
  5. def index():
  6. # 模拟动态数据
  7. dynamic_data = [
  8. ("华东", 42), ("华北", 28), ("华南", 18), ("西部", 12)
  9. ]
  10. return render_template(
  11. "dashboard.html",
  12. chart_data=json.dumps(dynamic_data)
  13. )
  14. if __name__ == "__main__":
  15. app.run(debug=True)

对应的HTML模板需要包含ECharts的JS加载和动态渲染逻辑。

五、最佳实践建议

  1. 分类数量控制

    • 饼图/环形图适合5-7个分类
    • 超过9个分类建议使用条形图替代
  2. 颜色选择原则

    • 使用色盲友好型配色方案
    • 相邻扇形保持足够对比度
    • 避免使用过多相似色系
  3. 标签显示优化

    • 小占比分类使用”其他”合并显示
    • 开启引导线避免标签重叠
    • 数值与百分比双标签显示
  4. 交互增强方案

    • 添加数据缩放(dataZoom)组件
    • 实现图例筛选功能
    • 添加tooltip详细信息展示

六、性能优化技巧

  1. 大数据量处理

    • 超过100个数据点时考虑聚合显示
    • 使用large=True参数开启大数据模式
  2. 渲染优化

    • 设置合理的widthheight
    • 关闭不必要的动画效果
    • 使用svg渲染器替代canvas(当数据量较小时)
  3. 服务端渲染

    • 使用pyecharts-snapshot生成静态图片
    • 考虑使用headless浏览器方案

通过系统掌握这三种占比可视化技术,开发者可以根据具体业务场景选择最合适的表达方式。饼图的直观性、环形图的空间利用率和南丁格尔玫瑰图的差异放大能力,构成了完整的占比分析工具链。结合动态交互和性能优化技术,可以构建出既美观又实用的数据可视化解决方案。