matplotlib ax to figure extent - 删除空白,边框,geopandas 地图绘图的所有内容
matplotlib ax to figure extent - remove whitespace, borders, everything for plot of geopandas map
我正在寻找一种使用 matplotlib 绘制无缝地图图像的解决方案。当前代码运行良好且稳定,但是,它在左侧和底部留下了一个空白。我想删除这个空格,但不知道如何。
我的示例代码:
import geopandas
from seaborn import despine
from pandas import read_csv
import matplotlib.pyplot as plt
# read data and shapefile
geo_path = 'shapefiles/ne_10m_admin_0_countries.shp'
df = read_csv('UNpopEstimates2100.csv')
world = geopandas.read_file(geo_path)
# specifiy what is to be plotted
cm = 'Greys'
world['2015'] = df['2015']
# set plot environment
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
world.plot(ax=ax, column='2015', cmap=cm, scheme='quantiles')
plt.savefig('sample.png', bbox_inches='tight', tight_layout=True, pad_inches=0, frameon=None)
sample.png
smaple.png with marked whitespace I would like to remove
我遵循了 Matplotlib's Tight Layout guide, machinelearningplus.com, Removing white padding from figure on Reddit 上的教程以及其他几个 Whosebug 帖子,即
,
Matplotlib: Getting subplots to fill figure,
Matplotlib plots: removing axis, legends and white spaces,
Removing white space around a saved image in matplotlib
和
matplotlib plot to fill figure only with data points, no borders, labels, axes,
我错过了什么?
编辑
- 提供具有非真实数据的可重现版本,但问题保持不变 - 我如何摆脱情节周围的空白?
我是 Geopandas 的新手,所以我不确定如何重新创建地理数据框,但是,它内置了数据集。
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['2015'] = np.random.uniform(low=1., high=100., size=(177,))
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
world.plot(ax=ax, column='2015', scheme='quantiles')
plt.savefig('sample.png')
首先使用不同的geopandas版本是有区别的。人们可能应该确保至少使用 geopandas 0.4 以使地图的纵横比正确。
下一个需要移除轴内部的填充。这可以使用 ax.margins(0)
命令来完成。
现在这将导致在一个方向上出现一些空白(在本例中为顶部和底部)。一种选择是将图形缩小到轴的范围。
import numpy as np
import matplotlib; print(matplotlib.__version__)
import matplotlib.pyplot as plt
import geopandas; print(geopandas.__version__)
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['2015'] = np.random.uniform(low=1., high=100., size=(177,))
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
world.plot(ax=ax, column='2015', scheme='quantiles')
ax.margins(0)
ax.apply_aspect()
bbox = ax.get_window_extent().inverse_transformed(fig.transFigure)
w,h = fig.get_size_inches()
fig.set_size_inches(w*bbox.width, h*bbox.height)
plt.savefig('sample.png')
plt.show()
这样做的好处是图形的物理尺寸确实适合坐标轴;所以无论是显示在屏幕上还是保存为图像,结果都是一样的。
如果相反,目的只是保存没有空格的图形,您可以使用 bbox_inches
参数 savefig
并提供以英寸为单位的轴的实际范围。
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
world.plot(ax=ax, column='2015', scheme='quantiles')
ax.margins(0)
ax.apply_aspect()
bbox = ax.get_window_extent().inverse_transformed(fig.dpi_scale_trans)
plt.savefig('sample.png', bbox_inches=bbox)
最后,可以使用 bbox_inches='tight'
自动执行上述操作。但是,要使 'tight'
选项正常工作,需要确保轴周围没有刻度和标签,否则会增加间距。
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
world.plot(ax=ax, column='2015', scheme='quantiles')
ax.margins(0)
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)
plt.savefig('sample.png', bbox_inches="tight", pad_inches=0)
在上述所有三种情况下,结果数字将为
我正在寻找一种使用 matplotlib 绘制无缝地图图像的解决方案。当前代码运行良好且稳定,但是,它在左侧和底部留下了一个空白。我想删除这个空格,但不知道如何。
我的示例代码:
import geopandas
from seaborn import despine
from pandas import read_csv
import matplotlib.pyplot as plt
# read data and shapefile
geo_path = 'shapefiles/ne_10m_admin_0_countries.shp'
df = read_csv('UNpopEstimates2100.csv')
world = geopandas.read_file(geo_path)
# specifiy what is to be plotted
cm = 'Greys'
world['2015'] = df['2015']
# set plot environment
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
world.plot(ax=ax, column='2015', cmap=cm, scheme='quantiles')
plt.savefig('sample.png', bbox_inches='tight', tight_layout=True, pad_inches=0, frameon=None)
sample.png
smaple.png with marked whitespace I would like to remove
我遵循了 Matplotlib's Tight Layout guide, machinelearningplus.com, Removing white padding from figure on Reddit 上的教程以及其他几个 Whosebug 帖子,即
Matplotlib: Getting subplots to fill figure,
Matplotlib plots: removing axis, legends and white spaces,
Removing white space around a saved image in matplotlib
和
matplotlib plot to fill figure only with data points, no borders, labels, axes,
我错过了什么?
编辑 - 提供具有非真实数据的可重现版本,但问题保持不变 - 我如何摆脱情节周围的空白?
我是 Geopandas 的新手,所以我不确定如何重新创建地理数据框,但是,它内置了数据集。
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['2015'] = np.random.uniform(low=1., high=100., size=(177,))
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
world.plot(ax=ax, column='2015', scheme='quantiles')
plt.savefig('sample.png')
首先使用不同的geopandas版本是有区别的。人们可能应该确保至少使用 geopandas 0.4 以使地图的纵横比正确。
下一个需要移除轴内部的填充。这可以使用 ax.margins(0)
命令来完成。
现在这将导致在一个方向上出现一些空白(在本例中为顶部和底部)。一种选择是将图形缩小到轴的范围。
import numpy as np
import matplotlib; print(matplotlib.__version__)
import matplotlib.pyplot as plt
import geopandas; print(geopandas.__version__)
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['2015'] = np.random.uniform(low=1., high=100., size=(177,))
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
world.plot(ax=ax, column='2015', scheme='quantiles')
ax.margins(0)
ax.apply_aspect()
bbox = ax.get_window_extent().inverse_transformed(fig.transFigure)
w,h = fig.get_size_inches()
fig.set_size_inches(w*bbox.width, h*bbox.height)
plt.savefig('sample.png')
plt.show()
这样做的好处是图形的物理尺寸确实适合坐标轴;所以无论是显示在屏幕上还是保存为图像,结果都是一样的。
如果相反,目的只是保存没有空格的图形,您可以使用 bbox_inches
参数 savefig
并提供以英寸为单位的轴的实际范围。
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
world.plot(ax=ax, column='2015', scheme='quantiles')
ax.margins(0)
ax.apply_aspect()
bbox = ax.get_window_extent().inverse_transformed(fig.dpi_scale_trans)
plt.savefig('sample.png', bbox_inches=bbox)
最后,可以使用 bbox_inches='tight'
自动执行上述操作。但是,要使 'tight'
选项正常工作,需要确保轴周围没有刻度和标签,否则会增加间距。
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
world.plot(ax=ax, column='2015', scheme='quantiles')
ax.margins(0)
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)
plt.savefig('sample.png', bbox_inches="tight", pad_inches=0)
在上述所有三种情况下,结果数字将为