You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python的Plotly饼图中用自定义图标展示性别数据

用自定义图标替代Plotly饼图分区的实现方法

Plotly原生饼图组件不支持直接替换扇形分区为自定义图标,但可以通过散点图+自定义图标配合布局设置来模拟这种效果,同时保留数据占比的可视化逻辑。

实现步骤

1. 准备图标资源

准备对应类别的自定义图标(推荐用SVG格式,方便缩放),比如女性和男性的专属图标;如果只是快速测试,也可以用内置emoji替代。

2. 关联数据与图标属性

根据数据的占比计算图标显示大小(占比越大,图标尺寸越大),同时规划图标在画布中的位置(可以模拟饼图的扇形分布,也可以用简单的对称布局)。

3. 用散点图渲染图标

使用Plotly的散点图组件,通过配置marker参数加载自定义图标,同时绑定数据值控制图标尺寸、显示对应数值。

示例代码

快速测试版(用内置图标)

基于你的性别数据,用Plotly内置图标快速实现效果:

import plotly.express as px
import pandas as pd

# 你的原始数据
df = pd.DataFrame({
    'gender': ['Female', 'male'],
    'count': [666, 1889]
})

# 计算占比,转换为图标尺寸(缩放系数可自行调整)
total = df['count'].sum()
df['icon_size'] = df['count'] / total * 350

# 设置图标位置(模拟左右分布,也可按极坐标角度计算扇形位置)
df['x'] = [1.5, 3.5]
df['y'] = [2, 2]

# 映射内置图标
icon_mapping = {
    'Female': 'female-sign',
    'male': 'male-sign'
}
df['icon'] = df['gender'].map(icon_mapping)

# 绘制散点图
fig = px.scatter(df, x='x', y='y', size='icon_size', 
                 symbol='icon', color='gender',
                 text='count', hover_data={'gender': True, 'count': True})

# 隐藏无关元素,优化布局
fig.update_layout(
    xaxis_visible=False,
    yaxis_visible=False,
    plot_bgcolor='white',
    showlegend=True
)

# 调整数值文本位置
fig.update_traces(textposition='top center')

fig.show()

自定义SVG图标版

如果要使用自己设计的SVG图标,可将图标转为Base64编码后加载:

import plotly.graph_objects as go
import pandas as pd
import base64

# 原始数据
df = pd.DataFrame({
    'gender': ['Female', 'male'],
    'count': [666, 1889]
})
total = df['count'].sum()
df['icon_size'] = df['count'] / total * 400
df['x'] = [1.5, 3.5]
df['y'] = [2, 2]

# 将SVG文件转为Base64(替换为你的图标路径)
def svg_to_base64(svg_path):
    with open(svg_path, 'rb') as f:
        return 'data:image/svg+xml;base64,' + base64.b64encode(f.read()).decode()

female_icon = svg_to_base64('female.svg')
male_icon = svg_to_base64('male.svg')

# 逐个添加图标轨迹
fig = go.Figure()
for _, row in df.iterrows():
    fig.add_trace(go.Scatter(
        x=[row['x']], y=[row['y']],
        mode='markers+text',
        marker=dict(
            size=row['icon_size'],
            image=female_icon if row['gender'] == 'Female' else male_icon,
            sizemode='diameter'
        ),
        text=str(row['count']),
        textposition='top center',
        name=row['gender']
    ))

# 优化布局
fig.update_layout(xaxis_visible=False, yaxis_visible=False, plot_bgcolor='white')
fig.show()

关键提示

  • 这种方式是模拟饼图的占比逻辑,并非修改原生饼图组件,需要手动控制图标位置和尺寸
  • 如果要完全模拟饼图的扇形分布,可以通过极坐标计算每个图标的角度位置,用go.Scatterpolar实现
  • SVG格式的图标能保证缩放后的清晰度,避免失真问题

内容的提问来源于stack exchange,提问作者sal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:10:17