Plotly: Как установить диапазон x_axis при построении нескольких трасс? - PullRequest
0 голосов
/ 27 апреля 2020

Я на самом деле пытаюсь построить несколько трасс с одним x_axis.

код, который я использовал для участков:

import plotly.graph_objects  as go
import datetime
import numpy
x1= numpy.array([datetime.time(4, 45), datetime.time(5, 15), datetime.time(5, 30),datetime.time(5, 45), datetime.time(6, 0), datetime.time(6, 15),
       datetime.time(6, 30), datetime.time(6, 45), datetime.time(7, 0),datetime.time(7, 15), datetime.time(7, 30), datetime.time(7, 45),
       datetime.time(8, 0), datetime.time(8, 15), datetime.time(8, 30),datetime.time(8, 45), datetime.time(9, 0), datetime.time(9, 15),
       datetime.time(9, 30), datetime.time(9, 45), datetime.time(10, 0),datetime.time(10, 15), datetime.time(10, 30),datetime.time(10, 45), datetime.time(11, 0), datetime.time(11, 15),datetime.time(11, 30), datetime.time(11, 45), datetime.time(12, 0),
       datetime.time(12, 15), datetime.time(12, 30),datetime.time(12, 45), datetime.time(13, 0), datetime.time(13, 15),datetime.time(13, 30), datetime.time(13, 45), datetime.time(14, 0),datetime.time(14, 15), datetime.time(14, 30),datetime.time(14, 45), datetime.time(15, 0), datetime.time(15, 15),datetime.time(15, 30), datetime.time(15, 45), datetime.time(16, 0),datetime.time(16, 15), datetime.time(16, 30),
       datetime.time(16, 45), datetime.time(17, 0), datetime.time(17, 15),datetime.time(17, 30), datetime.time(17, 45), datetime.time(18, 0),
       datetime.time(18, 15), datetime.time(18, 30),datetime.time(18, 45), datetime.time(19, 0), datetime.time(19, 15),datetime.time(19, 30), datetime.time(19, 45), datetime.time(20, 0),datetime.time(20, 15), datetime.time(20, 30),
       datetime.time(20, 45), datetime.time(21, 0), datetime.time(21, 15),datetime.time(22, 15), datetime.time(22, 45),datetime.time(23, 15), datetime.time(23, 30),datetime.time(23, 45)], dtype=object)

y1= numpy.array([ 13.,  16.,   8.,  28.,  45.,  61.,  74., 133., 191., 177., 249.,219., 249., 197.,  89.,  94.,  38.,  16.,   4.,   4.,  12.,  24.,
        15.,  34.,  19.,  23.,  93.,  30.,  40.,  30.,  54.,  41.,  27.,23.,  13.,  31.,  15.,  19.,  18.,  14.,  32.,  19.,  14.,  23.,102.,  30.,  17.,  18., 105.,  67.,  55.,  56., 106.,  50.,  25.,17.,  12.,   8.,  17.,  12.,  15.,   8.,   7.,   6.,   1.,  10.,9.,   5.,   1.,   1.,   1.])


x2 = numpy.array(
    [datetime.time(0, 15), datetime.time(4, 45), datetime.time(5, 15),datetime.time(5, 30), datetime.time(5, 45), datetime.time(6, 0),datetime.time(6, 15), datetime.time(6, 30), datetime.time(6, 45),datetime.time(7, 0), datetime.time(7, 15), datetime.time(7, 30),
       datetime.time(7, 45), datetime.time(8, 0), datetime.time(8, 15),datetime.time(8, 30), datetime.time(8, 45), datetime.time(9, 0),datetime.time(9, 15), datetime.time(9, 30), datetime.time(9, 45),datetime.time(10, 0), datetime.time(10, 15), datetime.time(10, 30),datetime.time(10, 45), datetime.time(11, 0), datetime.time(11, 15),
       datetime.time(11, 30), datetime.time(11, 45), datetime.time(12, 0),datetime.time(12, 15), datetime.time(12, 30),datetime.time(12, 45), datetime.time(13, 0), datetime.time(13, 15),datetime.time(13, 30), datetime.time(13, 45), datetime.time(14, 0),datetime.time(14, 15), datetime.time(14, 30),
       datetime.time(14, 45), datetime.time(15, 0), datetime.time(15, 15),datetime.time(15, 30), datetime.time(15, 45), datetime.time(16, 0),datetime.time(16, 15), datetime.time(16, 30),datetime.time(16, 45), datetime.time(17, 0), datetime.time(17, 15),
       datetime.time(17, 30), datetime.time(17, 45), datetime.time(18, 0),datetime.time(18, 15), datetime.time(18, 30),datetime.time(18, 45), datetime.time(19, 0), datetime.time(19, 15),datetime.time(19, 30), datetime.time(19, 45), datetime.time(20, 0),datetime.time(20, 15), datetime.time(20, 30),datetime.time(20, 45), datetime.time(21, 0), datetime.time(21, 15),
        datetime.time(21, 30), datetime.time(21, 45), datetime.time(22, 0),datetime.time(22, 15), datetime.time(22, 30),datetime.time(22, 45), datetime.time(23, 0), datetime.time(23, 15),datetime.time(23, 30)], dtype=object)

y2 = numpy.array([  1.,  16.,  15.,   7.,  27.,  27.,  86.,  39.,  92., 157., 257.,
       278., 253., 273., 217., 200.,  94.,  86.,  54.,  42.,  24.,  37.,34.,  38.,  34.,  35.,  26.,  51.,  29.,  35.,  30.,  62.,  27.,30.,  19.,  19.,  24.,  23.,  19.,  16.,  13.,  33.,  36.,  20.,
        35., 127.,  50.,  22.,  28., 103.,  84.,  43.,  41., 100.,  33.,33.,  21.,  20.,  19.,  20.,  13.,   8.,  12.,   8.,  11.,   2.,
        14.,   3.,   4.,   4.,   7.,   1.,   3.,   1.,   2.,   1.])

fig = go.Figure(data=[
    go.Scatter(
        x= x1,
        y= y1,
        mode = 'markers'
            ),
go.Scatter(
        x= x2,
        y= y2,
    mode = 'markers'
    )])
fig.show()

Участок:

enter image description here

Как видно из рисунка, результат дает странное поведение, и оба моих следа начинаются с datetime.time (4, 45), а это не так. Отмечая, что мой диапазон x_Axis варьируется, что я считаю главной проблемой, и на самом деле у меня есть несколько выборочных данных, например, где x_axis - это datetime.time, где у каждой выборки данных (Xn, Yn) есть свой собственный интервал и свой длина значений, но я знаю, что мои значения x_axis варьируются от интервала datetime.time (0,0) как минимального значения до datetime.time (23,45) как максимального значения с шагом 15 минут.

Таким образом, каждый из моих x1, x2…, xn принимает значения в этом интервале, поэтому я хотел бы исправить x_axis с этим глобальным интервалом (который я ссылался на range_data в следующем коде), а затем построить любой из моего образца данные на нем.

range_data = pd.DataFrame()
range_data['range_data'] = pd.date_range("00:00", "23:45", freq="15min").time
range_data = range_data.set_index('range_data')

Спасибо,

Ответы [ 2 ]

1 голос
/ 27 апреля 2020
import plotly.graph_objects  as go
import numpy
import pandas as pd
import datetime

# generate the data
x1 = numpy.array([datetime.time(4, 45), datetime.time(5, 15), datetime.time(5, 30), datetime.time(5, 45), datetime.time(6, 0), datetime.time(6, 15), datetime.time(6, 30), datetime.time(6, 45), datetime.time(7, 0), datetime.time(7, 15), datetime.time(7, 30), datetime.time(7, 45),
                  datetime.time(8, 0), datetime.time(8, 15), datetime.time(8, 30), datetime.time(8, 45), datetime.time(9, 0), datetime.time(9, 15), datetime.time(9, 30), datetime.time(9, 45), datetime.time(10, 0), datetime.time(10, 15), datetime.time(10, 30), datetime.time(10, 45),
                  datetime.time(11, 0), datetime.time(11, 15), datetime.time(11, 30), datetime.time(11, 45), datetime.time(12, 0), datetime.time(12, 15), datetime.time(12, 30), datetime.time(12, 45), datetime.time(13, 0), datetime.time(13, 15), datetime.time(13, 30), datetime.time(13, 45), datetime.time(14, 0), datetime.time(14, 15), datetime.time(14, 30),datetime.time(14, 45), datetime.time(15, 0), datetime.time(15, 15),
                  datetime.time(15, 30), datetime.time(15, 45), datetime.time(16, 0), datetime.time(16, 15), datetime.time(16, 30), datetime.time(16, 45), datetime.time(17, 0), datetime.time(17, 15), datetime.time(17, 30), datetime.time(17, 45), datetime.time(18, 0), datetime.time(18, 15),
                  datetime.time(18, 30), datetime.time(18, 45), datetime.time(19, 0), datetime.time(19, 15), datetime.time(19, 30), datetime.time(19, 45), datetime.time(20, 0), datetime.time(20, 15), datetime.time(20, 30), datetime.time(20, 45), datetime.time(21, 0), datetime.time(21, 15),
                  datetime.time(22, 15), datetime.time(22, 45), datetime.time(23, 15), datetime.time(23, 30), datetime.time(23, 45)], dtype=object)

y1 = numpy.array([13., 16., 8., 28., 45., 61., 74., 133., 191., 177., 249.,219., 249., 197., 89., 94., 38., 16., 4., 4., 12., 24., 15., 34., 19., 23., 93., 30., 40., 30., 54., 41., 27., 23., 13., 31., 15., 19., 18., 14., 32., 19., 14., 23.,
                  102., 30., 17., 18., 105., 67., 55., 56., 106., 50., 25., 17., 12., 8., 17., 12., 15., 8., 7., 6., 1., 10., 9., 5., 1., 1., 1.])

x2 = numpy.array([datetime.time(0, 15), datetime.time(4, 45), datetime.time(5, 15), datetime.time(5, 30), datetime.time(5, 45), datetime.time(6, 0), datetime.time(6, 15), datetime.time(6, 30), datetime.time(6, 45), datetime.time(7, 0), datetime.time(7, 15), datetime.time(7, 30), datetime.time(7, 45), datetime.time(8, 0),
                  datetime.time(8, 15), datetime.time(8, 30), datetime.time(8, 45), datetime.time(9, 0), datetime.time(9, 15), datetime.time(9, 30), datetime.time(9, 45), datetime.time(10, 0), datetime.time(10, 15), datetime.time(10, 30), datetime.time(10, 45), datetime.time(11, 0), datetime.time(11, 15), datetime.time(11, 30),
                  datetime.time(11, 45), datetime.time(12, 0), datetime.time(12, 15), datetime.time(12, 30), datetime.time(12, 45), datetime.time(13, 0), datetime.time(13, 15), datetime.time(13, 30), datetime.time(13, 45), datetime.time(14, 0), datetime.time(14, 15), datetime.time(14, 30), datetime.time(14, 45), datetime.time(15, 0),
                  datetime.time(15, 15), datetime.time(15, 30), datetime.time(15, 45), datetime.time(16, 0), datetime.time(16, 15), datetime.time(16, 30), datetime.time(16, 45), datetime.time(17, 0), datetime.time(17, 15), datetime.time(17, 30), datetime.time(17, 45), datetime.time(18, 0), datetime.time(18, 15), datetime.time(18, 30),
                  datetime.time(18, 45), datetime.time(19, 0), datetime.time(19, 15), datetime.time(19, 30), datetime.time(19, 45), datetime.time(20, 0), datetime.time(20, 15), datetime.time(20, 30), datetime.time(20, 45), datetime.time(21, 0), datetime.time(21, 15), datetime.time(21, 30), datetime.time(21, 45), datetime.time(22, 0),
                  datetime.time(22, 15), datetime.time(22, 30), datetime.time(22, 45), datetime.time(23, 0), datetime.time(23, 15), datetime.time(23, 30)], dtype=object)

y2 = numpy.array([1., 16., 15., 7., 27., 27., 86., 39., 92., 157., 257., 278., 253., 273., 217., 200., 94., 86., 54., 42., 24., 37., 34., 38., 34., 35., 26., 51., 29., 35., 30., 62., 27., 30., 19., 19., 24., 23., 19., 16., 13., 33., 36., 20.,
                  35., 127., 50., 22., 28., 103., 84., 43., 41., 100., 33.,33., 21., 20., 19., 20., 13., 8., 12., 8., 11., 2., 14., 3., 4., 4., 7., 1., 3., 1., 2., 1.])

df1 = pd.DataFrame(dict(x1=x1, y1=y1))
df2 = pd.DataFrame(dict(x2=x2, y2=y2))

# organize the data in a unique data frame
# with a common time axis
df3 = pd.DataFrame()

df3['range_data'] = pd.date_range('00:00', '23:45', freq='15min').time

df3 = pd.merge(left=df3, right=df1, left_on='range_data', right_on='x1', how='left')
df3 = pd.merge(left=df3, right=df2, left_on='range_data', right_on='x2', how='left')

df3 = df3[['range_data', 'y1', 'y2']]

# plot the data
data = [go.Scatter(x=df3['range_data'], y=df3['y1'], name='y1', mode='lines+markers', connectgaps=True),
        go.Scatter(x=df3['range_data'], y=df3['y2'], name='y2', mode='lines+markers', connectgaps=True)]

layout = dict(xaxis=dict(range=[df3['range_data'].min(), df3['range_data'].max()]))

fig = go.Figure(data=data, layout=layout)

fig.show()

enter image description here

0 голосов
/ 27 апреля 2020

Я не уверен насчет точной причины, по которой это происходит, но я могу предложить решение. Кажется, одной из причин является то, что ваши x-переменные имеют разную длину. И если вы присмотритесь к своему сюжету поближе, вы увидите, что обе линии отображаются очень хорошо, когда вы выбираете одну из них, щелкая имя в легенде. может быть одной или несколькими ошибочными метками времени, но я не смог их найти. Итак, каково решение? Организуйте свои данные в pandas кадре данных, выполните объединение outer и интерполируйте пропущенные значения, используя 'ffill' и

График:

enter image description here

Код:

import plotly.graph_objects  as go
import datetime
import numpy
import pandas as pd



x1= numpy.array([datetime.time(4, 45), datetime.time(5, 15), datetime.time(5, 30),datetime.time(5, 45), datetime.time(6, 0), datetime.time(6, 15),
       datetime.time(6, 30), datetime.time(6, 45), datetime.time(7, 0),datetime.time(7, 15), datetime.time(7, 30), datetime.time(7, 45),
       datetime.time(8, 0), datetime.time(8, 15), datetime.time(8, 30),datetime.time(8, 45), datetime.time(9, 0), datetime.time(9, 15),
       datetime.time(9, 30), datetime.time(9, 45), datetime.time(10, 0),datetime.time(10, 15), datetime.time(10, 30),datetime.time(10, 45), datetime.time(11, 0), datetime.time(11, 15),datetime.time(11, 30), datetime.time(11, 45), datetime.time(12, 0),
       datetime.time(12, 15), datetime.time(12, 30),datetime.time(12, 45), datetime.time(13, 0), datetime.time(13, 15),datetime.time(13, 30), datetime.time(13, 45), datetime.time(14, 0),datetime.time(14, 15), datetime.time(14, 30),datetime.time(14, 45), datetime.time(15, 0), datetime.time(15, 15),datetime.time(15, 30), datetime.time(15, 45), datetime.time(16, 0),datetime.time(16, 15), datetime.time(16, 30),
       datetime.time(16, 45), datetime.time(17, 0), datetime.time(17, 15),datetime.time(17, 30), datetime.time(17, 45), datetime.time(18, 0),
       datetime.time(18, 15), datetime.time(18, 30),datetime.time(18, 45), datetime.time(19, 0), datetime.time(19, 15),datetime.time(19, 30), datetime.time(19, 45), datetime.time(20, 0),datetime.time(20, 15), datetime.time(20, 30),
       datetime.time(20, 45), datetime.time(21, 0), datetime.time(21, 15),datetime.time(22, 15), datetime.time(22, 45),datetime.time(23, 15), datetime.time(23, 30),datetime.time(23, 45)], dtype=object)

y1= numpy.array([ 13.,  16.,   8.,  28.,  45.,  61.,  74., 133., 191., 177., 249.,219., 249., 197.,  89.,  94.,  38.,  16.,   4.,   4.,  12.,  24.,
        15.,  34.,  19.,  23.,  93.,  30.,  40.,  30.,  54.,  41.,  27.,23.,  13.,  31.,  15.,  19.,  18.,  14.,  32.,  19.,  14.,  23.,102.,  30.,  17.,  18., 105.,  67.,  55.,  56., 106.,  50.,  25.,17.,  12.,   8.,  17.,  12.,  15.,   8.,   7.,   6.,   1.,  10.,9.,   5.,   1.,   1.,   1.])


x2 = numpy.array(
    [datetime.time(0, 15), datetime.time(4, 45), datetime.time(5, 15),datetime.time(5, 30), datetime.time(5, 45), datetime.time(6, 0),datetime.time(6, 15), datetime.time(6, 30), datetime.time(6, 45),datetime.time(7, 0), datetime.time(7, 15), datetime.time(7, 30),
       datetime.time(7, 45), datetime.time(8, 0), datetime.time(8, 15),datetime.time(8, 30), datetime.time(8, 45), datetime.time(9, 0),datetime.time(9, 15), datetime.time(9, 30), datetime.time(9, 45),datetime.time(10, 0), datetime.time(10, 15), datetime.time(10, 30),datetime.time(10, 45), datetime.time(11, 0), datetime.time(11, 15),
       datetime.time(11, 30), datetime.time(11, 45), datetime.time(12, 0),datetime.time(12, 15), datetime.time(12, 30),datetime.time(12, 45), datetime.time(13, 0), datetime.time(13, 15),datetime.time(13, 30), datetime.time(13, 45), datetime.time(14, 0),datetime.time(14, 15), datetime.time(14, 30),
       datetime.time(14, 45), datetime.time(15, 0), datetime.time(15, 15),datetime.time(15, 30), datetime.time(15, 45), datetime.time(16, 0),datetime.time(16, 15), datetime.time(16, 30),datetime.time(16, 45), datetime.time(17, 0), datetime.time(17, 15),
       datetime.time(17, 30), datetime.time(17, 45), datetime.time(18, 0),datetime.time(18, 15), datetime.time(18, 30),datetime.time(18, 45), datetime.time(19, 0), datetime.time(19, 15),datetime.time(19, 30), datetime.time(19, 45), datetime.time(20, 0),datetime.time(20, 15), datetime.time(20, 30),datetime.time(20, 45), datetime.time(21, 0), datetime.time(21, 15),
        datetime.time(21, 30), datetime.time(21, 45), datetime.time(22, 0),datetime.time(22, 15), datetime.time(22, 30),datetime.time(22, 45), datetime.time(23, 0), datetime.time(23, 15),datetime.time(23, 30)], dtype=object)

y2 = numpy.array([  1.,  16.,  15.,   7.,  27.,  27.,  86.,  39.,  92., 157., 257.,
       278., 253., 273., 217., 200.,  94.,  86.,  54.,  42.,  24.,  37.,34.,  38.,  34.,  35.,  26.,  51.,  29.,  35.,  30.,  62.,  27.,30.,  19.,  19.,  24.,  23.,  19.,  16.,  13.,  33.,  36.,  20.,
        35., 127.,  50.,  22.,  28., 103.,  84.,  43.,  41., 100.,  33.,33.,  21.,  20.,  19.,  20.,  13.,   8.,  12.,   8.,  11.,   2.,
        14.,   3.,   4.,   4.,   7.,   1.,   3.,   1.,   2.,   1.])

# Organize data in pandas dataframes
df1 = pd.DataFrame({'x':x1, 'y1':y1})
df2 = pd.DataFrame({'x':x2, 'y2':y2})

# merge data
df = pd.merge(df2, df1, how='outer', on='x')
df = df.fillna(method='ffill')
df = df.fillna(method='bfill')

# set up plotly figure
fig = go.Figure()

# add trace for y1
fig.add_traces(go.Scatter(
        x= df['x'],
        y= df['y1'],
        mode = 'lines'
            ))

# add trace for y2
fig.add_traces(go.Scatter(
        x= df['x'],
        y= df['y2'],
        mode = 'lines'
            ))


fig.show()
...