Подзаголовки с двумя осями y (каждая) - plotly и python / pandas

Есть ли рекомендации по настройке вторичных осей Y в Python для plotly? Я использую стиль оси с помощью итеративного цикла, как показано ниже:

all_plots = ['plot1','plot2'...'plot20']
fig = tools.make_subplots(rows=nrow, cols=ncol, shared_xaxes=False, shared_yaxes=False, subplot_titles=all_plots)
for i in all_plots:
    fig['layout']['yaxis'+str(j)].update()

Как работает назначение осей y?

Если мой подзаголовок включал, скажем, 4 строки и 5 столбцов, всего 20 подзаговоров, должен ли я предполагать, что сюжету нужно получать нечетные и четные числа, что означает: yaxis1 и yaxis2 для plot1

....

yaxis39 и yaxis40 для plot20


person Andreuccio    schedule 07.11.2016    source источник
comment
у кого-нибудь еще есть предложение о том, как этого добиться?   -  person Andreuccio    schedule 17.11.2016


Ответы (3)


Это возможно, но не очень интуитивно. Возьмем этот пример, где я создаю подзаголовки 2x2 и добавляю вторичную ось y к графику в позиции 2,2.

Когда вы создаете подзаголовки, им назначаются оси y: «y1», «y2», «y3», «y4» в левой части каждого подзаголовка. Для вторичных осей y вам нужно использовать fig['layout'].update для создания новых осей «y5», «y6», «y7», «y8», которые соответствуют «y1», «y2», «y3», «y4». Таким образом, нижний правый подзаголовок будет иметь оси y4 (справа) и y8 (слева). В приведенном ниже примере я создаю только вторичную ось Y для последнего графика, но расширить ее до большего количества / всех подзаголовков довольно просто.

Важно отметить, что создание вторичных осей и их назначение в trace5 не помещает их автоматически на соответствующие оси. Вам все равно придется вручную назначить его с помощью fig['data'][4].update(yaxis='y'+str(8)), чтобы отобразить его относительно левой оси.

fig = tools.make_subplots(rows=2, cols=2,subplot_titles=('Air Temperature', 'Photon Flux Density',
                                                         'Ground Temps','Water Table & Precip'))


fig['layout']['xaxis1'].update( range=[174, 256])
fig['layout']['xaxis3'].update(title='Day of Year', range=[174, 256])
fig['layout']['yaxis1'].update(title='Degrees C',range=[-5,30])
fig['layout']['yaxis2'].update(title='mmol m<sup>-2</sup> m<sup>-d</sup>', range=[0, 35])
fig['layout']['yaxis3'].update(title='Ground Temps', range=[0, 11])
fig['layout']['yaxis4'].update(title='depth cm', range=[-20, 0])
fig['layout']['yaxis8'].update(title='rainfall cm', range=[0, 1.6])
fig['layout'].update(showlegend=False, title='Climate Conditions')



# In this example, I am only doing it for the last subplot, but if you wanted to do if for all, 
# Just change to range(1,5)

for k in range(4,5):  
    fig['layout'].update({'yaxis{}'.format(k+4): dict(anchor='x'+str(k),
                                                          overlaying='y'+str(k),
                                                          side='right',
                                                         )
                            })

trace1 = go.Scatter(
        y=Daily['AirTC_Avg'],
        x=Daily.index,
        marker = dict(
        size = 10,
        color = 'rgba(160, 0, 0, .8)',),
        error_y=dict(
            type='data',
            array=Daily_Max['AirTC_Avg']-Daily_Min['AirTC_Avg'],
            visible=True,
        color = 'rgba(100, 0, 0, .5)',
        ),
    name = 'Air Temp'
    )

trace2 = go.Bar(
        y=Daily['PPFD']/1000,
        x=Daily.index,
        name='Photon Flux',
        marker=dict(
            color='rgb(180, 180, 0)'
        ),

    yaxis='y2',
)

trace3 = go.Scatter(
        y=Daily['Temp_2_5_1'],
        x=Daily.index,
        name='Soil Temp',
        marker=dict(
            color='rgb(180, 0, 0)'
        ),

    yaxis='y3',
)


trace4 = go.Scatter(
        y=Daily['Table_1']*100,
        x=Daily.index,
        name='Water Table',
        marker=dict(
            color='rgb(0, 0, 180)'
        ),

    yaxis='y4',
)

trace5 = go.Bar(
        y=Daily['Rain']/10,
        x=Daily.index,
        name='Rain',
        marker=dict(
            color='rgb(0, 100, 180)'
        ),

    yaxis='y8',
)

fig.append_trace(trace1, 1, 1)
fig.append_trace(trace2, 1, 2)
fig.append_trace(trace3, 2, 1)
fig.append_trace(trace4, 2, 2)
fig.append_trace(trace5, 2, 2)


## This part is important!!! you have to manually assing the data to the axis even 
# though you do it when defining trace 5
fig['data'][4].update(yaxis='y'+str(8))
plot(fig, filename='FI_Climate')
person June Skeeter    schedule 06.12.2017

Не точный ответ, но я подумал, что это может помочь ...

Я люблю использовать панды и запонки. Вот пример того, как построить два набора данных из одного фрейма данных (df) на графике с использованием вторичной оси y. В этом примере данные по каждой оси отображаются в разных форматах (разброс и полоса). Данные заранее распределяются по столбцам.

import pandas as pd
import cufflinks as cf
from plotly.offline import download_plotlyjs, init_notebook_mode,plot,iplot    

fig1 = df.iplot(kind='scatter', mode='lines+markers', x=['col1', 'col2'],
                y=['col3', 'col4',],
                asFigure=True)
fig2 = df.iplot(kind='bar', x=['col1', 'col2'],
                  y=['col3', 'col4', ],
                  secondary_y=['col5','col6'],asFigure=True)
fig2['data'].extend(fig1['data'])
person sparrow    schedule 07.11.2016
comment
спасибо за это, это действительно полезно. К сожалению, это не отвечает на мой главный вопрос о том, как создавать подзаголовки с двумя осями y каждая. - person Andreuccio; 15.11.2016

Соглашение об именах y, y2, y3 ... y40, и вы делаете ссылку на ось в trace dict.

Так что ваши следы должны быть похожи на ...

trace0 = dict(
    x = xvals,
    y = yvals,
    yaxis = 'y'
)
trace1 = dict(
     x = x2vals,
     y = y2vals,
     yaxis = 'y2'
)
....
trace40 = dict(
     x = x40vals,
     y = y40vals,
     yaxis = 'y40'
)
person Sam    schedule 07.11.2016
comment
Я не уверен, что мой вопрос был ясен. Если я сделаю то, что вы рекомендуете, я получу одну ось Y для каждого подзаголовка, и две мои определенные оси Y (одна в диапазоне [0,5], другая [0,20] чередуются между последующими подзаголовками, а не появляются на одинаковое время для каждого участка plot.ly/~andrea.botti/627.embed - person Andreuccio; 07.11.2016