在带有子地块的geopandas地块中添加图例会更改地块大小

2024-10-03 09:13:14 发布

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

我想用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数据帧,p_2012p_2013是两张地图中绘制的变量

如何使两张地图大小相同,而只有一个图例?

the resulting plot looks like this


Tags: plottitle地图fig绘制columnaxgrid
2条回答

一种方法是创建用于打印颜色栏的专用轴。因此,为2个所需的绘图创建了3个轴。注意使用gridspec_kw和适当的width_ratios值来获得子批次所需的宽度。下面是可运行代码和结果图

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 = 0.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个轴中的任何一个轴上,但必须相应地更改代码才能完成

enter image description here

为了重现您的问题,我使用了这段代码,它基本上显示了相同的结果:由于颜色条的原因,右侧的图像略小于左侧的图像

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()

它给出了这个图:

enter image description here

我解决了这个问题:

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()

它给出了这个图:

enter image description here

基本上,我添加了第三个轴,将其关闭并添加到颜色栏。您需要注意第三个轴的位置以及方法中的参数: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()

它给出了这个图:

enter image description here

在这种情况下,您必须注意具有以下线的两个轴的位置和大小:

ax1 = fig.add_axes([0, 0.2, 0.6, 0.6])
ax2 = fig.add_axes([0.4, 0.2, 0.6, 0.6])

相关问题 更多 >