问题描述
我想使用具有以下格式的数据框执行 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)
根据数据点的几何大小为数据点着色我想要的: 根据列的名称或数据框的第一行或其他任何内容为数据点着色(我必须添加这一行,但这应该不是问题)。
有什么想法吗?谢谢!
解决方法
x
、y
和 plotly.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'),)