Geopandas и Mapplotlib, как мне построить без контура вокруг какой-либо формы?

Когда я запускаю приведенный ниже код в Jupyter Notebook, я получаю карту мира, окрашенную в красный цвет.

введите описание изображения здесь

Между странами есть тонкие белые полосы. Есть ли способ построить мир так, чтобы все страны были сплошными и между ними не было границ?

Я спрашиваю, потому что мой реальный вариант использования - это тонкая сетка, которая ведет себя так же, как карта мира: каждая форма сетки имеет четкий контур, который я не хочу иметь в сюжете. (Обновите, поскольку этот вопрос был задан: фигуры сетки не будут иметь одинаковый цвет заливки.

пример сетки)

import geopandas as gpd
import geoplot as gplt
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world['total'] = 1
world.plot(column='total', cmap='Set1')

В примере с сеткой файлы сетки находятся по адресу https://opendata-esri-de.opendata.arcgis.com/datasets/3c1f46241cbb4b669e18b002e4893711_0 Упрощенный пример, показывающий проблему.

sf = 'Hexagone_125_km/Hexagone_125_km.shp'
shp = gpd.read_file(sf)
shp.crs = {'init': 'epsg:4326'}
shp['sum'] = 1  # for example, fill sum with something
shp.plot(figsize=(20,20), column='sum', cmap='gnuplot', alpha=1, legend=True)

person 576i    schedule 19.04.2019    source источник
comment
Ваша конечная цель - иметь одинаковый цвет для всех полигонов (например, красный в вашем примере)? Или вы действительно хотите использовать цветовую карту для столбца с разными значениями (и таким образом получить разные цвета для разных многоугольников), но все же избавиться от тонких контуров?   -  person joris    schedule 19.04.2019
comment
Позже сетка будет иметь разные цвета для каждой записи сетки, поэтому цвета будут разными. Я просто не хочу никаких набросков.   -  person 576i    schedule 19.04.2019
comment
Ах, это сложнее. Для равномерного цвета вы можете убедиться, что присвоили краю тот же цвет, что и заливка многоугольника (по умолчанию цвет края не используется), но для переменного цвета с использованием ключевых слов column и cmap нет простого варианта указать для используйте один и тот же цвет для края и заливки (грани).   -  person joris    schedule 19.04.2019
comment
Поскольку по умолчанию цвет краев не используется, если вы установите linewidth=0.001, визуальный эффект должен быть почти эквивалентным без контуров.   -  person swatchai    schedule 19.04.2019
comment
Я добавил картинку, чтобы вы могли видеть сетку, увы, ширина линии = 0,001 по-прежнему дает видимую сетку.   -  person 576i    schedule 19.04.2019
comment
Одна из возможностей - добавить небольшой буфер вокруг каждого многоугольника в сетке, чтобы вместо касания они слегка перекрывались, и вы не видели этих линий сетки (но это скорее уловка чем реальное решение)   -  person joris    schedule 19.04.2019
comment
Это вопрос о краях стран или о каких-то ребрах шестнадцатеричного бина, которых нет в коде?   -  person ImportanceOfBeingErnest    schedule 19.04.2019
comment
Я назвал страны простым для тестирования примером линий, так как загрузка сетки - это слишком много, чтобы просить. Дополню описание ссылкой на файлы сетки   -  person 576i    schedule 19.04.2019


Ответы (1)


Белые линии связаны с антиалиасингом. Обычно это делает изображение более плавным, но приводит к появлению белых линий между разными формами. Вы можете отключить сглаживание через

antialiased=False

Это имеет неизбежный недостаток - сюжет выглядит неровным.

Альтернативный вариант - придать заплатам край с определенной шириной линии. Края, вероятно, должны быть того же цвета, что и грани, поэтому

edgecolor="face", linewidth=0.4

был бы вариант. Это удаляет белые линии, но вводит легкий «обжигающий» эффект (вы заметите, в основном, глядя на такие острова, как Индонезия или Япония). Это будет тем заметнее, чем меньше будут элементы, поэтому он может не иметь отношения к отображению графика в шестнадцатеричном формате. Тем не менее, если немного поиграть с шириной линии, результат можно улучшить.

введите описание изображения здесь

Код для воспроизведения:

import numpy as np; np.random.seed(42)
import geopandas as gpd
import matplotlib.pyplot as plt

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world['total'] = np.random.randint(0,10, size=len(world))

fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(7,10))

world.plot(column='total', cmap='Set1', ax=ax1)

world.plot(column='total', cmap='Set1', ax=ax2, antialiased=False)

world.plot(column='total', cmap='Set1', ax=ax3, edgecolor="face", linewidth=0.4)


ax1.set_title("original")
ax2.set_title("antialiased=False")
ax3.set_title("edgecolor='face', linewidth=0.4")
plt.tight_layout()
plt.savefig("world.png")
plt.show()
person ImportanceOfBeingErnest    schedule 20.04.2019
comment
Отличное решение, спасибо. antialiased=False отлично работал, потому что edgecolor='face' мне пришлось установить ширину линии равной 1.0, чтобы удалить линии сетки. - person 576i; 21.04.2019