假设我在两个实验中测量了一些值,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
value
个exp
个广告内容:
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.exp1
和level.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
无关,并带有虚假传说可能会给人一种我想要的印象:
必须有一个温和的解决方案 - 我无法找到一个dcast()
解决方案。
答案 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"
)
作品中有一个新功能,可让您创建标签并将值和标签一起旋转,但尚未推出 https://www.r-bloggers.com/pivoting-data-frames-just-got-easier-thanks-to-pivot_wide-and-pivot_long/