传奇的麻烦

Trouble with the legend

看看下面的情节:

我用以下代码生成了这个:

        fig, axes = plt.subplots(1,2)
        axes[0].set_title("$K = " + str(K) + " , \sigma = " + str(sigma) + "$")
        heatmap1 = axes[0].imshow(X1, interpolation='none', cmap=plt.get_cmap("seismic"))
        fig.colorbar(heatmap1)
        axes[1].set_title(r"$K = " + str(K) + ", \sigma = " + str(sigma) + "$")
        heatmap2 = axes[1].imshow(X2, interpolation='none', cmap=plt.get_cmap("seismic"))
        fig.colorbar(heatmap2)

        plt.subplots_adjust(left=None, bottom=None, right=None, top=None,
                            wspace=0.4, hspace=.4)
        plt.show()

不过,我想更正以下几点:

  1. 我希望第二个绘图与第一个绘图大小相同
  2. 左边的图例应该只出现一次
  3. 图例应与两个子图的 y 轴大小相同

任何人都可以帮助我满足这些要求吗?

这里是对您的代码的一些编辑,它可以满足您的需求(我认为)。

我没有调用 colormap 两次,而是将两个图中的色标限制设置为相同(使用 vminvmax)。然后,为了使颜色条与图的高度相同,您需要在保存图形后获取其中一个子图的 y 位置,并使用它们为颜色条创建一个单独的轴(否则它们会窃取 space 来自并缩小你的一个子图)。

您可能需要尝试使用 subplots_adjust 中的值来使内容合适。

import matplotlib.pyplot as plt
import numpy as np

X1=np.random.rand(10,10)
X2=np.random.rand(10,10)
K,sigma=10,1.5

vmin = np.minimum(X1,X2).min()
vmax = np.maximum(X1,X2).max()

fig, axes = plt.subplots(1,2)

axes[0].set_title("$K = " + str(K) + " , \sigma = " + str(sigma) + "$")
heatmap1 = axes[0].imshow(X1, interpolation='none',  cmap=plt.get_cmap("seismic"),
                          vmin=vmin,vmax=vmax)


axes[1].set_title(r"$K = " + str(K) + ", \sigma = " + str(sigma) + "$")
heatmap2 = axes[1].imshow(X2, interpolation='none',   cmap=plt.get_cmap("seismic"),
                          vmin=vmin,vmax=vmax)

plt.subplots_adjust(left=None, bottom=None, right=0.8, top=None,
                    wspace=0.4, hspace=.4)

fig.savefig('test.png')
cpos = [axes[0].get_position().bounds[1],
        axes[0].get_position().bounds[3]]

cax = fig.add_axes([0.9,cpos[0],0.01,cpos[1]])

fig.colorbar(heatmap1,cax=cax)

fig.savefig('test.png')