Слишком короткие настройки Matplotlib

#python #matplotlib #subfigure

Вопрос:

Я пытаюсь отобразить фигуру с подфигурами. Каждая подфигура сжимается вертикально, и я не понимаю, почему. Я попытался установить соотношение сторон, но это, похоже, только сужает его, не решая проблему того, что изображение недостаточно высокое, чтобы быть полезным. Я использую tight_layout , но выходного размера более чем достаточно, чтобы он был больше. Я знаю, что могу более конкретно задать размер своих изображений с помощью макетов сетки, но я чувствую, что мне не хватает чего-то более простого, поскольку это не было проблемой ни с одним из моих подобных сюжетов с подфигурами.

Спасибо!

Вывод моего Графика

 def plot_at_all_intervals_mod(series, series_name, series_file_name, is_date, write, ROLL_NUM = 4):
    plt.close()
    fig, axs = plt.subplots(4, 2)
    
#     for row in axs:
#         for ax in row:
#             ax.set_aspect('equal')
    
    #absolute
    if is_date:
        my_range = (unix_time_to_year(min(series)), unix_time_to_year(max(series)))
        values, bins, _ = axs[0,0].hist(unix_time_to_year(series), log=False, bins=200, range=my_range)
    else:
        my_range = (min(series) / SECONDS_IN_A_YEAR, max(series) / SECONDS_IN_A_YEAR) 
        values, bins, _ = axs[0,0].hist(series / SECONDS_IN_A_YEAR, log=False, bins=200, range=my_range)
    bins = bins.tolist()[:-1]
    values = circular_moving_average(values.tolist(), ROLL_NUM)
    axs[0,0].plot(bins,values)
    axs[0,0].set_xlabel('Absolute Time')
    axs[0,0].set_ylabel('Number of Logs')
    axs[0,0].set_title(f'Distribution of {series_name} nOver Time')
    
    #year
    values, bins, _ = axs[0,1].hist(unix_time_to_day_of_year(series), log=False, bins=365*24)
    bins = bins.tolist()[:-1 ]
    values = circular_moving_average(values.tolist(), ROLL_NUM)
    axs[0,1].plot(bins,values)
    axs[0,1].set_xlabel('Day of Year (Starting Jan 1st)')
    axs[0,1].set_ylabel('Number of Logs')
    axs[0,1].set_title(f'Distribution of {series_name} nModulo Year')
    
    #week
    values, bins, _ = axs[1,0].hist(unix_time_to_day_of_week(series), log=False, bins=7*24*60)
    bins = bins.tolist()[:-1]
    values = circular_moving_average(values.tolist(), ROLL_NUM)
    axs[1,0].plot(bins,values)
    axs[1,0].set_xlabel('Day of Week (Starting at 0=Monday)')
    axs[1,0].set_ylabel('Number of Logs')
    axs[1,0].set_title(f'Distribution of {series_name} nOver Time Modulo Week')
    
    #day
    values, bins, _ = axs[1,1].hist(unix_time_to_time_of_day(series), log=False, bins=24*60)
    bins = bins.tolist()[:-1 * ROLL_NUM]
    values = moving_average(values.tolist(), ROLL_NUM)
    axs[1,1].plot(bins,values)
    axs[1,1].set_xlabel('Hour of Day')
    axs[1,1].set_ylabel('Number of Logs')
    axs[1,1].set_title(f'Distribution of {series_name} nOver Time Modulo Day')
    
    #hour
    values, bins, _ = axs[2,0].hist(unix_time_to_minute_in_hour(series), log=False, bins=60*60)
    bins = bins.tolist()[:-1]
    values = circular_moving_average(values.tolist(), ROLL_NUM)
    axs[2,0].plot(bins,values)
    axs[2,0].set_xlabel('Minute of Hour')
    axs[2,0].set_ylabel('Number of Logs')
    axs[2,0].set_title(f'Distribution of {series_name} nOver Time Modulo Hour')
    
    #10 minutes
    values, bins, _ = axs[2,1].hist(unix_time_to_minute_in_hour(series), log=False, bins=60*60)
    bins = bins.tolist()[:-1]
    values = circular_moving_average(values.tolist(), ROLL_NUM)
    axs[2,1].plot(bins,values)
    axs[2,1].set_xlabel('Minute of Hour')
    axs[2,1].set_ylabel('Number of Logs')
    axs[2,1].set_title(f'Distribution of {series_name} nOver Time Modulo Hour')
    
    #minute
    ROLL_NUM = 1
    values, bins, _ = axs[3,0].hist(unix_time_to_second_in_minute(series), log=False, bins=60)
    bins = bins.tolist()[:-1 * ROLL_NUM]
    values = moving_average(values.tolist(), ROLL_NUM)
    axs[3,0].plot(bins,values)
    axs[3,0].set_xlabel('Second of Minute')
    axs[3,0].set_ylabel('Number of Logs')
    axs[3,0].set_title(f'Distribution of {series_name} n Over Time Modulo Minute')
    
    fig.suptitle(f'Distribution of {series_name} Over Different Periods', fontsize=16)
    fig.tight_layout()
    fig.set_size_inches(20, 20)
    fig.show()
    if write:
        fig.savefig(f'all-times-{series_file_name}.png')
 

Комментарии:

1. Обновление: теперь я вижу, что при настройке моего рисунка на 4 х 2 подзаголовка по умолчанию для подзаголовков задается определенное соотношение сторон. Исправляя это, я все еще получаю участки, которые просто слишком малы.

2. Подфигуры и плотная компоновка несовместимы. Вместо этого используйте constrained_layout.

3. Вы получите больше помощи с автономным примером. Никто не может проверить это за вас. Однако мой комментарий выше был неверным, потому что вы не используете подфигуру. Для подзаголовков tight_layout должен работать, поэтому я не уверен, в чем здесь проблема