Как предотвратить перемещение цветовой полосы вверх / вниз при изменении высоты тепловой карты?Matplotlib / Сиборн - PullRequest
1 голос
/ 19 июня 2019

Я генерирую тепловую карту динамически, и количество категорий на осях Y и X может отличаться каждый раз. Как я могу расположить цветовую панель рядом с тепловой картой, чтобы она всегда была привязана к самому верху (в основном, к первой строке тепловой карты) независимо от высоты фигуры?

Вот что происходит:

enter image description here

enter image description here

Мне до сих пор удавалось устанавливать высоту и ширину цветовой панели, используя add_axes, чтобы они оставались постоянными независимо от размера фигуры. Однако я изо всех сил пытаюсь установить его положение оси Y динамически. Минимальный пример ниже:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size

data = np.random.rand(5,5)

# Dynamic figure parameters.
topmargin = 0.1 
bottommargin = 0.1 
# Square height
cat_height = 0.4 
# Number of y-axis points.
n=data.shape[0]

leftmargin = 0.1
rightmargin = 0.1
# Square width.
cat_width = 0.5
# Number of x-axis points.
m=data.shape[1]

# Dynamic figure height.
figheight = topmargin + bottommargin + (n+1)*cat_height
# Dynamic figure width.
figwidth = leftmargin + rightmargin + (m+1)*cat_width

fig, ax = plt.subplots(figsize=(figwidth, figheight))

# [x, y, width, height]
cbar_ax = fig.add_axes([0.93, 0.33, 0.13/m, 2.75/n])

# Plot the heatmap.
ax = sns.heatmap(data, ax=ax, cmap='coolwarm', cbar_ax=cbar_ax, cbar=True)

plt.show()

Обычно цветовая полоса перемещается вверх / вниз при изменении высоты фигуры, но мне бы хотелось, чтобы она каждый раз закреплялась наверху фигуры.

1 Ответ

1 голос
/ 19 июня 2019

Вы можете просто вычислить нижние координаты на основе высоты вашего cbar и вершины осей тепловой карты.

cbar_ax = fig.add_axes([0.93, 0.88-2.75/n, 0.13/m, 2.75/n])

0.88 - это верхняя часть верхнего подпункта с полями по умолчанию (см. plt.rcParams['figure.subplot.top']).

Однако для такого рода вещей я бы использовал GridSpec для определения сетки осей с настраиваемыми соотношениями размеров (отрегулируйте height_ratios в соответствии со своими потребностями):

gs = matplotlib.gridspec.GridSpec(2,2, height_ratios=[3,n-3], width_ratios=[20,1])
fig = plt.figure(figsize=(figwidth, figheight))
ax = fig.add_subplot(gs[:,0])
cbar_ax = fig.add_subplot(gs[0,1])
...