如何用Plotly实现带下拉交互的4D数据可视化图表?
使用Plotly绘制4D交互散点图的问题
我尝试用Plotly绘制4D数据,但相关参考资料很少。想要实现一个交互界面:通过三个下拉菜单选择X/Y/Z轴变量,第四个下拉菜单选择第四轴的切片来展示数据。
目前代码无法正常运行,调试难度高:
- 运行后仅显示
p的单一切片 - 将
p设为坐标轴时,无法呈现完整3D图,仅显示3D空间中的2D平面
以下是我的代码:
import pandas as pd import numpy as np import plotly.express as px import plotly.graph_objects as go # Load data data = pd.read_csv("tempTable.csv") data["lambda"] = 1. / data["phi"] # Define variables and ranges axis = ["p", "Tu", "phi", "egr"] ranges = {a: np.unique(data[a].to_numpy()) for a in axis} xaxis, yaxis, zaxis = 3, 1, 2 # Default axis selections waxis = [x for x in range(len(axis)) if x not in [xaxis, yaxis, zaxis]][0] isoID = 0 subData = data.loc[data[axis[waxis]] == ranges[axis[waxis]][isoID]] # Get the slice along waxis var = "Su" # Initial figure fig = px.scatter_3d(subData.loc[subData["completed"]], x=axis[xaxis], y=axis[yaxis], z=axis[zaxis], color=var, color_continuous_scale="turbo", range_color=[0.0, subData.loc[subData["completed"], var].to_numpy().max()]) # Function to update axis in the plot def create_3d_trace(xaxis, yaxis, zaxis): waxis = [x for x in range(len(axis)) if x not in [xaxis, yaxis, zaxis]][0] subData = data.loc[data[axis[waxis]] == ranges[axis[waxis]][isoID]] return go.Scatter3d( x=subData.loc[subData["completed"], axis[xaxis]], y=subData.loc[subData["completed"], axis[yaxis]], z=subData.loc[subData["completed"], axis[zaxis]], mode="markers", marker=dict( size=3, color=subData.loc[subData["completed"], var], colorscale="turbo", colorbar=dict(title=var), cmin=0.0, cmax=subData.loc[subData["completed"], var].to_numpy().max(), ) ) # Add initial trace fig = go.Figure(data=[create_3d_trace(xaxis, yaxis, zaxis)]) # Create dropdown menus dropdown_x = [ dict(label=f"X: {ax}", method="update", args=[{"x": [subData.loc[subData["completed"], ax]]}, {"title": f"X-axis: {ax}"}]) for ax in axis ] dropdown_y = [ dict(label=f"Y: {ax}", method="update", args=[{"y": [subData.loc[subData["completed"], ax]]}, {"title": f"Y-axis: {ax}"}]) for ax in axis ] dropdown_z = [ dict(label=f"Z: {ax}", method="update", args=[{"z": [subData.loc[subData["completed"], ax]]}, {"title": f"Z-axis: {ax}"}]) for ax in axis ] # Add menus to layout fig.update_layout( updatemenus=[ dict( buttons=dropdown_x, direction="down", showactive=True, x=0.1, xanchor="left", y=1.15, yanchor="top", ), dict( buttons=dropdown_y, direction="down", showactive=True, x=0.3, xanchor="left", y=1.15, yanchor="top", ), dict( buttons=dropdown_z, direction="down", showactive=True, x=0.5, xanchor="left", y=1.15, yanchor="top", ), ], scene=dict( xaxis=dict(title=axis[xaxis]), yaxis=dict(title=axis[yaxis]), zaxis=dict(title=axis[zaxis]), ) ) # Show the figure fig.show()
内容的提问来源于stack exchange,提问作者SickNebo
相关产品推荐
相关产品推荐

