2016-11-07 250 views
2

是否有關於如何在python中設置輔助Y軸的指導? 我通過迭代循環assinging軸風格,如下:有兩個y軸(每個)的子圖 - plotly和python/pandas

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個次要情節,我必須假設plotly需要接收單雙號,意思是: yaxis1yaxis2plot1

....爲plot20

+0

其他人有關於如何實現這一點的建議? – Andreuccio

回答

0

yaxis39yaxis40的命名規則是Y,Y2,Y3,... Y40,和您在跟蹤字典的參考軸。

所以,你的痕跡應該是這樣......

trace0 = dict(
    x = xvals, 
    y = yvals, 
    yaxis = 'y' 
) 
trace1 = dict(
    x = x2vals, 
    y = y2vals, 
    yaxis = 'y2' 
) 
.... 
trace40 = dict(
    x = x40vals, 
    y = y40vals, 
    yaxis = 'y40' 
) 
+0

我不確定我的問題是否清楚。如果我按照你的建議做,我會爲每個子圖獲取一個y軸,並且我定義的兩個y軸(一個範圍[0,5],另一個[0,20]在後續子圖之間交替出現,而不是出現在同一時間每個陰謀 https://plot.ly/~andrea.botti/627.embed – Andreuccio

+0

我認爲你不能這個代碼與子圖 – Axis

0

沒有一個確切的答案,但我認爲它可以幫助...

我喜歡用熊貓和袖釦。下面是一個示例,說明如何使用次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']) 
+0

感謝那, 這真的很有用 不幸的是,不回答我的主要關於如何生成每個具有兩個y軸的子圖的問題 – Andreuccio

1

可以這樣做,但它不是特別直觀。以此示例爲例,我創建了一個繪圖2x2子繪圖,並將第二個y軸添加到位置2,2的繪圖。

當您創建子圖時,它們在每個子圖的左側分配y軸:「y1」,「y2」,「y3」,「y4」。對於第二個y軸,需要使用fig['layout'].update創建對應於「y1」,「y2」,「y3」,「y4」的新軸「y5」,「y6」,「y7」,「y8」。所以右下角的子圖將有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')