如何用Python创建示例中的比例面积饼图类信息图?
Python实现嵌套比例面积图(对应目标图表类型)
图表类型确认
你提到的"proportional area chart pie"实际是嵌套比例面积图,属于层级数据可视化的一种,通过嵌套区块的大小展示不同层级数据的占比与从属关系,无需Tableau即可用Python实现。
实现方案
方案1:Matplotlib绘制静态嵌套比例图
通过多层同心圆饼图模拟效果,适合快速生成静态图:
import matplotlib.pyplot as plt import numpy as np # 层级占比数据:外层大类、中层子类、内层细分项 outer_sizes = [40, 30, 30] middle_sizes = [15, 25, 10, 20, 15, 15] inner_sizes = [5,10,12,13,4,6,8,12,7,8,5,10] # 自定义配色 outer_colors = ['#ff9999','#66b3ff','#99ff99'] middle_colors = ['#ffcccc','#ff6666','#99ccff','#3399ff','#ccffcc','#33cc33'] inner_colors = plt.cm.tab20(np.linspace(0,1,len(inner_sizes))) # 创建画布并绘制多层饼图 fig, ax = plt.subplots(figsize=(8,8)) ax.pie(outer_sizes, radius=1, colors=outer_colors, wedgeprops=dict(width=0.3, edgecolor='white')) ax.pie(middle_sizes, radius=0.7, colors=middle_colors, wedgeprops=dict(width=0.2, edgecolor='white')) ax.pie(inner_sizes, radius=0.5, colors=inner_colors, wedgeprops=dict(width=0.2, edgecolor='white')) # 保持正圆形并展示 ax.set_aspect('equal') plt.title('嵌套比例面积图') plt.show()
方案2:Plotly绘制交互式嵌套比例图(旭日图)
支持hover显示详情,适合需要交互的场景:
import plotly.express as px # 层级结构化数据:包含节点ID、标签、父节点、数值 data = dict( ids = ['大类A', '大类B', '大类C', '大类A-子1', '大类A-子2', '大类B-子1', '大类B-子2', '大类C-子1', '大类C-子2', 'A子1-项1', 'A子1-项2', 'A子2-项1', 'A子2-项2', 'B子1-项1', 'B子1-项2', 'B子2-项1', 'B子2-项2', 'C子1-项1', 'C子1-项2', 'C子2-项1', 'C子2-项2'], labels = ['大类A', '大类B', '大类C', '子项1', '子项2', '子项1', '子项2', '子项1', '子项2', '细分1', '细分2', '细分1', '细分2', '细分1', '细分2', '细分1', '细分2', '细分1', '细分2', '细分1', '细分2'], parents = ['', '', '', '大类A', '大类A', '大类B', '大类B', '大类C', '大类C', '大类A-子1', '大类A-子1', '大类A-子2', '大类A-子2', '大类B-子1', '大类B-子1', '大类B-子2', '大类B-子2', '大类C-子1', '大类C-子1', '大类C-子2', '大类C-子2'], values = [40, 30, 30, 15,25,10,20,15,15, 5,10,12,13,4,6,8,12,7,8,5,10] ) # 生成旭日图 fig = px.sunburst( data, ids='ids', labels='labels', parents='parents', values='values', title='交互式嵌套比例面积图' ) fig.show()
注意事项
- 需按层级关系整理数据,确保子项与父类对应正确
- 自定义配色时避免相近颜色,提升可读性
- Plotly会自动计算占比,无需手动调整各层级数值总和
内容的提问来源于stack exchange,提问作者new_user
相关产品推荐
相关产品推荐

