我正在尝试在Matplotlib中创建一个由choroplethMap和条形图组成的图形。为了实现这一点,我使用了Geopandas库以及Pandas和Matplotlib。我遇到了一个有趣的问题,但我在网上找不到答案。问题来了:
正如上图所示,顶部的Map(由Geopandas生成)与底部的条形图宽度不同。图的左右空白太多。我想去掉这个空白,使Map水平地适合分配给它的空间。下面我还为那些希望重新创建它的人留下了一个代码示例:
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
我留下第二张图片,显示了上面代码片段的最终结果:
从上面可以清楚地看出,两个子图的轴不在相同位置上开始和结束。也许这就是问题所在?怎样才能使它们的大小相同呢?
2条答案
按热度按时间mnemlml81#
添加解释:
如果你指定matplotlib图形有两个轴,你会得到一个分成两半的图形。两个轴是相同的。假设图形的原始比例是1:1,则两个轴都是1:2。
这个任意的比率对于条形图来说是很好的,条形图可以缩放到基本上任何比率。它是水平的还是垂直的并不重要(从绘图的Angular 来看,而不是数据可视化)。
但是,如果希望Map显示正确的非扭曲形状,则不能仅指定纵横比。这只是遵循数据。因此,如果你有一个Map,其中边界框的比例为1:1,你不能期望它会填充整个1:2轴。GeoPandas更改长宽比以遵循Map的比例。
第一个例子留下了空白而“解决方案”没有的原因是这样的。由于 * 剩余 * 空间位于轴的顶部和底部,因此在解决方案中未显示。因为它是在问题的双方,它只是停留在那里。如果你有你的情节在对方旁边而不是在上面,它将是反之亦然。
w8rqjzmb2#
swatchai'scomment让我走上了正确的轨道,我找到了罪魁祸首。简单地将figsize调整为像(19,19)这样的值就可以解决这个问题。如果有人能解释为什么会发生这种情况,我还是很高兴的。
下面是当figsize是正方形(19,19)时的样子: