3

是否有关于如何在 python 中为 plotly 设置辅助 Y 轴的指南?我正在通过迭代循环分配轴样式,如下所示:

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轴的分配如何工作?

如果我的子图包括总共 20 个子图的 4 行和 5 列,我是否必须假设 plotly 需要接收奇数和偶数,意思 yaxis1yaxis2plot1

……

yaxis39并且yaxis40对于plot20

4

3 回答 3

2

这样做是可能的,但它不是特别直观。以这个例子为例,我创建了一个 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')
于 2017-12-06T03:43:23.003 回答
1

不是一个确切的答案,但我认为它可能会有所帮助......

我喜欢用熊猫和袖扣。以下是如何使用辅助 y 轴在图表上绘制来自一个数据帧 (df) 的两组数据的示例。在此示例中,来自每个轴的数据以不同的格式显示(散点图和条形图)。数据预先排列成列。

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'])
于 2016-11-07T19:24:54.607 回答
0

命名约定是 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'
)
于 2016-11-07T18:23:37.073 回答