Подтвердить что ты не робот

Упорядочить грани ggplot в форме США

У меня есть ggplot с одной гранью для каждого штата США. Я хотел бы организовать эти грани в форме США с оборванной границей (упорядочен как вторая карта, но без Гавайских островов или Аляски).

Чтобы сделать это, я создал переменную фактора состояния, которая упорядочена по штату США, как показано слева направо на карте. Этот фактор также содержит "держатели пространства" для пустых граней, которые я хотел бы удалить. Я последовал совету этого сообщения (см. Раздел "Редактировать для предоставленного ответа" ), но names(g$grobs) имеет значение NULL, поэтому я не могу выполнить их ответ. Любые идеи, что я могу сделать?

Вот мой код:

library(ggplot2)
library(fivethirtyeight)
library(dplyr)
library(gridExtra)

data("police_deaths")
police_deaths_count <- police_deaths %>% arrange(state, -year) %>% group_by(state, year) %>% count()
police_deaths_count <- police_deaths_count %>% arrange(state, -year) %>% 
  filter(year %in% c(1970:2015) & !state %in% c("AK", "HI", "US", "GU", "MP", "PR", "RR", "TR", "VI"))

police_deaths_count$state.name <- state.name[match(police_deaths_count$state, state.abb)]
police_deaths_count$state.name[police_deaths_count$state == "DC"] <- "Washington DC"

police_deaths_count$state.reorder <- factor(police_deaths_count$state.name,
                                         levels = c("e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "e10", "Maine",
                                                    "e11", "e12", "e13", "e14", "e15", "e16", "e17", "e18", "e19", "Vermont", "New Hampshire",
                                                    "Washington", "Idaho", "Montana", "North Dakota", "Minnesota", "Illinois", "Wisconsin", "Michigan", "New York", "Massachusetts", "Rhode Island",
                                                    "Oregon", "Nevada", "Wyoming", "South Dakota", "Iowa", "Indiana", "Ohio", "Pennsylvania", "New Jersey", "Connecticut", "e20",
                                                    "California", "Utah", "Colorado", "Nebraska", "Missouri", "Kentucky", "West Virginia", "Virginia", "Maryland", "Washington DC", "e21",
                                                    "e22", "Arizona", "New Mexico", "Kansas", "Arkansas", "Tennessee", "North Carolina", "South Carolina", "Delaware", "e23", "e24",
                                                    "e25", "e26", "e27", "Oklahoma", "Louisiana", "Mississippi", "Alabama", "Georgia", "e28", "e29",
                                                    "e30", "e31", "e32", "e33", "Texas", "e34", "e35", "e36", "e37", "Florida"))

police_deaths_count2 <- police_deaths_count %>% filter(!(state=="NY" & year==2001))

plot1 <- ggplot(subset(police_deaths_count2, is.na(state.name)==F), #take away 9-11 peak to see trends without it
               aes(y = n, x = year)) +
  geom_line() + 
  facet_wrap( ~ state.reorder, ncol = 11, drop = F) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  ylab("Count of police deaths") +
  xlab("Year")

#the order of these facets is what I want. From here, I'd like to display the facets e1, e2, ..., e37 as completely blank by removing their facet strips and panels.
plot1

#A SO post (next line) provides a potential solution, but it doesn't work for me
#/info/296186/adding-empty-graphs-to-facetwrap-in-ggplot2 
g <- ggplotGrob(plot1)
names(g$grobs) #this is NULL so I can't implement the SO answer.
g$layout$name
4b9b3361

Ответ 1

Параметр hack-ish должен создавать уникальные метки пустой полосы для пустых граней, чтобы их можно было использовать в качестве заполнителей, но без создания видимых меток полосы. Вероятно, было бы лучше использовать государственные сокращения вместо полных имен, но я этого не делал. Вот пример:

library(ggplot2)
library(fivethirtyeight)
library(dplyr)
library(gridExtra)

data("police_deaths")
police_deaths_count <- police_deaths %>% arrange(state, -year) %>% group_by(state, year) %>% count()
police_deaths_count <- police_deaths_count %>% arrange(state, -year) %>% 
  filter(year %in% c(1970:2015) & !state %in% c("AK", "HI", "US", "GU", "MP", "PR", "RR", "TR", "VI"))

# Create unique blank strip labels for empty facets
bl = sapply(1:37, function(n) paste(rep(" ",n),collapse=""))

police_deaths_count$state.name <- state.name[match(police_deaths_count$state, state.abb)]
police_deaths_count$state.name[police_deaths_count$state == "DC"] <- "Washington DC"

police_deaths_count$state.reorder <- factor(police_deaths_count$state.name,
                                            levels = c(bl[1:10], "Maine",
                                                       bl[11:19], "Vermont", "New Hampshire",
                                                       "Washington", "Idaho", "Montana", "North Dakota", "Minnesota", "Illinois", "Wisconsin", "Michigan", "New York", "Massachusetts", "Rhode Island",
                                                       "Oregon", "Nevada", "Wyoming", "South Dakota", "Iowa", "Indiana", "Ohio", "Pennsylvania", "New Jersey", "Connecticut", bl[20],
                                                       "California", "Utah", "Colorado", "Nebraska", "Missouri", "Kentucky", "West Virginia", "Virginia", "Maryland", "Washington DC", bl[21],
                                                       bl[22], "Arizona", "New Mexico", "Kansas", "Arkansas", "Tennessee", "North Carolina", "South Carolina", "Delaware", bl[23:24],
                                                       bl[25:27], "Oklahoma", "Louisiana", "Mississippi", "Alabama", "Georgia", bl[28:29],
                                                       bl[30:33], "Texas", bl[34:37], "Florida"))


police_deaths_count2 <- police_deaths_count %>% filter(!(state=="NY" & year==2001))

plot1 <- ggplot(subset(police_deaths_count2, is.na(state.name)==F), #take away 9-11 peak to see trends without it
                aes(y = n, x = year)) +
  geom_line() + 
  facet_wrap( ~ state.reorder, ncol = 11, drop = F, strip.position="bottom") +
  theme_classic() +
  theme(axis.text.x = element_blank(),
        strip.background=element_blank(),
        axis.line=element_blank(),
        axis.ticks=element_blank()) +
  ylab("Count of police deaths") +
  xlab("Year (1970 - 2015)")

введите описание изображения здесь

Ответ 3

В пакете GGally есть функция, называемая глифами, которая может их сделать.