将单个颜色条添加到多个 healpy 子图中
Adding a single colorbar to multiple healpy subplots
我想向包含多个 healpy
图的图形添加自定义 plt.colorbar
。我发现很多关于如何针对多个 axes
对象的常见情况执行此操作的帖子,但是 healpy
使它变得困难。
到目前为止,我有以下 MWE:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import healpy as hp
rows, cols = 8, 8
nplots = rows * cols
npix = 48
data = np.random.uniform(size=(nplots, npix))
fig = plt.figure()
for i in range(len(data)):
hp.mollview(data[i, :], title='', cbar=False, fig=fig,
sub=(rows, cols, i+1), margins=(0, 0, 0, 0),
min=data.min(), max=data.max())
fig, ax = plt.gcf(), plt.gca()
image = ax.get_images()[0]
norm = mpl.colors.Normalize(vmin=data.min(), vmax=data.max())
from mpl_toolkits.axes_grid1 import make_axes_locatable
divider = make_axes_locatable(ax)
cax = divider.new_vertical(size="5%", pad=0.7, pack_start=True)
fig.add_axes(cax)
fig.colorbar(image, cax=cax, norm=norm, orientation='horizontal',
label='colorbar')
plt.show()
See the erroneous plot here
如链接图片所示,我最终将 colorbar
附加到最后一个 ax
而不是整个 fig
。我想要一个简单的 colorbar
在 fig
的底部(或右侧),其范围如上所示通过 Normalize
指定。同样,至少据我所知,我正在使用 healpy
来生成排除通常解决方案的数字。
我没有安装 healpy,但可能这个库只是创建了自己的轴。下面的代码模拟了这种情况。您可以从 fig.axes
获取坐标轴。
与 this tutorial 一样,只需给出所有 'axes' 的列表即可放置默认颜色条(ax
或多或少是 matplotlib 的子图名称):plt.colorbar(im, ax=fig.axes)
.如果颜色栏太大,它有一个 shrink=0.6
参数。
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure(figsize=(20, 6))
nrows = 4
ncols = 6
for i in range(1, nrows + 1):
for j in range(1, ncols + 1):
plt.subplot(nrows, ncols, (i - 1) * ncols + j, projection="mollweide")
arr = np.random.rand(18, 36)
Lon, Lat = np.meshgrid(np.linspace(-np.pi, np.pi, 36 + 1), np.linspace(-np.pi / 2., np.pi / 2., 18 + 1))
plt.pcolormesh(Lon, Lat, arr, cmap=plt.cm.hot)
im = fig.axes[0].collections[0] # or fig.axes[0].get_images()[0] when created as image
plt.colorbar(im, ax=fig.axes)
plt.show()
请注意,在您的代码中,fig
已经指向当前图窗,因此 fig = plt.gcf()
变得不必要了。 ax = plt.gca()
表示最后激活的 ax
。在示例图的情况下,这似乎是右下角的。因此,这有助于找到示例图像,但不会将颜色条放置在所有子图旁边。
如果您需要更多地控制颜色条的放置,您也可以采用 this post:
中的方法
fig.subplots_adjust(right=0.85)
cbar_ax = fig.add_axes([0.90, 0.15, 0.03, 0.7])
fig.colorbar(im, cax=cbar_ax)
我想向包含多个 healpy
图的图形添加自定义 plt.colorbar
。我发现很多关于如何针对多个 axes
对象的常见情况执行此操作的帖子,但是 healpy
使它变得困难。
到目前为止,我有以下 MWE:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import healpy as hp
rows, cols = 8, 8
nplots = rows * cols
npix = 48
data = np.random.uniform(size=(nplots, npix))
fig = plt.figure()
for i in range(len(data)):
hp.mollview(data[i, :], title='', cbar=False, fig=fig,
sub=(rows, cols, i+1), margins=(0, 0, 0, 0),
min=data.min(), max=data.max())
fig, ax = plt.gcf(), plt.gca()
image = ax.get_images()[0]
norm = mpl.colors.Normalize(vmin=data.min(), vmax=data.max())
from mpl_toolkits.axes_grid1 import make_axes_locatable
divider = make_axes_locatable(ax)
cax = divider.new_vertical(size="5%", pad=0.7, pack_start=True)
fig.add_axes(cax)
fig.colorbar(image, cax=cax, norm=norm, orientation='horizontal',
label='colorbar')
plt.show()
See the erroneous plot here
如链接图片所示,我最终将 colorbar
附加到最后一个 ax
而不是整个 fig
。我想要一个简单的 colorbar
在 fig
的底部(或右侧),其范围如上所示通过 Normalize
指定。同样,至少据我所知,我正在使用 healpy
来生成排除通常解决方案的数字。
我没有安装 healpy,但可能这个库只是创建了自己的轴。下面的代码模拟了这种情况。您可以从 fig.axes
获取坐标轴。
与 this tutorial 一样,只需给出所有 'axes' 的列表即可放置默认颜色条(ax
或多或少是 matplotlib 的子图名称):plt.colorbar(im, ax=fig.axes)
.如果颜色栏太大,它有一个 shrink=0.6
参数。
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure(figsize=(20, 6))
nrows = 4
ncols = 6
for i in range(1, nrows + 1):
for j in range(1, ncols + 1):
plt.subplot(nrows, ncols, (i - 1) * ncols + j, projection="mollweide")
arr = np.random.rand(18, 36)
Lon, Lat = np.meshgrid(np.linspace(-np.pi, np.pi, 36 + 1), np.linspace(-np.pi / 2., np.pi / 2., 18 + 1))
plt.pcolormesh(Lon, Lat, arr, cmap=plt.cm.hot)
im = fig.axes[0].collections[0] # or fig.axes[0].get_images()[0] when created as image
plt.colorbar(im, ax=fig.axes)
plt.show()
请注意,在您的代码中,fig
已经指向当前图窗,因此 fig = plt.gcf()
变得不必要了。 ax = plt.gca()
表示最后激活的 ax
。在示例图的情况下,这似乎是右下角的。因此,这有助于找到示例图像,但不会将颜色条放置在所有子图旁边。
如果您需要更多地控制颜色条的放置,您也可以采用 this post:
中的方法fig.subplots_adjust(right=0.85)
cbar_ax = fig.add_axes([0.90, 0.15, 0.03, 0.7])
fig.colorbar(im, cax=cbar_ax)