如何动态更新同一窗口中的图形而不在新选项卡中打开和重绘?

JDS*_*JDS 6 python plotly-python

我正在基于 pandas 数据框创建 3D 散点图,然后每当用户按下程序中的按钮时,我想用稍微更新的数据重新绘制它。我几乎可以使用此功能,除了更新的图形是通过新打开的选项卡绘制的,而实际上我只想更新我的原始现有图形。

这是我的代码。首先,我使用数据的“版本 1”初始化绘图,然后设置一个简单的 while 循环来等待用户请求更新。然后理想情况下,一旦他们输入要求更新的内容,我只需在打开的同一个选项卡中重新绘制所有内容。但会打开一个新选项卡(至少会正确地重新绘制数据)。

    fig = go.Figure(data=[go.Scatter3d(x=df['x'],y=df['y'],z=df['z'],mode='markers', marker=dict(
        size=4,
        color=df['y'],                # set color to an array/list of desired values
        colorscale='Viridis',   # choose a colorscale
        opacity=0.3
    ))])
    
    # Column max and mins for plotting:
    xmax = df_1.max(axis=0)['x']; xmin = df_1.min(axis=0)['x']
    ymax = df_1.max(axis=0)['y']; ymin = df_1.min(axis=0)['y']
    zmax = df_1.max(axis=0)['z']; zmin = df_1.min(axis=0)['z']
    
    fig.update_layout(
    scene = dict(xaxis = dict(nticks=4, range=[xmin,xmax],),
                     yaxis = dict(nticks=4, range=[ymin,ymax],),
                     zaxis = dict(nticks=4, range=[zmin,zmax],),))

    f2 = go.FigureWidget(fig)
    f2.show()
        
    #fig.show()
    
    while True:
        choice = input("> ")
        choice = choice.lower() #Convert input to "lowercase"

        if choice == 'exit':
            print("Good bye.")
            break

        if choice == 'w':
            print("W, moving forward")
            
            cube_origin = cube_origin + np.array([0.1,0,0])
            df_cube = createCubeMesh(cube_size, cube_density, cube_origin)
            new_df = df_scene_orig.copy()
            new_df = new_df.append(df_cube)
            
            fig = go.Figure(data=[go.Scatter3d(x=new_df['x'],y=new_df['y'],z=new_df['z'],mode='markers', marker=dict(
                size=4,
                color=new_df['y'],                # set color to an array/list of desired values
                colorscale='Viridis',   # choose a colorscale
                opacity=0.3
            ))])
            
            
            f2 = go.FigureWidget(fig)
            f2.show()
Run Code Online (Sandbox Code Playgroud)

我的代码基于另一个据说使用的答案go.FigureWidget(fig),但它似乎没有按预期工作。

编辑

我不想f2.show()在最后使用,而是想要一个类似于f2.update()重绘的简单的东西。

ara*_*sch 0

估计你的“选项卡”指的是“浏览器选项卡”,这对于标准渲染器来说基本上是不可能的。通过渲染器,它在随机端口browser上提供一次性服务器,该服务器在渲染完成后立即关闭。您可以通过在浏览器中重新加载图表来检查这一点。

你可以:

  • 生成静态图像并在网络应用程序中(例如使用烧瓶)自行提供f2.write_image("test.svg")
  • 生成动态 html 内容并f2.show(renderer = "iframe")使用例如flask
  • 只需使用plotly dash,在这里查看印象