Получить координаты с помощью on_click и ipwidgets на Plotly

Я пытаюсь получить координаты в виде списка при нажатии какой-либо точки графика. У меня есть этот пример кода, который я получил здесь в stackoverflow, но я не могу распечатать список или получить к нему доступ из функции обратного вызова, как я могу это сделать?

import numpy as np
import plotly.express as px
import plotly.graph_objects as go
import ipywidgets as widgets
from pathlib import Path
import json

x = np.random.uniform(-10, 10, size=50)
y = np.sin(x)
clicked = []

# construct figure that has holders for points, interpolated line and final lines
fig = go.FigureWidget(
    [
        go.Scatter(x=x, y=y, mode = "markers", name = "base_points"),
    ]
)
fig.update_layout(template = "simple_white")

out = widgets.Output(layout = {"border": "1px solid black"})
out.append_stdout("Output appended with append_stdout\n")

# create our callback function
@out.capture()
def base_click(trace, points, selector):
    global clicked
    clicked.append(points.__dict__)

fig.data[0].on_click(base_click)

widgets.HBox([fig, out])

Я хочу получить доступ к списку, по которому щелкнули, и использовать данные, но я не могу получить к нему доступ и распечатать его на консоли.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все, что вам нужно сделать, это использовать объект points следующим образом:

@out.capture()
def base_click(trace, points, selector):
    global clicked
    clicked.append([points.xs[0],points.ys[0]])

print(clicked)  #<--- outside the function base_click

Спасибо за ответ! Думаю, я знаю, что теперь делать.

Raxhacks 29.10.2022 21:07

Извините, но я все еще не могу заставить его работать. Я не знаю, вызывается ли функция обратного вызова, но всякий раз, когда я нажимаю на график, она вообще ничего не печатает. Я поместил печать в блок try, кроме блока, потому что при инициализации программы она говорит, что щелчок не был определен. Я поместил еще одну печать в функцию обратного вызова, чтобы увидеть, инициализируется ли она, но, по-видимому, нет. Я не знаю, что может быть причиной этого.

Raxhacks 29.10.2022 21:36

@Raxhacks Попробуйте поместить print(clicked) внутри обратного вызова в последней строке, у меня это тоже работает.

Hamzah 29.10.2022 21:37

@Raxhacks, я хочу спросить вас, хотите ли вы добавить нажатые точки на боковую панель справа от графика?

Hamzah 29.10.2022 21:58

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

Raxhacks 30.10.2022 03:10

@Raxhacks Я использовал блокнот Jupyter, какой тип IDE вы используете?

Hamzah 30.10.2022 08:36

Давайте продолжим обсуждение в чате.

Raxhacks 30.10.2022 17:42

Думаю где проблема. Чтение plotly.com/python/click-events говорит: Примечание. Обратные вызовы будут запускаться только тогда, когда трассировка принадлежит экземпляру plotly.graph_objs.FigureWidget и отображается в контексте ipywidget. Обратные вызовы не будут запускаться для фигур, отображаемых с помощью plot/iplot. В моем коде используется plotly.offline.plot, я не знаю, является ли это основной проблемой.

Raxhacks 31.10.2022 00:12

Другие вопросы по теме