传奇的麻烦
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()
不过,我想更正以下几点:
- 我希望第二个绘图与第一个绘图大小相同
- 左边的图例应该只出现一次
- 图例应与两个子图的 y 轴大小相同
任何人都可以帮助我满足这些要求吗?
这里是对您的代码的一些编辑,它可以满足您的需求(我认为)。
我没有调用 colormap 两次,而是将两个图中的色标限制设置为相同(使用 vmin
和 vmax
)。然后,为了使颜色条与图的高度相同,您需要在保存图形后获取其中一个子图的 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')
看看下面的情节:
我用以下代码生成了这个:
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()
不过,我想更正以下几点:
- 我希望第二个绘图与第一个绘图大小相同
- 左边的图例应该只出现一次
- 图例应与两个子图的 y 轴大小相同
任何人都可以帮助我满足这些要求吗?
这里是对您的代码的一些编辑,它可以满足您的需求(我认为)。
我没有调用 colormap 两次,而是将两个图中的色标限制设置为相同(使用 vmin
和 vmax
)。然后,为了使颜色条与图的高度相同,您需要在保存图形后获取其中一个子图的 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')