Цветная картографическая карта стран по заданным значениям - PullRequest
0 голосов
/ 27 апреля 2020

Я говорю с теми, кто хорошо знает Картопи ... потому что я использую Картопи для создания карты, но я не очень хорошо знаю, как она работает.

Сначала я создал карту Европы ( в самом широком смысле, от Атлантов c до Урала), как показано на прилагаемом рисунке.

Затем у меня есть отдельный файл, скажем dft0, указывающий для каждой европейской страны время появление (Time0) определенного явления, подсчитанное в количестве дней относительно произвольной даты D и отсортированное от min до max; в качестве примера первых строк:

    Country     Time0
20  Italy    -16.063702
10  Denmark   -2.798684
39  Sweden    -2.711578
15  Germany    3.259436

Итак, так называемое явление появилось сначала в Италии, 16.1 days до моей даты D, затем в Дании 2.8 days до D, затем в Швеции 2.7 days до D, затем в Германии 3.3 days после D и др. c., Отправляясь в Беларусь, где он появился 52.1 days после D. 52.1.

В файле dft0 имеется 44 таких значения (от отрицательных до положительных), от -16.1 до 52.1.

У меня вопрос : зная, что я создал подходящую программу для рисования карты Европы, какой код мне нужно добавить в программу, чтобы раскрасить страны в соответствии с переменной Time0, например, от red (для Италия) до violet (для Беларуси), следуя цветам видимого спектра, в котором red = 800 nm и violet = 400 nm?

Точнее, если Time0 = x, я бы хотел закрасить соответствующий страна с цветом, соответствующим (приблизительно) y = -5.9 x + 705.6 nm.

Чтобы быть более понятным, я вставил график, показывающий, как рассчитать цвет ynm); это базовая c линейная интерполяция.

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

Спасибо за вашу заботу .

enter image description here enter image description here

Добавлено : использованная мной программа Cartopy :

import matplotlib.pyplot as plt
import cartopy
import cartopy.io.shapereader as shpreader

plt.figure(figsize=(4, 4))

central_lon, central_lat = 0, 45
extent = [-10, 45, 35, 70]

ax = plt.axes(projection=cartopy.crs.Orthographic(central_lon, central_lat))
ax.set_extent(extent)
ax.gridlines()
ax.add_feature(cartopy.feature.BORDERS, linestyle=':', alpha=1)
ax.add_feature(cartopy.feature.OCEAN,facecolor=("lightblue"))
ax.add_feature(cartopy.feature.LAND)
ax.coastlines(resolution='10m')

plt.show()

1 Ответ

0 голосов
/ 30 апреля 2020

Это решение основано на вашем опубликованном образце кода и др aws в значительной степени на этот ответ

import matplotlib.pyplot as plt
import matplotlib
import cartopy
from cartopy.io import shapereader
import cartopy.crs as ccrs
import geopandas
import numpy as np

# get natural earth data (http://www.naturalearthdata.com/)

# get country borders
resolution = '10m'
category = 'cultural'
name = 'admin_0_countries'
shpfilename = shapereader.natural_earth(resolution, category, name)

# read the shapefile using geopandas
df = geopandas.read_file(shpfilename)


# Set up the canvas
fig = plt.figure(figsize=(8, 8))
central_lon, central_lat = 0, 45
extent = [-10, 45, 35, 70]
ax = plt.axes(projection=cartopy.crs.Orthographic(central_lon, central_lat))
ax.set_extent(extent)
ax.gridlines()

# Add natural earth features and borders
ax.add_feature(cartopy.feature.BORDERS, linestyle=':', alpha=1)
ax.add_feature(cartopy.feature.OCEAN, facecolor=("lightblue"))
ax.add_feature(cartopy.feature.LAND)
ax.coastlines(resolution='10m')

# Insert your lists of countries and lag times here
countries = ['Germany', 'France', 'Italy', 'Spain', 'Ukraine']
lags = [-20,-5, 15, 0, 2]

# Normalise the lag times to between 0 and 1 to extract the colour
lags_norm = (lags-np.nanmin(lags))/(np.nanmax(lags) - np.nanmin(lags))

# Choose your colourmap here
cmap = matplotlib.cm.get_cmap('viridis')


for country, lag_norm in zip(countries, lags_norm):
    # read the borders of the country in this loop
    poly = df.loc[df['ADMIN'] == country]['geometry'].values[0]
    # get the color for this country
    rgba = cmap(lag_norm)
    # plot the country on a map
    ax.add_geometries(poly, crs=ccrs.PlateCarree(), facecolor=rgba, edgecolor='none', zorder=1)

# Add a scatter plot of the original data so the colorbar has the correct numbers. Hacky but it works
dummy_scat = ax.scatter(lags, lags, c=lags, cmap=cmap, zorder=0)
fig.colorbar(mappable=dummy_scat, label='Time lag of phenomenon', orientation='horizontal', shrink=0.8)

результат:

Карта Европы с Францией, Германией и Италией, окрашенными

Что касается окраски видимым спектром, я бы настоятельно отговорил вас от этого, если у вас нет очень веских причин для этого. Вместо этого я использовал одну из встроенных в Matplotlib перцепционно однородных цветовых карт . Есть много других цветовых карт, которые вы можете использовать, если viridis не соответствует вашим потребностям. Эти воспринимаемые однородные цветовые карты предпочтительнее, поскольку они не искажают ваши данные. Для получения дополнительной информации посетите эту страницу или , это более подробно обсуждается или найдите информацию о перцепционно однородных цветовых картах. Зрители вашей работы (особенно те, у кого проблемы с цветовым зрением) будут вам благодарны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...