【问题标题】:How can I change the order and label of a panel in facet_wrap?如何更改 facet_wrap 中面板的顺序和标签?
【发布时间】:2020-09-19 06:16:30
【问题描述】:

乡亲-

我很尴尬地为看起来应该如此简单的事情征求建议,但我的挫败感超过了我的尴尬。如何在 facet_wrap 中更改单个面板的顺序、标签和线条颜色,同时对其他面板使用自动排序、标签和着色。具体来说,我想绘制 Freedonia 国家及其四个州(Chico、Groucho、Harpo 和 Zeppo,以 Freedonia 的开国元勋命名)中的每一个的“布朗克斯欢呼率”,但让“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 并不真正感兴趣,而是有很多县的州 - 太多无法手动完成。我看过的不是详尽,而是彻底,还没有看到任何可以解决这个确切问题的东西。

非常感谢您的帮助。

问候, 大卫

【问题讨论】:

    标签: r label panel facet-wrap


    【解决方案1】:

    您可以设置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)
    

    【讨论】:

    • 非常感谢,@Ronak Shah。关键似乎是指定因子水平并使用“setdiff”来指代不是“Freedonia”的所有内容。我在想,如果我订购数据集以便首先出现“Freedonia”,那么“facet_wrap”无论如何都会按字母顺序重新排列状态。但是明确因子水平似乎可以避免这种情况。此外,这里对我来说有一个宝贵的教训:我非常投入于弄清楚如何使“标签”论点起作用,以至于我忽略了一个更简单、更直观的解决方案。非常感谢,朋友! :)
    猜你喜欢
    • 2015-01-17
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多