0

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

df = pd.DataFrame({"Date": ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
           "A_x1": [1, 2, 2, 2],
           "A_x2": [9, 2, 2, 3],
           "A_x3": [1, 3, 2, 9],
           "B_x1": [1, 8, 2, 3],
           "B_x2": [3, 8, 9, 3],
           "B_x3": [2, 4, 5, 5],
           "C_x1": [2, 6, 5, 2],
           "C_x2": [4, 8, 1, 3],
           "C_x3": [6, 9, 5, 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

这是情节中最简单的散点图,工作正常:

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 的 x1、x2、x3 值(=3 列),我希望所有 >!columns 都包括在内。我想做这样的事情,但我得到了不同的错误。尝试使用 >!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_1 x_2 x_3)^(1/3)根据其几何大小为数据点着色

我想要什么:根据列的名称或数据框的第一行或其他任何内容为数据点着色(我将不得不添加这一行,但这不成问题)。

有任何想法吗?谢谢!

4

1 回答 1

0

x,yzplotly.express.scatter_3d ()应该是str int Series array-likedf.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'),
                    )
于 2021-05-03T10:21:26.660 回答