在散点图中,我希望能够选择一个区域,然后更新下面显示该区域数据点的表格。就像Selection Events by Plotly所做的那样。
我已经修改了该示例,但是“鼠标选择”没有任何反应。最初会显示数据(所有数据),但不会更新。当我在更新函数selection_fn
中使用pdb时,看到用Mouse选择一个区域时,它永远不会消失。
我也遵循了this thread from Stackoverflow,但它没有任何改变。两种方法都不会产生错误,也不会显示带有所有数据初始表的散点图。
这是我的代码,改编自Plotly教程:
import pandas as pd
from plotly.graph_objs import *
import plotly.offline as po
import numpy as np
from ipywidgets import interactive, HBox, VBox
po.init_notebook_mode()
import time
import pdb
f = FigureWidget([Scatter(y = plot_data["t-SNE-X"], x = plot_data["t-SNE-Y"], mode = 'markers')])
scatter = f.data[0]
N = len(plot_data)
scatter.x = scatter.x + np.random.rand(N)/10 *(plot_data['t-SNE-X'].max() - plot_data['t-SNE-X'].min())
scatter.y = scatter.y + np.random.rand(N)/10 *(plot_data['t-SNE-Y'].max() - plot_data['t-SNE-Y'].min())
scatter.marker.opacity = 0.5
def update_axes(xaxis, yaxis):
scatter = f.data[0]
scatter.x = plot_data[xaxis]
scatter.y = plot_data[yaxis]
with f.batch_update():
f.layout.xaxis.title = xaxis
f.layout.yaxis.title = yaxis
scatter.x = scatter.x + np.random.rand(N)/10 *(plot_data[xaxis].max() - plot_data[xaxis].min())
scatter.y = scatter.y + np.random.rand(N)/10 *(plot_data[yaxis].max() - plot_data[yaxis].min())
axis_dropdowns = interactive(update_axes, yaxis = plot_data.select_dtypes('int64').columns, xaxis = plot_data.select_dtypes('int64').columns)
# Create a table FigureWidget that updates on selection from points in the scatter plot of f
t = FigureWidget([Table(
header=dict(values=plot_data.columns,
fill = dict(color='#C2D4FF'),
align = ['left'] * 5),
cells=dict(values=[plot_data[col] for col in plot_data.columns],
fill = dict(color='#F5F8FF'),
align = ['left'] * 5
))])
def selection_fn(trace,points,selector):
t.data[0].cells.values = [plot_data.loc[points.point_inds][col] for col in plot_data.columns]
scatter.on_selection(selection_fn)
#iplot({data : scatter.on_selection(selection_fn)})
# Put everything together
VBox((f, t))
答案 0 :(得分:1)
对于下一个遇到相同问题的人,请记住-在绘图上选择区域时的默认行为是将其放大。
因此,为了触发您自己的on_selection函数,只需从图形的内置控件中切换“框选择”或“套索选择”图标即可。您无需对其进行硬编码,因为先前的答案似乎表明了这一点。
答案 1 :(得分:0)
经过两天的调试,我发现该代码现在可以在3.7.1上运行,并且缺少行f.layout.dragmode = 'lasso'
,这在任何地方都没有记录。