如何更改 facet_wrap 中面板的顺序和标签?

How can I change the order and label of a panel in facet_wrap?

伙计们-

我很不好意思为一些看起来应该很容易的事情征求意见,但我的挫败感超过了我的尴尬。如何在 facet_wrap 中更改单个面板的顺序、标签和线条颜色,同时对其他面板使用自动排序、标签和着色。具体来说,我想绘制 Freedonia 国家及其四个州(以 Freedonia 的开国元勋命名的 Chico、Groucho、Harpo 和 Zeppo)的“布朗克斯欢呼率”,但将“Freedonia”设为第一个面板图形并使其线条变黑。这是我的:

我的(公认的不雅)解决方案是

  1. 将“Freedonia”重新编码为“aaa”(因此它首先出现)。
  2. 使用 geom_line 语句将数据子集化为“aaa”并将线条颜色更改为黑色。
  3. 将面板的标签改回“Freedonia”。我很好,直到我进入第三步。

这是一些具有可重现(或可复制?)示例的代码:

library(dplyr)
library(ggplot2)
library(data.table)

#Simulate Data
set.seed(581)
state <- rep(c("Chico","Groucho","Harpo","Freedonia","Zeppo"), each=4)
x <- rep(1:4, times = 5)
y <- 100 + rnorm(20, 0, 5)*x + rnorm(20, 0, 20)
df <- cbind(state, x, y) %>% data.table() %>% 
  .[ , .(state, x = as.numeric(x), y = as.numeric(y))]

#Recode 
df <- df[ , state := recode(state, "Freedonia" = "aaa")]

#Generate Labels
labels <- unique(df$state[which(state != "Freedonia")])
labels <- c("Freedonia", labels)

#Grid Plot with Freedonia First
p <- ggplot(df, aes(x, y, color = state)) + 
  geom_line() +
  geom_line(data = subset(df, state == "aaa"), color = "black") + 
  ggtitle("Average Bronx Cheers by Quarter (1934)") + 
  theme_bw() +
  theme(legend.position = "none") + 
  theme(plot.title = element_text(hjust = 0.5)) + 
  xlab("Quarter") +
  ylab("Bronx Cheer Rate") +
  #facet_wrap(~ state)
  #facet_wrap(~ state, labeller = labeller(state = labels)) 
  facet_wrap(~ state, labeller = labeller(setNames(nm = labels)))
p

这是结果。

我意识到只有五个面板,手动执行此操作(例如,scale_fill_manual)是微不足道的,但您可能已经猜到我对 Freedonia 并不真正感兴趣,但是,相反,在一个有很多县的州——太多了,无法手动完成。我没有详尽地查看,而是彻底地查看了,没有看到任何解决这个确切问题的东西。

非常感谢你的帮助。

此致, 大卫

您可以将 state 的因子水平设置为 'Freedonia' 是第一水平,其余水平稍后出现。

library(ggplot2)

df$state <- factor(df$state, levels = c('Freedonia', 
                   setdiff(unique(df$state), 'Freedonia')))

ggplot(df, aes(x, y, color = state)) + 
  geom_line() +
  geom_line(data = subset(df, state == "Freedonia"), color = "black") + 
  ggtitle("Average Bronx Cheers by Quarter (1934)") + 
  theme_bw() +
  theme(legend.position = "none") + 
  theme(plot.title = element_text(hjust = 0.5)) + 
  xlab("Quarter") +
  ylab("Bronx Cheer Rate") +
  facet_wrap(~ state)