Я хотел бы создать фигуру с графиками 3x3 (тепловыми картами), ширина одинакова для всех 9 графиков. Однако высота должна быть разной для каждого графика, так как высота должна быть равна number_of_cells_of Heatplot*cell_height. Теперь я могу сделать так, чтобы каждая строка на моем рисунке имела разную высоту, но не могу изменить высоту подграфиков внутри строки. Я приложил скриншот, чтобы было понятнее, мне бы хотелось, чтобы ячейки всех тепловых графиков имели одинаковую высоту, тогда это будет означать, например, подграфик в первой строке и втором столбце будет всего одной строкой.
Это мой код на данный момент
Я хотел бы создать фигуру с графиками 3x3 (тепловыми картами), ширина одинакова для всех 9 графиков. Однако высота должна быть разной для каждого графика, так как высота должна быть равна number_of_cells_of Heatplot*cell_height. Теперь я могу сделать так, чтобы каждая строка на моем рисунке имела разную высоту, но не могу изменить высоту подграфиков внутри строки. Я приложил скриншот, чтобы было понятнее, мне бы хотелось, чтобы ячейки всех тепловых графиков имели одинаковую высоту, тогда это будет означать, например, подграфик в первой строке и втором столбце будет всего одной строкой. Это мой код на данный момент [code]import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from matplotlib import gridspec
# Calculate row counts for each group row_counts = [len(pivot_df.loc[pivot_df['group'] == group]) for group in groups]
# Calculate height ratios based on the row count for each group to ensure each cell has the same height cell_height = 0.5 # Set a fixed cell height height_ratios = [count * cell_height for count in row_counts]
# Create the figure and GridSpec with proportional height ratios for each subplot fig = plt.figure(figsize=(32, 21)) gs = gridspec.GridSpec(3, 3, height_ratios=[max(height_ratios[:3]), max(height_ratios[3:6]), max(height_ratios[6:])])
# Add subplots to the grid axes = [fig.add_subplot(gs[i // 3, i % 3]) for i in range(9)]
for i, group in enumerate(groups): # Get the data for the current group group_data = pivot_df.loc[pivot_df['group'] == group].set_index('names').drop(columns={'group'})
# Create annotation array annotations = group_data.copy() for col in ['col6', 'col7', 'col8', 'col9']: annotations[col] = annotations[col].apply(lambda x: f"{x:.2f}M") for col in ['col1', 'col2', 'col3', 'col4', 'col5']: annotations[col] = annotations[col].apply(lambda x: f"{x:.2f}")
# Plot each column individually with separate bounds for j, col in enumerate(group_data.columns): # Create a mask for other columns to plot each individually mask = np.ones(group_data.shape) mask[:, j] = 0 # Mask all except the current column
# Rotate y-tick labels to be horizontal if there are any labels yticklabels = group_data.index.tolist() axes[i].set_yticks(np.arange(len(group_data))) # Set tick positions based on number of rows axes[i].set_yticklabels(yticklabels, rotation=0, ha='right', fontsize=8)
if i < 6: # Only for the top two rows (0–5), remove x labels and ticks axes[i].set_xlabel('') axes[i].set_xticks([])