Картограмма в R не искажает страны, как ожидалось - PullRequest
0 голосов
/ 22 февраля 2019

Я использую пакет cartogram в R для создания карты мира живых языков.Карта страны от Natural Earth , а язык отсчитывается от Ethnologue .

w <- readOGR('.','ne_110m_admin_0_map_units')
L <- read.csv('languages.csv',sep='\t')
w$rank <- 1:nrow(w)
wl <- merge(w@data,L,by.x='ISO_A3',by.y='iso3',all.x=T)
wl <- wl[order(wl$rank),]
wl[is.na(wl$Live),'Live'] <- 1
w@data <- wl
w2 <- cartogram_cont(w,'Live',prepare='none')
plot(w2)

Living languages cartogram

Данные, которые я использую, имеют 111 живых языков в России и 299 в Китае, почти в три раза.Однако созданная картограмма по-прежнему отображает Россию больше Китая.

Вот данные по каждой стране:

> w@data[order(w$NAME),c('NAME','Live')]
                        NAME Live
13               Afghanistan   41
15                   Albania    8
57                   Algeria   18
14                    Angola   45
19                Antarctica    1
17                 Argentina   24
18                   Armenia    8
21                 Australia  206
22                   Austria   14
23                Azerbaijan   18
30                   Bahamas    3
28                Bangladesh   41
32                   Belarus    4
25                   Belgium   11
33                    Belize    8
26                     Benin   55
37                    Bhutan   23
34                   Bolivia   43
31          Bosnia and Herz.    4
38                  Botswana   31
12              Bougainville    1
35                    Brazil  218
36                    Brunei   15
29                  Bulgaria   12
27              Burkina Faso   71
24                   Burundi    3
99                  Cambodia   27
45                  Cameroon  277
40                    Canada   96
39      Central African Rep.   72
161                     Chad  131
42                     Chile   11
43                     China  299
48                  Colombia   84
47                     Congo   62
49                Costa Rica   11
44             Côte d'Ivoire   85
82                   Croatia   15
50                      Cuba    3
51                    Cyprus    4
52                   Czechia   10
46           Dem. Rep. Congo  211
55                   Denmark    5
54                  Djibouti    5
56            Dominican Rep.    4
58                   Ecuador   24
59                     Egypt   15
152              El Salvador    5
2                    England    1
75                Eq. Guinea   14
60                   Eritrea   15
63                   Estonia    7
159                 eSwatini    5
64                  Ethiopia   88
67              Falkland Is.    1
66                      Fiji   10
65                   Finland   13
20    Fr. S. Antarctic Lands    1
68                    France   22
79             French Guiana   13
69                     Gabon   43
73                    Gambia   11
70                   Georgia   20
53                   Germany   25
71                     Ghana   81
76                    Greece   18
77                 Greenland    3
78                 Guatemala   27
72                    Guinea   36
74             Guinea-Bissau   23
80                    Guyana   16
83                     Haiti    4
81                  Honduras   10
84                   Hungary   17
90                   Iceland    2
86                     India  448
85                 Indonesia  707
88                      Iran   78
89                      Iraq   23
87                   Ireland    5
91                    Israel   34
92                     Italy   34
93                   Jamaica    4
95                     Japan   15
94                    Jordan   11
96                Kazakhstan   14
97                     Kenya   67
5                     Kosovo    1
101                   Kuwait    3
98                Kyrgyzstan    6
102                     Laos   83
110                   Latvia    7
103                  Lebanon    7
107                  Lesotho    5
104                  Liberia   31
105                    Libya    9
108                Lithuania   10
109               Luxembourg    4
115                Macedonia   10
113               Madagascar   14
122                   Malawi   17
123                 Malaysia  134
116                     Mali   68
121               Mauritania    7
114                   Mexico  287
112                  Moldova   10
119                 Mongolia   12
118               Montenegro    6
111                  Morocco   14
120               Mozambique   43
117                  Myanmar  118
4                  N. Cyprus    1
1                 N. Ireland    1
124                  Namibia   27
130                    Nepal  121
129              Netherlands   15
125            New Caledonia   38
131              New Zealand    4
128                Nicaragua   11
126                    Niger   23
127                  Nigeria  519
139              North Korea    1
6                     Norway    1
132                     Oman   17
133                 Pakistan   74
134                   Panama   15
7           Papua New Guinea    1
141                 Paraguay   23
135                     Peru   93
136              Philippines  183
137                   Poland   21
140                 Portugal    9
138              Puerto Rico    4
142                    Qatar    3
143                  Romania   23
144                   Russia  111
145                   Rwanda    3
154                 S. Sudan   69
146             Saudi Arabia    7
8                   Scotland    1
148                  Senegal   38
3                     Serbia    1
151             Sierra Leone   24
156                 Slovakia   11
157                 Slovenia    7
150              Solomon Is.   73
153                  Somalia   13
9                 Somaliland    1
181             South Africa   30
100              South Korea    3
62                     Spain   16
106                Sri Lanka    7
147                    Sudan   75
155                 Suriname   21
149             Svalbard Is.    1
158                   Sweden   15
41               Switzerland   12
160                    Syria   18
170                   Taiwan   22
164               Tajikistan   13
171                 Tanzania  125
163                 Thailand   71
166              Timor-Leste   20
162                     Togo   44
167      Trinidad and Tobago    7
168                  Tunisia    6
169                   Turkey   39
165             Turkmenistan    6
172                   Uganda   43
173                  Ukraine   22
16      United Arab Emirates   10
175 United States of America  219
174                  Uruguay    5
176               Uzbekistan   11
179                  Vanuatu  111
177                Venezuela   42
178                  Vietnam  109
61                 W. Sahara    3
10                     Wales    1
11                 West Bank    1
180                    Yemen   11
182                   Zambia   46
183                 Zimbabwe   22

Что я делаю не так?

РЕДАКТИРОВАТЬ

После ответа FuzzyLeapfrog я удалил Антарктиду ипреобразовал карту в проекцию Робинсона.

w <- w[-grep('Antarctica',w$NAME),]
w1 <- spTransform(w,CRS('+proj=robin'))
w2 <- cartogram_cont(w1,'Live')
tom <- 1 - w$Live/max(w$Live) # tonality
plot(w,col=rgb(tom,tom,tom))
plot(w1,col=rgb(tom,tom,tom))
plot(w2,col=rgb(tom,tom,tom))

Ниже приведены три карты: в проекции Меркатора, в проекции Робинсона и после деформации.Серый тон пропорционален количеству живых языков (чем темнее, тем больше число).

Mercator projection

Robinson projection

Robinson projection, deformed

Тебе не кажется, что Россия по-прежнему больше Китая, тогда как ее должно быть около 1/3?

EDIT2

Карта Natural Earth, представленная выше, представляет собой легкий шейп-файл (файл .shp имеет только 182 кБ).Используя более подробную карту (.shp с 6,5 МБ), я получил следующие карты (проекция Робинсона и деформация Робинсона).Россия все еще слишком велика!Интересно, влияет ли оригинальный размер страны на окончательную форму (я думал, что это не так, но теперь я думаю, что это влияет).Может быть вариант, чтобы исходный размер не влиял на конечный результат?

detailed Robinson projection

detailed Robinson deformed

EDIT3

Я попробовал две проекции равных площадей, Mollweide и Lambert Cylindrical.Ниже приведены результаты для Ламберта, теперь красного цвета, сначала спроецированная карта, затем спроецированная + деформированная карта.Чем больше красного, тем больше должна быть площадь.Но это не так (сравните Папуа-Новую Гвинею с Австралией).

Lambert Equal Area Projection

Lambert Equal Area Projection + cartogram deformation

Интересно, действительно ли функция cartogram_cont из пакета cartogram делает то, что, на мой взгляд, должна делать;на странице справки написано, что он следует «алгоритму искажения резинового листа (Dougenik et al. 1985)».

1 Ответ

0 голосов
/ 22 февраля 2019

Не только Россия и Китай не имеют надлежащих размеров, но и Антарктида.Похоже, вы используете проекцию Меркатора.Я бы предложил преобразовать данные карты мира и исключить Антарктику, например, как это было предложено в этом сообщении в блоге :

library(dplyr) # data manipulation
[...]
world_map = ne_countries(returnclass = "sf")
world_map = world_map %>% 
    select(sovereignt) %>% 
    filter(sovereignt != "Antarctica") %>% 
    st_transform(world_map, crs = "+proj=robin")
[...]

Что искажает размер контуров: а) проекция иб) вес (в вашем случае количество языков) вы добавляете.Влияние а) становится меньше, например, сужая область, на которую вы смотрите, или используя проекцию равной площади, как Mollweide.

...