3D 散点图:多值图,按列着色

问题描述

我想使用具有以下格式的数据框执行 3d 散点图:

df = pd.DataFrame({"Date": ['2021-01-01','2021-01-02','2021-01-03','2021-01-04'],"A_x1": [1,2,2],"A_x2": [9,3],"A_x3": [1,3,9],"B_x1": [1,8,"B_x2": [3,9,"B_x3": [2,4,5,5],"C_x1": [2,6,"C_x2": [4,1,"C_x3": [6,7]})
日期 A_x1 A_x2 A_x3 B_x1 B_x2 B_x3 C_x1 C_x2 C_x3 D_x1
2021-01-01 1 9 1 1 3 2 2 4 6 ...
2021-01-02 2 2 3 8 8 4 6 8 9 ...
2021-01-03 2 2 2 2 9 5 5 1 5 ...
2021-01-04 2 3 9 3 3 5 2 3 7 ...

如您所料:3d 散点图的 3 轴应为 x1、x2 和 x3。所以我有 3 个变量用于 3 个轴,但每行有多个值。 我想将 A_x1/2/3、B_x1/2/3 等的值绘制到相应的点并为它们着色(例如 A = 红色、B = 绿色、C = 蓝色等)。

我尝试使用 matplotlib 和 plotly,但我对任何其他库持开放态度。 要获取所有 x_1 值的数据帧或数组,我使用以下代码

df_x_1 = df.filter(like='1') #df x_1
x_1 = df_x_1.to_numpy() #arr_x_1

这是 plotly 中最简单的散点图,效果很好:

import plotly.express as px
fig = px.scatter_3d(df,x='A_x1',y='A_x2',z='A_x3',#color='species'
                    )
fig.show()

部分问题,已被@Ynjxsjmh 剧透解决

但是这个obv。绘制 A(=3 列)的 x1、x2、x3 值,我希望包含所有 >! 列。 我想做这样的事情,但我遇到了不同的错误。尝试使用 >!dataframe 和数组。 代码

fig = px.scatter_3d(x=df.filter(like='1').values.ravel('F'),y=df.filter(like='2').values.ravel('F'),z=df.filter(like='3').values.ravel('F'),color = ( df.filter(like='3').values.ravel('F')*df.filter(like='2').values.ravel('F')*df.filter(like='1').values.ravel('F') )**(1/3)

                    )
fig.show()

代码现在有效。数据点(例如 A_x1,x2,x3 出现在正确的位置)。 什么浇头仍不清楚:着色。

现在我通过执行 color=(x_1x_2x_3)^(1/3)

根据数据点的几何大小为数据点着色

我想要的: 根据列的名称或数据框的第一行或其他任何内容为数据点着色(我必须添加这一行,但这应该不是问题)。

有什么想法吗?谢谢!

解决方法

xyplotly.express.scatter_3d()z 应该是 str or int 系列 类似数组df.filter(like='1') 返回一个数据帧。

您可以使用 numpy.ravel() 将列方向的值展平。

fig = px.scatter_3d(x=df.filter(like='1').values.ravel('F'),y=df.filter(like='2').values.ravel('F'),z=df.filter(like='3').values.ravel('F'),)