Matplotlib (GridSpec) - Обрезка меток на осях подплота? Пробовал `ight_layout` - PullRequest
0 голосов
/ 01 мая 2018

Я использую GridSpec для организации подзаговоров. У меня есть общий colorbar для всех участков.

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

Я также пытался использовать rect параметр tight_layout для fig, plt и gs.

import matplotlib
import matplotlib.pyplot as plt
import numpy as np 
from pylab import *
import matplotlib.gridspec as gridspec
import matplotlib.colors
from mpl_toolkits.mplot3d import Axes3D

gs = gridspec.GridSpec(1,7,hspace=0.05,wspace=0.5, width_ratios=[1,1,1,1,1,1,0.1])
figure(num=None, figsize=(18, 2), dpi=80, facecolor='w', edgecolor='k')

data = np.random.rand(3,6,224,5)

for i in range(6):
    ax = plt.subplot(gs[0, i], projection='3d')
    p = ax.scatter(data[0,i,:,0], data[0,i,:,1], data[0,i,:,2], c=data[0,i,:,4], marker='o')
    title("Case " + str(i+1))
    ax.set_xlabel('Batch Size', linespacing=3)
    ax.set_ylabel('Window Size', linespacing=3)
    ax.set_zlabel('Neurons', linespacing=3)
    ax.xaxis.labelpad=20
    ax.yaxis.labelpad=20
    ax.zaxis.labelpad=10

cbar = plt.subplot(gs[0,6])
colorbar(p, cax=cbar, label='RMSE')

plt.show()

Это генерирует изображение ниже.

enter image description here

1 Ответ

0 голосов
/ 01 мая 2018

Как прокомментировано, установка параметра bottom на большее значение, например bottom=0.3 даст вам больше места для размещения декораторов осей.

Кроме того, может быть полезно сделать фигуру немного выше (например, 3 дюйма вместо 2), чтобы не слишком сильно сжимать графики.

import matplotlib.pyplot as plt
import numpy as np 
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D

gs = gridspec.GridSpec(1,7,hspace=0.05,wspace=0.5, bottom=0.3,
                       left=0.02, right=0.95, width_ratios=[1,1,1,1,1,1,0.1])
fig = plt.figure(figsize=(18, 3), dpi=80, facecolor='w', edgecolor='k')

data = np.random.rand(3,6,224,5)

for i in range(6):
    ax = plt.subplot(gs[0, i], projection='3d')
    p = ax.scatter(data[0,i,:,0], data[0,i,:,1], data[0,i,:,2], 
                   c=data[0,i,:,4], marker='o')
    ax.set_title("Case " + str(i+1))
    ax.set_xlabel('Batch Size', linespacing=3)
    ax.set_ylabel('Window Size', linespacing=3)
    ax.set_zlabel('Neurons', linespacing=3)
    ax.xaxis.labelpad=20
    ax.yaxis.labelpad=20
    ax.zaxis.labelpad=10

cbar = plt.subplot(gs[0,6])
fig.colorbar(p, cax=cbar, label='RMSE')

# This is only needed for jupyter
fig.add_axes([0,0,1,1]).axis("off")

plt.show()

enter image description here

К сожалению, в jupyter бэкэнд %matplotlib inline всегда создает свои изображения с настройкой bbox_inches = "tight". Таким образом, обходной путь заключается в создании некоторого элемента на рисунке, который гарантирует, что «узкая» область достаточно велика. Здесь можно использовать fig.add_axes([0,0,1,1]).axis("off").

...