#python #pandas #plotly
#python #pandas #график
Вопрос:
Я хочу иметь возможность соединять точки на этих графиках, но я хочу соединять графики ТОЛЬКО там, где разница во временных рядах последовательна (интервалы в 1 минуту). То, что я сделал, это извлек конкретные точки интереса из базы данных временных рядов, используя метод маскирования в Python и Pandas dataframe, и нанес их с помощью plotly. Когда данные находятся с интервалом в 1 минуту, они выглядят очень близко друг к другу на графике. Вот как выглядят графики в настоящее время.
Кажется, я не могу найти какой-либо способ сделать это, за исключением этой ссылки, чтобы поместить «None» между последовательными частями. Я знаю, что мог бы выполнить цикл for и добавить «None» между данными, когда timedelta составляет> 1 минуты, но я надеялся, что у plotly есть какой-то способ просто сделать это, установив параметр для интервалов оси X.
fig.add_trace(go.Scatter(
x=x,
y=[10, 20, None, 15, 10, 5, 15, None, 20, 10, 10, 15, 25, 20, 10],
name = '<b>No</b> Gaps', # Style name/legend entry with html tags
connectgaps=True # override default to connect the gaps
Пробелы на красных линиях являются примером того, как я хочу, чтобы график выглядел. Взято из документации plotly.
Комментарии:
1. Это помогло бы увидеть ваш код и некоторые данные. Я думаю , что это можно сделать, когда вы выполняете маскировку в python / pandas
None
, затем вставляете туда.2. Я не уверен, что именно вы ищете. Вопросы «Я хочу делать то, что указано в документации, но без этих шагов», как правило, не одобряются. Вы ищете совет о том, как вставлять
None
значения в масштабе? Есть ли причина, по которой в вашей трассировке не может быть пропущенных значений? Вы пытаетесь выполнить некоторые манипуляции с отдельными сегментами?
Ответ №1:
# The idea is to create a consecutive set where missing pieces are `nan`
import pandas as pd
import plotly.graph_objects as go
# ----- this is to create sample data -----
timeX = pd.to_datetime(['2020-01-01 00:00',
'2020-01-01 00:01',
'2020-01-01 00:02', #mind the gap
'2020-01-01 00:05',
'2020-01-01 00:06', #mind the gap
'2020-01-01 00:11',
'2020-01-01 00:12',
'2020-01-01 00:13'])
valuesY = [2,3,2,4,5,3,1,2]
df = pd.DataFrame(data=[timeX,valuesY]).T
df.columns = ['timeX','valuesY']
# ------ here I create a consecutive range (of minutes) ----
startX = min(df['timeX'])
endX = max(df['timeX'])
daterange = pd.date_range(start=startX,end=endX,freq='1Min')
ef = pd.DataFrame(data=daterange, columns=['timeX'])
# ------ by merging with left join on timeX missing matches become nan
ef = ef.merge(df, on='timeX', how='left')
# ------ eliminating the connectgaps feature shows the connected parts only
fig = go.Figure(data=go.Scatter(
x=ef['timeX'],
y=ef['valuesY'],
name = 'with Gaps')) # override default to connect the gaps
fig.show()
Комментарии:
1. Спасибо! Это именно та помощь, в которой я нуждался! Волшебный трюк здесь заключается в объединении столбцов для принудительного ввода значений nan. Гениально!
Ответ №2:
Если бы у plotly была опция специально для этого, я бы ожидал найти ее здесь, здесь или в одном из других разделов на этой странице, но я не вижу ничего похожего на это. (Конечно, я только бегло просмотрел, но то, что вы ищете, более конкретно, чем то, что обычно поддерживают plotly и подобные пакеты.)
Вставка None
, вероятно, была бы моим первым выбором при создании таких графиков. Если вы хотите больше контроля над отдельными сегментами строки, вы можете попробовать что-то вроде
- разделите данные на сегменты (что само по себе является сложной процедурой), при этом каждый сегмент становится отдельным экземпляром трассировки / разброса в списке трассировок рисунка. (Обычно я предпочитаю использовать
go.Figure(data=[<list of traces>])
формат, а не вызовыFigure.add_trace()
, но YMMV.) - Используйте
legendgroup
showlegend
line
опции и и, чтобы разные сегменты выглядели как одна и та же трассировка для просмотра, но на самом деле были отдельными трассировками внутри.