我想用matplotlib子图绘制两幅GeoPandas图。这两张图有相同的图例,因此我只想有一个图例。然而,如果我在其中一张GeoPandas图上添加图例,那么该图就会变得略小。这是个问题,因为两张图的大小不同。
下面是我的代码。
fig,ax = plt.subplots(1, 2, figsize=(12,8))
sealand_grid.plot(column=sealand_grid['p_2012'],
ax=ax[0],
cmap='magma')
sealand_grid.plot(column=sealand_grid['p_2013'],
ax=ax[1],
cmap='magma',
legend=True,
legend_kwds={'shrink': 0.3})
ax[0].set_title('Housing prices 2012', fontsize=18)
ax[1].set_title('Housing prices 2013', fontsize=18)
fig.patch.set_facecolor('xkcd:white')
ax[0].axis('off')
ax[1].axis('off')
fig.tight_layout()
这里是我的代码: sealand_grid
是我的GeoPandas-dataframe,和 p_2012
和 p_2013
是绘制在两张地图上的变量。
如何让两张图大小一样,同时只有一个图例?
为了重现你的问题,我使用了这段代码,基本上显示了同样的结果:由于颜色条的原因,右边的图像比左边的略小。
import matplotlib.pyplot as plt
import numpy as np
D2012 = np.random.rand(10, 10)
D2013 = np.random.rand(10, 10)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize = (16,8))
P2012 = ax1.imshow(D2012,
cmap = 'magma')
P2013 = ax2.imshow(D2013,
cmap = 'magma')
ax1.set_title('2012', fontsize = 18)
ax2.set_title('2013', fontsize = 18)
ax1.axis('off')
ax2.axis('off')
plt.colorbar(P2013)
plt.show()
这就有了这个图。
我用这个方法解决了
import matplotlib.pyplot as plt
import numpy as np
D2012 = np.random.rand(10, 10)
D2013 = np.random.rand(10, 10)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize = (16,8))
ax3 = fig.add_axes([0.85, 0.1, 0.1, 0.8])
P2012 = ax1.imshow(D2012,
cmap = 'magma')
P2013 = ax2.imshow(D2013,
cmap = 'magma')
ax1.set_title('2012', fontsize = 18)
ax2.set_title('2013', fontsize = 18)
ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
plt.colorbar(P2013, ax = ax3)
plt.show()
就得到了这个图:
基本上,我增加了第三个轴,把它关掉,然后把颜色条加进去。你需要注意这第三个轴的位置与方法里面的参数。fig.add_axes([0.85, 0.1, 0.1, 0.8])
. 我知道这肯定不是最优雅的解决方案。
编辑
一个更稳健和优雅的解决方案是保留两个轴,但在定义它们时设置它们的大小和位置。
import matplotlib.pyplot as plt
import numpy as np
D2012 = np.random.rand(10, 10)
D2013 = np.random.rand(10, 10)
fig = plt.figure(figsize = (16,8))
ax1 = fig.add_axes([0, 0.2, 0.6, 0.6])
ax2 = fig.add_axes([0.4, 0.2, 0.6, 0.6])
P2012 = ax1.imshow(D2012,
cmap = 'magma')
P2013 = ax2.imshow(D2013,
cmap = 'magma')
ax1.set_title('2012', fontsize = 18)
ax2.set_title('2013', fontsize = 18)
ax1.axis('off')
ax2.axis('off')
plt.colorbar(P2013)
plt.show()
这样就有了这个图。
在这种情况下,你必须注意两个轴的位置和大小与这些线。
ax1 = fig.add_axes([0, 0.2, 0.6, 0.6])
ax2 = fig.add_axes([0.4, 0.2, 0.6, 0.6])
一种方法是创建一个专属的轴来绘制颜色条。所以为2个需要的图创建了3个轴。这里是可运行的代码和产生的图。
import numpy as np
import matplotlib.pyplot as plt
# create simple data for demo plot
data = np.arange(100, 0, -1).reshape(10, 10)
# figsize plays important role; must set it wide enough
# here 3 axes are created
# the width ratio of the 3rd axes must be small to get good result (here = .03)
fig, ax = plt.subplots(1, 3, figsize=(9.5, 4), gridspec_kw={"width_ratios":[0.4535, 0.4535, 0.03]})
# first 2 axes are used to plot images
im0 = ax[0].imshow(data, cmap='bone')
im1 = ax[1].imshow(data, cmap='bone')
# The third axes, ax[2] is exclusive to the color bar
# When cax id specified, 'shrink' and 'aspect' properties are ignored
cb = fig.colorbar(im0, cax=ax[2], orientation='vertical')
plt.show()
采用这种方法,色条可以放在3个轴中的任何一个轴上,但你必须相应地修改代码才能完成。