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

Plotly散点图边际小提琴图未按类别区分堆叠异常求助

Plotly散点图边际小提琴图未按类别区分问题解决

问题描述

  • 需求:实现类似iris数据集示例中,按类别区分的散点图+分类型边际小提琴图效果
  • 异常表现:适配自定义粒子数据集后,边际小提琴图未按charge字段分类,而是堆叠显示所有数据
  • 正常工作的示例代码:
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_length", y="sepal_width", color="species", 
                 marginal_x="box", marginal_y="violin",
                  title="Click on the legend items!")
fig.show()
  • 出现问题的自定义代码:
d = {'nbr':number,'mass': mass,'charge': charge, 'x': x, 'y': y,'z': z,'speed':speed,'azm':azm,'elv':elv, 'energie_cinetique':energie_cinetique }
df = pd.DataFrame(data=d)
figuredistrib=px.scatter(df,x='x',y='z', color= 'charge', marginal_x="violin",marginal_y="violin")
figuredistrib.show()

原因分析

核心问题在于charge字段的数据类型:

  • 若charge是数值型(如整数、浮点数),Plotly Express会将其视为连续变量,边际小提琴图默认展示整体数据分布,不会按数值拆分;
  • 而iris示例中的species是字符串/类别型变量,Plotly会自动识别为离散分类,进而按类别拆分边际图。

解决方案

将charge字段转换为类别型变量,让Plotly识别为离散分类,两种简便实现方式:

方法一:转换为分类数据类型

df['charge'] = df['charge'].astype('category')

方法二:转换为字符串类型

df['charge'] = df['charge'].astype(str)

修改后的完整代码

import pandas as pd
import plotly.express as px

# 假设number、mass等变量已提前定义
d = {'nbr':number,'mass': mass,'charge': charge, 'x': x, 'y': y,'z': z,'speed':speed,'azm':azm,'elv':elv, 'energie_cinetique':energie_cinetique }
df = pd.DataFrame(data=d)

# 将charge转为类别型
df['charge'] = df['charge'].astype('category')

figuredistrib=px.scatter(df,x='x',y='z', color= 'charge', marginal_x="violin",marginal_y="violin")
figuredistrib.show()

补充说明

如果需要更灵活的边际图布局与样式配置,也可以使用plotly.subplots.make_subplots手动创建子图,分别绘制散点图和分类型小提琴图,但转换字段类型是最轻量化的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:10:46