基于身高体重的性别占比可视化: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])
方案正确性分析
- 方案一:思路完全匹配需求。通过
groupby([Height, Weight])计算每个身高体重组合下的女性占比(因Female映射为1,均值即女性占比),用颜色深浅展示占比变化,能直观呈现不同身高体重区间的性别分布倾向。原代码仅存在语法错误(marker字典未闭合),修正后可正常运行。 - 方案二:不符合需求。该方案是将男女个体数据分开绘制散点,展示的是单个样本的身高体重分布,而非性别占比的聚合结果。
带切换功能的完整实现
以下代码实现了两种视图的切换:点击下拉菜单可在「性别占比聚合视图」和「男女个体散点视图」之间切换。
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
相关产品推荐
相关产品推荐

