使用group_by进行ggplot facetting

时间:2015-01-06 10:13:38

标签: r ggplot2 dplyr facet

假设我在两个实验中测量了一些值,R中的一个玩具示例是:

set.seed(9) 
df <- data.frame(
    exp=c(rep(1,10), rep(2,10)),
    value=runif(20,0,3))

然后我根据level分配分类变量value

require("dplyr") 
df <- df %>% mutate(level = ifelse(value<1, "low", ifelse(value>2, "high", "intermediate")))  

我可以为两个geom_point()群组显示ggplot2 valueexp个广告内容:

require("ggplot2")
ggplot(df, aes(x=factor(exp), y=value))+geom_point()

我的问题是: 如何使用facet_wrap()level分解显示,以便获得geom_point()的3x3图表,其中包含level的九个组合exp(例如&#34;高&#34;,&#34;中间&#34;&#34;低&#34;垂直为实验1,水平为实验2.换句话说,左上角图表是实验1和2中的value高#34;第一行第二列图是实验1中&#34;高&#34;&#34;&#34;中& #34;在实验2等)。我可以在ggplot2调用中以某种方式使用group_by(),还是必须让level.exp1level.exp2变量面对?

更新: 似乎我没有正确解释它,所以澄清我的需要:我想facet_wrap()而不是用不同的filter()条件重复这段代码9次(即level的所有9种组合在实验1和2)中:

df  %>% filter((exp==1 & level=="high") | (exp==2 & level=="high")) %>%
  ggplot(aes(x=factor(exp), y=value))+geom_point()

手工制作并与上述df无关,并带有虚假传说可能会给人一种我想要的印象:

enter image description here 必须有一个温和的解决方案 - 我无法找到一个dcast()解决方案。

1 个答案:

答案 0 :(得分:0)

看看这是否适合您。我认为关键是实验1和实验2之间应该有一些观测值共享的ID。

set.seed(9) 
df <- 
  data.frame(
    id = rep(1:100, 2),
    # adding exp_ bc this will be the column name in the next step
    exp = paste0("exp_", rep(1:2, each = 100)),
    value = runif(200, 0, 3)
  ) %>% 
  # this will pivot the data into a column for exp_1 and exp_2
  spread(exp, value) %>% 
  mutate(
    level_1 = case_when(exp_1 < 1 ~ "low", exp_1 > 2 ~ "high", TRUE ~ "intermediate"),
    level_2 = case_when(exp_2 < 1 ~ "low", exp_2 > 2 ~ "high", TRUE ~ "intermediate"),
    # reorder the high med low categories
    level_1 = fct_relevel(level_1, "high", "intermediate", "low"),
    level_2 = fct_relevel(level_2, "high", "intermediate", "low")
  )


# plot it
ggplot(df, aes(x = exp_1, y = exp_2)) + 
  geom_point() +
  facet_grid(level_1~level_2) +
  labs(
    x = "Experiment 1",
    y = "Experiment 2"
  )

enter image description here

作品中有一个新功能,可让您创建标签并将值和标签一起旋转,但尚未推出 https://www.r-bloggers.com/pivoting-data-frames-just-got-easier-thanks-to-pivot_wide-and-pivot_long/