2016-08-17 84 views
1

所以我試圖在單個圖上顯示imshow(熱圖)子圖的集合,並排和逐行。作爲一個prelim,我正在測試只顯示2罰款,並遇到問題。Matplotlib - imshow子流圖重疊

見下面的代碼:

axes = [] 

fig = plt.figure()#figsize=(10,5)) 
idx = 0 

for symbol in ['EURUSD','GBPUSD']: 

    df = get_data_period_symbol('1h', symbol) 

    ranges_df = ranges(df) 

    # Define x and y as the length of columns and indices for use in setting 
    # x and y ticks 
    x, y = len(ranges_df.columns.values), len(ranges_df.index.values) 
    axes.append(fig.add_subplot(1, idx+1, 1)) 
    # Get axes from imshow 
    axes[idx].imshow(ranges_df, interpolation='nearest', cmap='Oranges', aspect='auto') 

    # Set values for x/y ticks/labels 
    axes[idx].set_xticks(np.linspace(0, x-1, x)) 
    axes[idx].set_xticklabels(ranges_df.columns) 
    axes[idx].set_yticks(np.linspace(0, y-1, y)) 
    axes[idx].set_yticklabels(ranges_df.index) 

    # Hide grid lines 
    axes[idx].grid('off') 
    # Push x axis to top instead of bottom 
    axes[idx].xaxis.tick_top() 
    axes[idx].autoscale(False) 


    for i, j in product(range(y), range(x)): 
     _ = axes[idx].text(j, i, '{0:.0f}'.format(ranges_df.iloc[i, j]), 
     size='small', ha='center', va='center') 

    idx += 1 

plt.show() 

值得注意的是,我只用plt.show之前plt.tight_layout()()時,遇到下列錯誤

UserWarning: tight_layout : falling back to Agg renderer 

上面的代碼產生以下圖像:

enter image description here

的繪圖的範圍從1-12(月,在x軸上)和2001-2015在y軸上。您應該注意到,右側的情節似乎從左側的情節開始,然後一直延伸到右側。我只是想讓他們坐得舒服!

所討論的總體意圖是在一個圖中有許多這樣的圖形,一旦我得到這個破解,我將能夠動態地使用行/列。

回答

1

我相信它應該是add_subplot(1, 2, idx+1)。這是子圖由行數,然後列數,然後區域序數定義。

除了這個問題,你可能會想「pythonize」你的代碼位通過自動索引這樣的:

for idx, symbol in enumerate(['EURUSD','GBPUSD']): 
+1

這工作一種享受,謝謝。此外,自動索引是一個很好的觸摸,顯然是一個最佳實踐 - 將採用 – cardycakes