Как исправить проблему с не отображаемыми легендами (для заполнения) при использовании geom_polygon и geom_text? - PullRequest
0 голосов
/ 10 ноября 2019

Я не могу добавить легенду, используя geom_polygon и geom_text (без geom_map) и оставляя ggplot() аргументы пустыми.

У меня есть шейп-файл, и я хочу построить его впакет ggplot2, использующий geom_polygon. Я определил переменную fill, чтобы окрасить некоторые провинции определенными цветами. Также я хочу добавить geom_text и немного текста к сюжету. Итак, у меня есть набор данных для geom_polygon и набор данных для geom_text, поэтому я не могу определить свой набор данных в ggplot(), и мне нужно оставить его без каких-либо определенных аргументов (опция legend = T доступна только в ggplot()). Даже если я добавлю legend = T, легенда не будет отображаться в полученном графике.

setwd("E:\\clustering")
library(readstata13)
library(maptools)
#> Warning: package 'maptools' was built under R version 3.5.3
#> Loading required package: sp
#> Checking rgeos availability: TRUE
library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 3.5.3
data=read.dta13("data_cluster_gbd.dta",nonint.factors = T)
province=readShapePoly("province_map_created.shp")
#> Warning: readShapePoly is deprecated; use rgdal::readOGR or sf::st_read
names(province)
#> [1] "province" "name_En"  "std_ID"   "Adj_ID"
map=fortify(province,region = "std_ID")
names(map)
#> [1] "long"  "lat"   "order" "hole"  "piece" "id"    "group"
names(data)[1]="std_ID"
map=merge(map,data, by.x="id",by.y="std_ID", all = T)
map$cl_MB=addNA(map$cl_MB)
map$select[map$id%in%c(5,9,11,21,23,24)]="Selected"
map$select[!map$id%in%c(5,9,11,21,23,24,30)]="Not selected"
map$select[map$id==30]="No data"
map$select=factor(map$select,levels = c("Selected","Not selected","No data"))
levels(map$select)
#> [1] "Selected"     "Not selected" "No data"
cord.dec = SpatialPoints(cbind(map$long, map$lat), proj4string = CRS("+proj=longlat"))
map$long <- spTransform(cord.dec, CRS("+init=epsg:32739"))@coords[,1]
map$lat <- spTransform(cord.dec, CRS("+init=epsg:32739"))@coords[,2]
head(map)
#>   id     long      lat order  hole piece group location     pm10 alafkosh
#> 1  0 442192.7 13936534     1 FALSE     1   0.1  Markazi 76.27017    34846
#> 2  0 442242.9 13936502     2 FALSE     1   0.1  Markazi 76.27017    34846
#> 3  0 442469.5 13936501     3 FALSE     1   0.1  Markazi 76.27017    34846
#> 4  0 442519.4 13936470     4 FALSE     1   0.1  Markazi 76.27017    34846
#> 5  0 442796.4 13936468     5 FALSE     1   0.1  Markazi 76.27017    34846
#> 6  0 442871.7 13936436     6 FALSE     1   0.1  Markazi 76.27017    34846
#>   gharchkosh hasharekosh cancer_all_ages_ir cancer_asir asthma_all_ages_mr
#> 1      34012       42975           171.4821    149.5961           11.09847
#> 2      34012       42975           171.4821    149.5961           11.09847
#> 3      34012       42975           171.4821    149.5961           11.09847
#> 4      34012       42975           171.4821    149.5961           11.09847
#> 5      34012       42975           171.4821    149.5961           11.09847
#> 6      34012       42975           171.4821    149.5961           11.09847
#>   asthma_asmr copd_all_ages_mr copd_asmr crd_all_ages_mr crd_asmr
#> 1    8.701504         16.21552  12.45099        31.42408 24.43511
#> 2    8.701504         16.21552  12.45099        31.42408 24.43511
#> 3    8.701504         16.21552  12.45099        31.42408 24.43511
#> 4    8.701504         16.21552  12.45099        31.42408 24.43511
#> 5    8.701504         16.21552  12.45099        31.42408 24.43511
#> 6    8.701504         16.21552  12.45099        31.42408 24.43511
#>   asthma_all_ages_ir asthma_asir copd_all_ages_ir copd_asir
#> 1           622.8062    723.4797          114.362  108.6879
#> 2           622.8062    723.4797          114.362  108.6879
#> 3           622.8062    723.4797          114.362  108.6879
#> 4           622.8062    723.4797          114.362  108.6879
#> 5           622.8062    723.4797          114.362  108.6879
#> 6           622.8062    723.4797          114.362  108.6879
#>   crd_all_ages_ir crd_asir wealth_index wealth_index_q cl_MB       select
#> 1        740.0908 834.9011    0.5602894              5     1 Not selected
#> 2        740.0908 834.9011    0.5602894              5     1 Not selected
#> 3        740.0908 834.9011    0.5602894              5     1 Not selected
#> 4        740.0908 834.9011    0.5602894              5     1 Not selected
#> 5        740.0908 834.9011    0.5602894              5     1 Not selected
#> 6        740.0908 834.9011    0.5602894              5     1 Not selected
centroid = aggregate(cbind(long, lat) ~ location, data = map, FUN = function(x) mean(range(x)))
centroid=merge(x = centroid, y = map[,c("location","cl_MB","group")], by = "location", all.x = T)
centroid=centroid[!duplicated(centroid),]
centroid=na.omit(centroid)
head(centroid)
#>               location      long      lat cl_MB group
#> 1               Alborz 482830.93 13977691  <NA>  30.1
#> 1599           Ardabil 245430.51 14254436     6  24.1
#> 4517  Azerbaijan, East 123307.52 14221990     2   3.1
#> 8252  Azerbaijan, West  37824.88 14208963     6   4.1
#> 20096          Bushehr 552982.75 13184877     5  18.1
#> 26747          Bushehr 552982.75 13184877     5  18.2
sample=c("forestgreen","grey","black")
ggplot(legend = T) +
  geom_polygon(data = map, mapping = aes(x = long, y = lat, group = group, fill = select), colour = "black",size = 10^(-100000000)) +
  geom_text(data = centroid, mapping = aes(x = long, y = lat, label = cl_MB), size = 2) +
  coord_fixed() + 
  xlab("") + ylab("") + 
  scale_fill_manual(map,name = "Clusters", values = sample, drop = F) +
  theme_bw() +
  theme(
    legend.position = "right",
    legend.title = element_blank(),
    plot.margin = unit(c(0,0,0,0),"cm"),
    plot.title = element_text(hjust = 0.5),
    axis.ticks = element_blank(),
    axis.title=element_blank(),
    axis.text = element_blank(),
    strip.background = element_rect(fill = "white"),
    plot.background = element_blank(),
    panel.grid = element_blank(),
    panel.border = element_blank()
  )

После запуска этого кода легенда для переменной fill (select) все равно не будет отображаться! Я также попытался добавить аргумент Show.legend = T к geom_polygon, и это не сработало. введите описание изображения здесь

...