Во-первых, есть разница при использовании разных версий геопанд.Вероятно, следует убедиться, что вы используете геопанду 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)
Во всех трех вышеупомянутых случаяхрезультирующая цифра будет