2016-08-17 4 views
1

Итак, я пытаюсь отобразить сборку подстроек imshow (heatmap) на одной фигуре, бок о бок и ряд за строкой. Как prelim, я тестирую только отображение 2 штрафных и проблем.Matplotlib - imshow subsplots overlapping

См код ниже:

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.tight_layout() как раз перед plt.show()

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

Смежные вопросы