Изменение размеров подзаговоров и добавление цветовой шкалы с помощью histogram2d

Я пытаюсь создать фигуру с 1 строкой и 3 столбцами и борюсь со многими вещами. С одной стороны, мои подсюжеты оказываются очень маленькими осколками, и я получаю сообщение об ошибке при попытке добавить цветную полосу. Как сделать так, чтобы подзаголовки были прямоугольниками, а цветная полоса отображалась справа?

Значения rmax0, rmax1 и rmax2 находятся в диапазоне от 0 до 700 (большинство менее 200), а fspd - от 0 до 10.

import matplotlib.pyplot as plt
import numpy as np

ax1 = plt.subplot(131)
nice = plt.get_cmap('BuPu')
bins1 = np.arange(0,700,700/50.0)
bins2 = np.arange(0,10,10/50.0)
h,xedges,yedges = np.histogram2d(rmax0,fspd,bins=[bins1,bins2],normed=True)
X,Y = np.meshgrid(xedges,yedges)
ax1.pcolormesh(X, Y, h,cmap=nice)
ax1.set_aspect('equal')
plt.xlim([0,200])
plt.ylim([0,10])

ax2 = plt.subplot(132)
h,xedges,yedges = np.histogram2d(rmax1,fspd,bins=[bins1,bins2],normed=True)
X,Y = np.meshgrid(xedges,yedges)
ax2.pcolormesh(X, Y, h,cmap=nice)
ax2.set_aspect('equal')
plt.xlim([0,200])
plt.ylim([0,10])

ax3 = plt.subplot(133)
h,xedges,yedges = np.histogram2d(rmax2,fspd,bins=[bins1,bins2],normed=True)
X,Y = np.meshgrid(xedges,yedges)
ax3.pcolormesh(X, Y, h,cmap=nice)
ax3.set_aspect('equal')
plt.xlim([0,200])
plt.ylim([0,10])
plt.colorbar()

plt.show()

Когда я добавляю строку plt.colorbar(), я получаю следующую ошибку: RuntimeError: Не найдено ни одного сопоставимого элемента для создания цветовой панели. Сначала определите сопоставляемую информацию, такую ​​как изображение (с imshow) или набор контуров (с контуром).

1 ответ

Решение

Ваши сюжеты заканчиваются крошечными полосками, потому что вы увеличиваете соотношение сторон. Попробуйте отключить эти строки:

ax1.set_aspect('equal')
ax2.set_aspect('equal')
ax3.set_aspect('equal')

Colorbar покажет, если вы называете это так:

p = ax3.pcolormesh(X, Y, h, cmap=nice)
plt.colorbar(p, ax=[ax1, ax2, ax3])

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

Скопируйте и вставьте полный код, который я использовал для проверки этого:

import matplotlib.pyplot as plt
import numpy as np

rmax0 = np.random.rand(1000) * 700
rmax1 = np.random.rand(1000) * 700
rmax2 = np.random.rand(1000) * 700
fspd = np.random.rand(1000) * 10

ax1 = plt.subplot(131)
nice = plt.get_cmap('BuPu')
bins1 = np.arange(0,700,700/50.0)
bins2 = np.arange(0,10,10/50.0)
h,xedges,yedges = np.histogram2d(rmax0,fspd,bins=[bins1,bins2],normed=True)
X,Y = np.meshgrid(xedges,yedges)
ax1.pcolormesh(X, Y, h,cmap=nice)
ax1.set_aspect('auto')
plt.xlim([0,200])
plt.ylim([0,10])

ax2 = plt.subplot(132)
h,xedges,yedges = np.histogram2d(rmax1,fspd,bins=[bins1,bins2],normed=True)
X,Y = np.meshgrid(xedges,yedges)
ax2.pcolormesh(X, Y, h,cmap=nice)
ax2.set_aspect('auto')
plt.xlim([0,200])
plt.ylim([0,10])

ax3 = plt.subplot(133)
h,xedges,yedges = np.histogram2d(rmax2,fspd,bins=[bins1,bins2],normed=True)
X,Y = np.meshgrid(xedges,yedges)
p = ax3.pcolormesh(X, Y, h,cmap=nice)
ax3.set_aspect('auto')
plt.xlim([0,200])
plt.ylim([0,10])
plt.colorbar(p, ax=[ax1, ax2, ax3])

plt.show()
Другие вопросы по тегам