Matplotlib颜色栏多个plt.imshow绘图

2024-06-25 23:56:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想画一个大的总览图。为此,我使用plt.imshow绘制不同密度的矩阵。问题是颜色条不想和我一起工作。如图所示。现在我有两个问题

  • 如何确保所有绘图(颜色相同)具有相同的色条范围我如何在最后两个Calm中间得到第二个颜色条。<李>

enter image description here

我当前的代码是(为了测试,您可以将eval(data)更改为随机矩阵):

a = 5
b = 4
fig, axs = plt.subplots(a, b , figsize=(8.27, 11.69), tight_layout=True, sharey=True, sharex=True, gridspec_kw = {'wspace':0, 'hspace':0})

data = ['map_sm_', 'map_dens_']
gasf = ['fg10', 'fg20', 'fg30', 'fg50', 'fg70']
dire = ['x', 'z', 'x', 'z']


cm = ['hot', 'viridis']

for col in range(b):
    for row in range(a):
        ax = axs[row, col]
        if col ==0:
            ax.set_ylabel('x (kpc)', fontsize=13)
        if col<2:
            if col == 0:
                data = 'map_sm_' + gasf[row] + dire[col]
            else: 
                data = 'map_sm_' + gasf[row] + dire[col]
            pcm = ax.imshow(eval(data),  norm=mpl.colors.LogNorm(), cmap=cm[0], interpolation='none', extent=[-17.5,17.5,-17.5,17.5])
        else:
            if col == 2:
                data = 'map_dens_' + gasf[row] + dire[col]
            else: 
                data = 'map_dens_' + gasf[row] + dire[col]
            pcm2 = ax.imshow(eval(data), norm=mpl.colors.LogNorm(), cmap=cm[2], interpolation='none', extent=[-17.5,17.5,-17.5,17.5])
        if row ==4:
            if col == 0:
                ax.set_xlabel('z (kpc)',  fontsize=13)
            if col == 1:
                ax.set_xlabel('y (kpc)', fontsize=13)
            if col == 2:
                ax.set_xlabel('z (kpc)', fontsize=13)
            if col == 3:
                ax.set_xlabel('y (kpc)', fontsize=13)
        

cb1 = fig.colorbar(pcm, ax=axs[0, :2], location='top', pad=-1.2)
cb2 = fig.colorbar(pcm2, ax=axs[0, 2:4], location='top', pad=- 1.2)


cb1.mappable.set_clim(1E2,1E9)
cb2.mappable.set_clim(1E-5,1E0)

plt.show()

Tags: mapdataifpltcolaxrowset
1条回答
网友
1楼 · 发布于 2024-06-25 23:56:48
  1. 不要在颜色栏上设置颜色限制。把它们放在对数标准上

  2. 紧凑的布局无法满足您对色条的需求。请使用受约束的_布局(https://matplotlib.org/stable/tutorials/intermediate/constrainedlayout_guide.html)。虽然这可能不是您想要的,因为您有固定的纵横轴,所以不容易使两个方向都没有空间

  3. 通过ax=axs[:, :2]而不是ax=axs[0, :2]将所有行指定为拥有颜色栏。这有助于获得正确的间距

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

a = 5
b = 4
fig, axs = plt.subplots(a, b , figsize=(8.27, 9.69),
                        constrained_layout=True, sharey=True,
                        sharex=True)
cm = ['hot', 'viridis']

for col in range(b):
    for row in range(a):
        data = np.random.randn(30, 30)
        ax = axs[row, col]
        if col ==0:
            ax.set_ylabel('x (kpc)', fontsize=13)
        if col<2:
            pcm = ax.imshow(data,  norm=mpl.colors.LogNorm(vmin=0.1, vmax=100),
                            cmap=cm[0],interpolation='none',
                            extent=[-17.5,17.5,-17.5,17.5])
        else:
            pcm2 = ax.imshow(data, norm=mpl.colors.LogNorm(vmin=0.2, vmax=200),
                             cmap=cm[1], interpolation='none',
                             extent=[-17.5,17.5,-17.5,17.5])
        if row ==4:
            ax.set_xlabel('z (kpc)',  fontsize=13)


cb1 = fig.colorbar(pcm, ax=axs[:, :2], location='top', shrink=0.6)
cb2 = fig.colorbar(pcm2, ax=axs[:, 2:4], location='top', shrink=0.6)

plt.show()

您可能希望尝试axes_gridhttps://matplotlib.org/stable/tutorials/toolkits/axes_grid.html),尽管它也有局限性

enter image description here

相关问题 更多 >