使用下拉按钮更新customdata

发布于 2025-01-28 17:45:33 字数 4793 浏览 4 评论 0原文

我有一个快速的问题:基本上,我创建了一个带有一些悬停信息的图,并且有一个下拉按钮,用户可以在其中选择该图将基于的数据框架(是否过滤)。 因此,我像这样启动我的数字:

first_df = pd.DataFrame({'gene':['gene'+str(i) for i in range(10)],
                        'x':range(10),'y':range(10),'z':range(10),
                        'columnA':['info A '+str(i) for i in range(10)],
                        'columnB':['info B '+str(i) for i in range(10)]})
second_df = pd.DataFrame({'gene':['gene'+str(i) for i in range(10,20)],
                        'x':range(10,20),'y':range(10,20),'z':range(10,20),
                        'columnA':['info A '+str(i) for i in range(10,20)],
                        'columnB':['info B '+str(i) for i in range(10,20)]})
first_df_filtered = first_df.iloc[[0,2,4,6,8]]
second_df_filtered = second_df.iloc[[0,2,4,6,8]]

fig = go.Figure()

fig.add_scatter3d(x = first_df['x'], 
                y = first_df['y'], 
                z = first_df['z'],
                customdata = first_df[['columnA', 'columnB']], 
                hovertemplate = "<br>".join(["<b>%{text}</b><br>",
                                             "<i>info on y</i> = %{y:.2f}",
                                             "<i>info on x</i> = %{x:.2f}",
                                             "<i>info customdata 0</i> = %{customdata[0]}", 
                                             "<i>info customdata 1</i> = %{customdata[1]}"
                                            ]),
                text = first_df['gene'],
                mode='markers'
                )

fig.add_scatter3d(x = second_df['x'], 
                y = second_df['y'], 
                z = second_df['z'],
                customdata = second_df[['columnA', 'columnB']], 
                hovertemplate = "<br>".join(["<b>%{text}</b><br>",
                                             "<i>info on y</i> = %{y:.2f}",
                                             "<i>info on x</i> = %{x:.2f}",
                                             "<i>info customdata 0</i> = %{customdata[0]}", 
                                             "<i>info customdata 1</i> = %{customdata[1]}"
                                            ]),
                text = second_df['gene'],
                mode='markers'
                )

fig.update_layout(updatemenus=[
                                
                                #------------------------------------------------------------------
                                dict(
                                    active=0,
                                    y=0.5,
                                    buttons = list(
                                        [dict(label = 'No filter',
                                              method = 'update',
                                              args = [{'x': [first_df['x'], second_df['x']],
                                                       'y': [first_df['y'], second_df['y']],
                                                       'z': [first_df['z'], second_df['z']],
                                                       'text': [first_df['gene'], second_df['gene']],
                                                       'customdata[0]':[first_df['columnA'], second_df['columnA']],
                                                       'customdata[1]':[first_df['columnB'], second_df['columnB']],
                                                      },
                                                      ]),
                                         dict(label = 'Filter on',
                                              method = 'update',
                                              args = [{'x': [first_df_filtered['x'], second_df_filtered['x']],
                                                       'y': [first_df_filtered['y'], second_df_filtered['y']],
                                                       'z': [first_df_filtered['z'], second_df_filtered['z']],
                                                       'text': [first_df_filtered['gene'], second_df_filtered['gene']],
                                                       'customdata[0]':[first_df_filtered['columnA'], second_df_filtered['columnA']],
                                                       'customdata[1]':[first_df_filtered['columnB'], second_df_filtered['columnB']],
                                                      },
                                                    ]),
                                        ])
                                    ),
    
                    ])

当我单击按钮“ no filter”时,每个点的悬挂式框上显示的所有信息都是正确的,但是当我单击按钮“过滤器”时,请访问“ extract”。 CustomData不正确。但是,如果我再次单击“无过滤器”按钮,信息再次正确。态

I have a quick question: basically I have created a plot with some hover information and I have a dropdown button, where the user can chose from which dataframe (filtered or not) the plot is going to be based on.
So i initiate my figure like so:

first_df = pd.DataFrame({'gene':['gene'+str(i) for i in range(10)],
                        'x':range(10),'y':range(10),'z':range(10),
                        'columnA':['info A '+str(i) for i in range(10)],
                        'columnB':['info B '+str(i) for i in range(10)]})
second_df = pd.DataFrame({'gene':['gene'+str(i) for i in range(10,20)],
                        'x':range(10,20),'y':range(10,20),'z':range(10,20),
                        'columnA':['info A '+str(i) for i in range(10,20)],
                        'columnB':['info B '+str(i) for i in range(10,20)]})
first_df_filtered = first_df.iloc[[0,2,4,6,8]]
second_df_filtered = second_df.iloc[[0,2,4,6,8]]

fig = go.Figure()

fig.add_scatter3d(x = first_df['x'], 
                y = first_df['y'], 
                z = first_df['z'],
                customdata = first_df[['columnA', 'columnB']], 
                hovertemplate = "<br>".join(["<b>%{text}</b><br>",
                                             "<i>info on y</i> = %{y:.2f}",
                                             "<i>info on x</i> = %{x:.2f}",
                                             "<i>info customdata 0</i> = %{customdata[0]}", 
                                             "<i>info customdata 1</i> = %{customdata[1]}"
                                            ]),
                text = first_df['gene'],
                mode='markers'
                )

fig.add_scatter3d(x = second_df['x'], 
                y = second_df['y'], 
                z = second_df['z'],
                customdata = second_df[['columnA', 'columnB']], 
                hovertemplate = "<br>".join(["<b>%{text}</b><br>",
                                             "<i>info on y</i> = %{y:.2f}",
                                             "<i>info on x</i> = %{x:.2f}",
                                             "<i>info customdata 0</i> = %{customdata[0]}", 
                                             "<i>info customdata 1</i> = %{customdata[1]}"
                                            ]),
                text = second_df['gene'],
                mode='markers'
                )

fig.update_layout(updatemenus=[
                                
                                #------------------------------------------------------------------
                                dict(
                                    active=0,
                                    y=0.5,
                                    buttons = list(
                                        [dict(label = 'No filter',
                                              method = 'update',
                                              args = [{'x': [first_df['x'], second_df['x']],
                                                       'y': [first_df['y'], second_df['y']],
                                                       'z': [first_df['z'], second_df['z']],
                                                       'text': [first_df['gene'], second_df['gene']],
                                                       'customdata[0]':[first_df['columnA'], second_df['columnA']],
                                                       'customdata[1]':[first_df['columnB'], second_df['columnB']],
                                                      },
                                                      ]),
                                         dict(label = 'Filter on',
                                              method = 'update',
                                              args = [{'x': [first_df_filtered['x'], second_df_filtered['x']],
                                                       'y': [first_df_filtered['y'], second_df_filtered['y']],
                                                       'z': [first_df_filtered['z'], second_df_filtered['z']],
                                                       'text': [first_df_filtered['gene'], second_df_filtered['gene']],
                                                       'customdata[0]':[first_df_filtered['columnA'], second_df_filtered['columnA']],
                                                       'customdata[1]':[first_df_filtered['columnB'], second_df_filtered['columnB']],
                                                      },
                                                    ]),
                                        ])
                                    ),
    
                    ])

When I click on the button 'No filter', all the information shown on the hoverbox for each point is correct, but when I click on the button 'Filter on' the information shown in the hoverbox for the customdata is not correct. However if I click again on the 'No filter' button the information is correct again. Here is a picture showing an example of my problem

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文