Matplotlib Axe to figure экстент - убрать пробелы, границы, все для сюжета карты геопанд - PullRequest
0 голосов
/ 13 марта 2019

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

Я следовал Учебному пособию на Руководство по плотному расположению Matplotlib , machinelearningplus.com , Удаление белой подкладки с рисунка в Reddit , а также нескольких других сообщений стека переполнения, а именно

Диаграмма рассеяния Matplotlib - Удалите белую подкладку ,

Matplotlib: Получение подзаголовков для заполнения рисунка ,

Сюжеты Matplotlib: удаление осей, легенд и пробелов ,

Удаление пробелов вокруг сохраненного изображенияв matplotlib

и

график matplotlib для заполнения фигуры только точками данных, без границ, надписей, осей,

Что яотсутствует?


edit - чтобы предоставить воспроизводимую версию с нереальными данными, но задавать вопросыостается неизменным - как мне избавиться от пробелов вокруг моего участка?

Я новичок в 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')

1 Ответ

0 голосов
/ 14 марта 2019

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

Во всех трех вышеупомянутых случаяхрезультирующая цифра будет

enter image description here

...