#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])
хотя я хотел бы получить вывод этого кода (например, с линией, соединяющей точки)
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 числа, поэтому я думаю, что этот метод можно реализовать