为什么我的 Matplotlib 子图大小不同?

Why are my Matplotlib subplots sized differently?

你好!

我正在尝试在 Matplotlib 中创建一个由叶绿素图和条形图组成的图形。为了实现这一点,我将 Geopandas 库与 Pandas 和 Matplotlib 一起使用。我 运行 遇到了一个有趣的问题,我在互联网上找不到任何答案。问题是:

This link leads to an image that replicates the problem.

如上图所示,顶部的地图(由 Geopandas 生成)与底部的条形图的宽度不同。图中左右两边白的太多了space。我想摆脱这个 whitespace 并使地图水平适合分配给它的 space 。我还在下面为那些希望重新创建它的人留下了一个代码示例:

fig = plt.figure(figsize = (25.60,14.40)) #Here, i am setting the overall figure size

ax_1 = fig.add_subplot(2,1,1) #This will be the map

istanbul_districts.plot(ax = ax_1,
                    edgecolor = "black",
                    alpha = 1,
                    color = "Red") #Istanbul_districts is a GeoDataFrame object.


ax_2 = fig.add_subplot(2,1,2)


labels = list(health.loc[:,"district_eng"].value_counts().sort_values(ascending = False).index)


from numpy import arange
bar_positions = arange(len(labels)) + 1

bar_heights = h_inst_per_district_eng.loc[:,"health_count"].values.astype(int)


ax_2.bar(bar_positions,bar_heights,
    width = 0.7,
    align = "center",
    color = "blue") #This is a generic barplot from Matplotlib

我要留下第二张图片,显示上面代码片段的最终结果:

This link also leads to an image that replicates the problem.

从上面可以明显看出,两个子图的坐标轴的起点和终点并不在同一个位置。也许这可能是问题所在?如何使它们大小相同?

感谢所有提前花时间回答的人!

大家好!

swatchai 的评论让我走上了正确的轨道,我找到了罪魁祸首。只需将 figsize 调整为 (19,19) 之类的值即可解决问题。如果有人能准确解释为什么会发生这种情况,我仍然会很高兴。

下图是正方形(19,19)时的样子:

感谢您的努力!

添加解释,因为您找到了一个解决方案。

如果您按照您的方式指定带有两个轴的 matplotlib 图,您会将图分成两半。两个轴是相同的。假设图形的原始比例是 1:1,你的轴将是 1:2.

这个任意比率适用于条形图,它基本上可以缩放到任何比率。它是水平的还是垂直的并不重要(从绘图的角度来看,而不是数据可视化)。

但是,如果您希望地图显示正确的未扭曲形状,则不能只指定纵横比。那只是跟随数据。因此,如果您有一张地图,其边界框具有 1:1 比率,您不能指望它会填满整个 1:2 轴。 GeoPandas 更改纵横比以遵循地图的比例。

第一个例子留空隙而“解法”没有留空隙的原因就在于此。因为 leftover space 在轴的顶部和底部,所以它没有显示在解决方案中。因为它站在问题的一边,所以它只是停留在那里。如果您的地块彼此相邻而不是在上方,则反之亦然。

希望更清楚。