varias superponer modificar grafico graficas ggplot ejes dispersion barras r ggplot2 grid gridextra

superponer - Cómo trazar un diagrama de barras en el mapa ggplot2



varias graficas en r (1)

Esta pregunta ya tiene una respuesta aquí:

He encontrado respuestas similares a preguntas como esta, pero la mayoría usa paquetes como rworldmap , ggmap , ggsubplot o geom_subplot2d . Ver por ejemplo aquí o aquí .

Me gustaría saber cómo puedo trazar otros objetos ggplot, como un gráfico de barras en un mapa, que se crea a partir de un shapefile. El que estoy usando se puede descargar aquí .

EDITAR

Como @beetroot señaló correctamente, el nuevo archivo que se puede descargar bajo el enlace publicado anteriormente ha cambiado significativamente. Por lo tanto, se ajustan los nombres del shapefile, etc.

library(rgdal) library(ggplot2) library(rgeos) library(maptools) map.det<- readOGR(dsn="<path to your directory>/swissBOUNDARIES3D100216/swissBOUNDARIES3D/V200/SHAPEFILE_LV03", layer="VECTOR200_KANTONSGEBIET") map.kt <- map.det[map.det@data$KANTONSNUM=="CH01000000"|map.det@data$KANTONSNUM=="CH19000000",] #get centroids map.test.centroids <- gCentroid(map.kt, byid=T) map.test.centroids <- as.data.frame(map.test.centroids) map.test.centroids$KANTONSNR <- row.names(map.test.centroids) #create df for ggplot kt_geom <- fortify(map.kt, region="KANTONSNUM") #Plot map map.test <- ggplot(NULL)+ geom_polygon(data=kt_geom, aes(long, lat, group=group), fill="white")+ coord_fixed()+ geom_path(data=kt_geom, color="gray48", mapping=aes(long, lat, group=group), size=0.2)+ geom_point(data=map.test.centroids, aes(x=x, y=y), size=9, alpha=6/10) mapp

Esto da como resultado un mapa así. Hasta aquí todo bien.

Sin embargo, tengo dificultades para combinar dos trazados, como el map map.test y, por ejemplo, este:

geo_data <- data.frame(who=rep(c(1:2), each=2), value=as.numeric(sample(1:100, 4, replace=T)), KANTONSNR=rep(c(1,19), 2)) bar.testplot <- ggplot()+ geom_bar(data=geo_data, aes(factor(id),value,group=who),position=''dodge'',stat=''identity'')

Los diagramas de barras deben estar en el centro de los dos polígonos, es decir, donde están los dos puntos. Podría producir los gráficos de barras y trazarlos en el mapa por separado, si eso hace las cosas más fáciles.


He modificado un poco tu código para que el ejemplo sea más ilustrativo. Estoy tramando no solo 2 kantons, sino 47.

library(rgdal) library(ggplot2) library(rgeos) library(maptools) library(grid) library(gridExtra) map.det<- readOGR(dsn="c:/swissBOUNDARIES3D/V200/SHAPEFILE_LV03", layer="VECTOR200_KANTONSGEBIET") map.kt <- map.det[map.det$ICC=="CH" & (map.det$OBJECTID %in% c(1:73)),] # Merge polygons by ID map.test <- unionSpatialPolygons(map.kt, map.kt@data$OBJECTID) #get centroids map.test.centroids <- gCentroid(map.test, byid=T) map.test.centroids <- as.data.frame(map.test.centroids) map.test.centroids$OBJECTID <- row.names(map.test.centroids) #create df for ggplot kt_geom <- fortify(map.kt, region="OBJECTID") #Plot map map.test <- ggplot(kt_geom)+ geom_polygon(aes(long, lat, group=group), fill="white")+ coord_fixed()+ geom_path(color="gray48", mapping=aes(long, lat, group=group), size=0.2)+ geom_point(data=map.test.centroids, aes(x=x, y=y), size=2, alpha=6/10) map.test

Generemos datos para barras de representación.

set.seed(1) geo_data <- data.frame(who=rep(c(1:length(map.kt$OBJECTID)), each=2), value=as.numeric(sample(1:100, length(map.kt$OBJECTID)*2, replace=T)), id=rep(c(1:length(map.kt$OBJECTID)), 2))

Ahora haga 47 barras de barras que deberían trazarse en puntos centrales más adelante.

bar.testplot_list <- lapply(1:length(map.kt$OBJECTID), function(i) { gt_plot <- ggplotGrob( ggplot(geo_data[geo_data$id == i,])+ geom_bar(aes(factor(id),value,group=who), fill = rainbow(length(map.kt$OBJECTID))[i], position=''dodge'',stat=''identity'', color = "black") + labs(x = NULL, y = NULL) + theme(legend.position = "none", rect = element_blank(), line = element_blank(), text = element_blank()) ) panel_coords <- gt_plot$layout[gt_plot$layout$name == "panel",] gt_plot[panel_coords$t:panel_coords$b, panel_coords$l:panel_coords$r] })

Aquí convertimos ggplot s en gtable y luego las gtable para tener solo paneles de cada barra. Puede modificar este código para mantener escalas, agregar leyenda, título, etc.

Podemos agregar estas barras al mapa inicial con la ayuda de annotation_custom .

bar_annotation_list <- lapply(1:length(map.kt$OBJECTID), function(i) annotation_custom(bar.testplot_list[[i]], xmin = map.test.centroids$x[map.test.centroids$OBJECTID == as.character(map.kt$OBJECTID[i])] - 5e3, xmax = map.test.centroids$x[map.test.centroids$OBJECTID == as.character(map.kt$OBJECTID[i])] + 5e3, ymin = map.test.centroids$y[map.test.centroids$OBJECTID == as.character(map.kt$OBJECTID[i])] - 5e3, ymax = map.test.centroids$y[map.test.centroids$OBJECTID == as.character(map.kt$OBJECTID[i])] + 5e3) ) result_plot <- Reduce(`+`, bar_annotation_list, map.test)