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

Python Pandas数据框重构与散点图绘制:实现数值对应分类、按另一类别着色的可视化方案

如何绘制「分类关联+按另一分类着色」的散点图

没问题!我帮你一步步搞定这个散点图需求——首先得把你的宽格式数据转成可视化友好的长格式,然后用Matplotlib/Seaborn或者Plotly都能轻松实现目标。

第一步:重构Pandas数据框

你的原始数据是宽格式(每列对应一种疾病),但这类分类可视化需要长格式(把所有疾病的数值统一放到一列,同时新增一列标记疾病类型)。用Pandas的melt()方法就能一键转换:

import pandas as pd

# 模拟你的原始数据框(替换成你自己的df即可)
df = pd.DataFrame({
    'gender': ['male', 'female', 'male', 'female'],
    'disease1': [0.82, 0.75, 0.80, 0.78],
    'disease2': [0.76, 0.93, 0.79, 0.91]
})

# 转换为长格式
long_df = df.melt(
    id_vars='gender',       # 保留不变的分类列(性别)
    var_name='disease',     # 新生成的疾病类型列名
    value_name='score'      # 数值列的名称
)

转换后的数据框长这样:

genderdiseasescore
maledisease10.82
femaledisease10.75
maledisease20.76
femaledisease20.93

第二步:用Matplotlib+Seaborn绘制静态散点图

Seaborn是Matplotlib的封装库,对分类数据可视化更友好,代码简洁易读:

import seaborn as sns
import matplotlib.pyplot as plt

# 设置绘图风格
sns.set_style("whitegrid")

# 核心绘图代码:x轴是疾病分类,y轴是数值,hue参数按性别着色
sns.scatterplot(
    data=long_df,
    x='disease',
    y='score',
    hue='gender',
    s=100,          # 调整点的大小
    palette='Set2'  # 自定义配色方案
)

# 添加标题和标签
plt.title('Score Distribution by Disease and Gender', fontsize=14)
plt.xlabel('Disease Type', fontsize=12)
plt.ylabel('Score', fontsize=12)

# 调整图例
plt.legend(title='Gender')

# 显示图形
plt.show()

第三步:用Plotly Express绘制交互式散点图

如果想要支持鼠标悬停查看详情、点击图例筛选的交互式图表,Plotly Express是最佳选择:

import plotly.express as px

# 生成交互式散点图
fig = px.scatter(
    long_df,
    x='disease',
    y='score',
    color='gender',          # 按性别着色
    size_max=30,             # 点的最大尺寸
    title='Score Distribution by Disease and Gender',
    labels={'score': 'Score', 'disease': 'Disease Type'}  # 自定义轴标签
)

# 优化布局细节
fig.update_layout(
    xaxis_title='Disease Type',
    yaxis_title='Score',
    legend_title='Gender'
)

# 显示交互式图表
fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:59:04