根据geom_map或ggplot2中的意外事件(2x2)创建一个独特的图例?

时间:2017-09-05 21:05:53

标签: r ggplot2 rstudio gis tidyverse

如何根据此列联表执行此操作?我不完全确定如何根据我制作的指标表(犯罪)在R中创建自定义图例。

What I want to do

R中的可重现代码:

       require(maps)

  set.seed(123)
  # randomly assign 2 variables to each state
  mappingData <- data.frame(state = tolower(rownames(USArrests)), 
                       iceCream = (sample(c("Likes Ice Cream","Doesn't Like Ice Cream"),50, replace=T)),
                       hotDogs = (sample(c("Likes Hot Dogs","Doesn't Like Hot Dogs"),50, replace=T)))

  # create a 'legend' key for an indicator variable
  mappingDataDF<-data.frame(
    expand.grid(iceCream=c("Likes Ice Cream","Doesn't Like Ice Cream"),
                        hotDogs=c("Likes Hot Dogs","Doesn't Like Hot Dogs")),
                        indicator=c("0","1","2","3")) 

  mappingData<-mappingData %>% inner_join(mappingDataDF)

  mappingDatam <- reshape2::melt(mappingData, id = 1)

  states_map <- map_data("state")

  ggplot(mappingData, aes(map_id = state)) +
    geom_map(aes(fill = indicator), map = states_map) +
    expand_limits(x = states_map$long, y = states_map$lat)

2 个答案:

答案 0 :(得分:5)

我修改了一些数据设置以简化示例。

library(maps)
library(dplyr)
library(ggplot2)

set.seed(123)
# randomly assign 2 variables to each state
mappingData <- data.frame(state = tolower(rownames(USArrests)), 
                          iceCream = (sample(c("No", "Yes"), 50, replace=T)),
                          hotDogs = (sample(c("No", "Yes"), 50, replace=T))) %>% 
  mutate(indicator = interaction(iceCream, hotDogs, sep = ":"))

mappingData
            state iceCream hotDogs indicator
1         alabama       No      No     No:No
2          alaska      Yes      No    Yes:No
3         arizona       No     Yes    No:Yes
4        arkansas      Yes      No    Yes:No
...
states_map <- map_data("state")

从数据

生成独立的图例
legend_ic.hd <- ggplot(mappingData, aes(iceCream, hotDogs, fill = indicator)) +
  geom_tile(show.legend = F) + 
  scale_x_discrete("Ice cream?", expand = c(0,0)) +
  scale_y_discrete("Hot dogs?", expand = c(0,0)) + 
  theme_minimal() +
  theme(axis.text.y = element_text(angle = 90, hjust = 0.5)) +
  coord_equal()

legend_ic.hd

enter image description here

然后将其用作原始地图中的自定义注释

ggplot(mappingData, aes(map_id = state)) +
  geom_map(aes(fill = indicator), map = states_map, show.legend = F) +
  expand_limits(x = states_map$long, y = states_map$lat) +
  coord_quickmap() +
  annotation_custom(grob = ggplotGrob(legend_ic.hd), 
                    xmin = -79, xmax = Inf,
                    ymin = -Inf, ymax = 33)

enter image description here

您必须手动调整注释的位置,或者:

使用gridExtra(或cowplot):

plot_ic.hd <- ggplot(mappingData, aes(map_id = state)) +
  geom_map(aes(fill = indicator), map = states_map, show.legend = F) +
  expand_limits(x = states_map$long, y = states_map$lat) +
  coord_quickmap()

gridExtra::grid.arrange(grobs = list(plot_ic.hd, legend_ic.hd), 
                        ncol = 2, widths = c(1,0.33))

enter image description here

答案 1 :(得分:2)

一种方法是创建自定义图例的PNG文件,然后使用annotation_raster将其添加到图中:

library(png)
legend <- readPNG("full/path/to/legend.png")

ggplot(mappingData, aes(map_id = state)) +
  geom_map(aes(fill = indicator), map = states_map) +
  expand_limits(x = states_map$long, y = states_map$lat) +
  guides(fill = FALSE) + 
  annotation_raster(legend,
                    xmin = -75, 
                    xmax = -65, 
                    ymin = 25, 
                    ymax = 30,
                    interpolate = TRUE)

enter image description here