Соедините пробелы между строками с помощью plotly

#python #plot #plotly #scatter

#python #построить #plotly #разброс

Вопрос:

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

 import plotly.graph_objects as go

fig = go.Figure()

fig.add_scatter(x=[1],y=[2])
fig.add_scatter(x=[5],y=[4])

 

noline

хотя я хотел бы получить вывод этого кода (например, с линией, соединяющей точки)

 import plotly.graph_objects as go

fig = go.Figure()

fig.add_scatter(x=[1,5],y=[2,4])
 

строка

К сожалению, я не могу присоединиться [1] , и [5] потому что я беру данные из файла, который регулярно обновляется.

Комментарии:

1. plotly.com/python/shapes /… Я думаю, что использование этого в качестве ссылки может быть полезным.

Ответ №1:

Вы пытаетесь добавить линию между маркерами из двух разных трасс, поскольку вы используете:

 fig.add_scatter(x=[1],y=[2])
fig.add_scatter(x=[5],y=[4])
 

И, насколько мне известно, это просто не сработает. Линии можно рисовать только между одинаковыми точками в одной и той же трассировке. Я не уверен, что понимаю, почему вы не можете сохранять новые значения в списках, но мы пока оставим это в стороне от обсуждения. Хорошая новость заключается в том, что вы можете получить доступ к данным для ваших x и y значений в ваших fig объектах через:

 fig.data[0].x
fig.data[0].y
 

И вы также можете добавить к ним дополнительные значения. Увы, не напрямую, поскольку они являются кортежами. Таким образом, вам придется переключаться между списками и кортежами, но это не очень большая проблема.

Сначала настройте свой «базовый» вариант следующим образом:

 import plotly.graph_objects as go
fig = go.Figure()
fig.add_scatter(x=[1],y=[2])
fig.show()
 

введите описание изображения здесь

Затем создайте существующие значения в объекте fig` с новыми значениями:

 fig.data[0].x = tuple(list(fig.data[0].x)   [4])
fig.data[0].y = tuple(list(fig.data[0].y)   [5])
fig.show()
 

введите описание изображения здесь

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

Случайные числа

Вот еще один фрагмент, который добавляет случайные значения к существующей трассировке на рисунке:

 fig.data[0].x = tuple(list(fig.data[0].x)   np.random.randint(low=0, high=10, size=1).tolist())
fig.data[0].y = tuple(list(fig.data[0].y)   np.random.randint(low=0, high=10, size=1).tolist())
fig.show()
 

Если вы запустите это несколько раз, например, в собственной ячейке JupyterLab, вы получите что-то вроде этого:

введите описание изображения здесь

Случайное блуждание

И вот еще один пример, который принимает последнее значение в вашей трассировке и добавляет случайное число, так что в итоге вы получите ряд на графике ниже:

 fig.data[0].x = tuple(list(fig.data[0].x)   [(list(fig.data[0].x)[-1]   1)])
fig.data[0].y = tuple(list(fig.data[0].y)   (list(fig.data[0].y)[-1]   np.random.randint(low=-1, high=2, size=1)).tolist())
fig.show()
 

введите описание изображения здесь

И обратите внимание, что x-values в этом случае значение было настроено на увеличение 1 для каждого запуска, в отличие от примера выше.

Ответ №2:

Попробуйте использовать

 import plotly.express as px

fig = px.line(x=[1, 5], y=[2, 4])
fig.show()
 

Комментарии:

1. Проблема в том, что у меня нет [1,5] , у меня есть цикл, который сначала считывает 1 из файла, а затем 5 , поэтому я не могу добавить их одновременно

2. Вы могли бы попробовать создать список, и ваш цикл добавит этот список после того, как он считает каждое число из файла, а затем передаст этот список в функцию px.line

3. К сожалению, для моего варианта использования это нелегко выполнимо, код более сложный, я сохраняю fig объект в памяти и добавляю точку разброса каждые X секунд, поэтому я искал что-то вроде join_with_last_point=True .

Ответ №3:

Вы можете установить пустой список с именем xVal и yVal вне px.line , добавить свои номера в список и записать фактическую строку как px.line(x=xVal, y=yVal) или fig.add_scatter(x=val, y=yVal)

Комментарии:

1. К сожалению, я добавляю точку разброса на график каждые X секунд и не сохраняю в памяти предыдущие точки, только fig объект. Есть ли способ, возможно, получить последний объект, нарисованный на рисунке?

2. Я считаю, что можно удалить число в списке с определенным индексом (в данном случае, вероятно, нулевым), если длина списка больше, чем, скажем, 2 числа, поэтому я думаю, что этот метод можно реализовать