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

基于身高体重的性别占比可视化:Plotly代码有效性及切换咨询

问题与代码分析

我使用包含500人性别、身高、体重及BMI的数据集,希望绘制可视化图表展示性别占比随身高、体重的变化。尝试了两种Plotly实现方案,但无法判断正确性,同时想实现数据集视图的切换功能。以下是我的代码:

数据预处理代码

# 将'Male'转为0,'Female'转为1
df["Gender"] = df["Gender"].map({"Male": 0, "Female": 1})

data_subset = df.copy(True).dropna(subset=["Gender"])

# 按身高、体重分组,计算每组的女性占比(均值)
gender_rate = data_subset.groupby(["Height", "Weight"])["Gender"].mean().reset_index()

方案一代码(我认为这个是对的,但想要切换数据集)

plot = go.Scatter(
        x=gender_rate["Height"],
        y=gender_rate["Weight"],
        mode="markers",
        marker=dict(
                color=gender_rate["Gender"],
                colorscale="Bluered_r",
                showscale=True,
                colorbar=dict(title="Gender Rate"),
        )  # 原代码缺失该闭合括号
)
go.Figure(data=[plot])

方案二代码

# 原代码存在索引语法错误,正确写法如下
plot=go.Scatter(
         x=data_subset[data_subset["Gender"] == 1]["Height"],
         y=data_subset[data_subset["Gender"] == 1]["Weight"],
        mode="markers",
        name="Female",
)

plot1=go.Scatter(
         x=data_subset[data_subset["Gender"] == 0]["Height"],
         y=data_subset[data_subset["Gender"] == 0]["Weight"],
        mode="markers",
        name="Male",
)
go.Figure(data=[plot, plot1])

方案正确性分析

  1. 方案一:思路完全匹配需求。通过groupby([Height, Weight])计算每个身高体重组合下的女性占比(因Female映射为1,均值即女性占比),用颜色深浅展示占比变化,能直观呈现不同身高体重区间的性别分布倾向。原代码仅存在语法错误(marker字典未闭合),修正后可正常运行。
  2. 方案二:不符合需求。该方案是将男女个体数据分开绘制散点,展示的是单个样本的身高体重分布,而非性别占比的聚合结果。

带切换功能的完整实现

以下代码实现了两种视图的切换:点击下拉菜单可在「性别占比聚合视图」和「男女个体散点视图」之间切换。

import plotly.graph_objects as go
import pandas as pd

# 数据预处理(假设已加载数据集到df)
df["Gender"] = df["Gender"].map({"Male": 0, "Female": 1})
data_subset = df.copy().dropna(subset=["Gender"])
gender_rate = data_subset.groupby(["Height", "Weight"])["Gender"].mean().reset_index()

# 创建两种视图的trace
# 视图1:性别占比聚合散点
trace_rate = go.Scatter(
    x=gender_rate["Height"],
    y=gender_rate["Weight"],
    mode="markers",
    marker=dict(
        color=gender_rate["Gender"],
        colorscale="Bluered_r",
        showscale=True,
        colorbar=dict(title="女性占比"),
        size=10
    ),
    name="性别占比视图"
)

# 视图2:女性个体散点
trace_female = go.Scatter(
    x=data_subset[data_subset["Gender"] == 1]["Height"],
    y=data_subset[data_subset["Gender"] == 1]["Weight"],
    mode="markers",
    name="女性",
    marker=dict(color="#FF6B6B", size=8)
)

# 视图3:男性个体散点
trace_male = go.Scatter(
    x=data_subset[data_subset["Gender"] == 0]["Height"],
    y=data_subset[data_subset["Gender"] == 0]["Weight"],
    mode="markers",
    name="男性",
    marker=dict(color="#4ECDC4", size=8)
)

# 创建下拉菜单按钮
buttons = [
    dict(
        label="性别占比视图",
        method="update",
        args=[
            {"visible": [True, False, False]},
            {"title": "性别占比随身高体重变化"}
        ]
    ),
    dict(
        label="男女个体视图",
        method="update",
        args=[
            {"visible": [False, True, True]},
            {"title": "男女身高体重分布"}
        ]
    )
]

# 构建图表
fig = go.Figure(data=[trace_rate, trace_female, trace_male])
fig.update_layout(
    title="性别占比/个体分布可视化",
    xaxis_title="身高",
    yaxis_title="体重",
    updatemenus=[dict(
        type="dropdown",
        buttons=buttons,
        direction="down",
        x=0.1,
        y=1.15
    )]
)

fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:58:20