Не удалось вернуть информацию для выбранных точек данных для нескольких трассировщиков - PullRequest
0 голосов
/ 18 декабря 2018

В этом примере они отображают все в одном go.Scatter трассере, а затем могут использовать selection_fn для получения информации о выбранных точках.

Я хочусделать то же самое с моим набором данных состоит из 3 кластеров.Чтобы было легче увидеть кластеры, я использую один индикатор для одного класса.Поэтому я пытаюсь изменить пример кода, чтобы адаптировать его к моему набору данных, как показано ниже.

import plotly.plotly as py
import plotly.graph_objs as go
from plotly.tools import set_credentials_file
import plotly.offline as py

import pandas as pd
import numpy as np
from ipywidgets import interactive, HBox, VBox

from sklearn.datasets import make_blobs

X, y = make_blobs(30,random_state=101)

py.init_notebook_mode()

f = go.FigureWidget([go.Scatter(y = X[y==0][:,1], x = X[y==0][:,0], mode = 'markers'), 
                     go.Scatter(y = X[y==1][:,1], x = X[y==1][:,0], mode = 'markers'),
                     go.Scatter(y = X[y==2][:,1], x = X[y==2][:,0], mode = 'markers')])
scatter = f.data[0]
N = len(X)

# Create a table FigureWidget that updates on selection from points in the scatter plot of f
t = go.FigureWidget([go.Table(
    header=dict(values=['x','y','class'],
                fill = dict(color='#C2D4FF'),
                align = ['left'] * 5),
    cells=dict(values=[X[:,0], X[:,1], y],
               fill = dict(color='#F5F8FF'),
               align = ['left'] * 5))])

def selection_fn(trace,points,selector):
    print(points.point_inds)
    t.data[0].cells.values = [X[points.point_inds,0], X[points.point_inds,1], y[points.point_inds]]

scatter.on_selection(selection_fn)

# Put everything together
VBox((HBox(),f,t))

Неверное поведение 1: возвращена неверная информация

При выборе двух точек данных из trace 0,он возвращает мне 2 информации, но это неправильно.

enter image description here enter image description here

Неверное поведение 2: Информация не возвращается

При выборе точек данных из трассировщика 1 и 2 он даже не возвращает информацию enter image description here enter image description here

После краткогоОтладка, я замечаю, что есть несоответствие в индексе для каждого трассировщика и полного набора данных.Этот код может возвращать индекс только из трассировщика 0, однако, когда он передает индекс в полный набор данных, он дает неверную информацию о точках.При выборе точек из трассировщика 1 и 2 он не может даже вернуть индекс, поэтому никакая информация не может быть извлечена.

Хотя я понимаю проблему, я не знаю, как изменить код, поскольку явсе еще новичок в заговоре.

1 Ответ

0 голосов
/ 20 декабря 2018

Попробовав несколько дней, я понял, как этого добиться.(Может быть, кто-то еще может предоставить лучший способ?)

Хитрость заключается в том, чтобы создать 3 списка для каждого столбца в таблице, добавить данные выбранных точек в список и обновить таблицу.в конце.

Вот полный код.

X, y = make_blobs(30,random_state=101)

py.init_notebook_mode()

f = go.FigureWidget([go.Scatter(y = X[y==0][:,1], x = X[y==0][:,0], text=y[y==0], mode = 'markers', name='class 0'), 
                     go.Scatter(y = X[y==1][:,1], x = X[y==1][:,0], text=y[y==1], mode = 'markers', name='class 1'),
                     go.Scatter(y = X[y==2][:,1], x = X[y==2][:,0], text=y[y==2], mode = 'markers', name='class 2')])


# Create a table FigureWidget that updates on selection from points in the scatter plot of f
t = go.FigureWidget([go.Table(
    header=dict(values=['x','y', 'class'],
                fill = dict(color='#C2D4FF'),
                align = ['left'] * 5),
    cells=dict(values=[X[:,0], X[:,1], y],
               fill = dict(color='#F5F8FF'),
               align = ['left'] * 5))])

# def data_append(trace,points,selector):
#     X1 = []
#     X2 = []
#     c = []


X1 = []
X2 = []
data_cluster = []
num_called = 0
def selection_fn(trace,points,selector):
    global num_called
    global X1, X2, data_cluster
    if num_called == 3: # number of scatters
        num_called = 0
        X1 = []
        X2 = []
        data_cluster = []
    X1.extend(trace['x'][points.point_inds])
    X2.extend(trace['y'][points.point_inds])
    data_cluster.extend(trace['text'][points.point_inds])
    t.data[0].cells.values = [X1, X2,data_cluster]
    num_called +=1
for scatter in f.data:
    scatter.on_selection(selection_fn)

# Put everything together
VBox((HBox(),f,t))

Вывод кода

enter image description here enter image description here

Как видите, таблица возвращает точно информацию для трех выбранных точек данных.

...