R:使用ggplot2绘制组间差异的刻面网格图

R:使用ggplot2绘制组间差异的刻面网格图,r,plot,ggplot2,reshape,facet,R,Plot,Ggplot2,Reshape,Facet,我正在尝试创建一系列显示测量变量组之间差异的图,并正在使用R中的ggplot2的facet\u grid功能寻找一种有效的方法 以下是一个示例: # sample input data df <- data.frame(year=rep(c(2011:2015), 2), value=c(0:4, 1:5), scenario=rep(c("a","b"), each=5)) # make a sample plot

我正在尝试创建一系列显示测量变量组之间差异的图,并正在使用R中的
ggplot2
facet\u grid
功能寻找一种有效的方法

以下是一个示例:

# sample input data
df <- data.frame(year=rep(c(2011:2015), 2), 
                 value=c(0:4, 1:5),
                 scenario=rep(c("a","b"), each=5))

# make a sample plot
p <- 
  ggplot(df, aes(x=year, y=value)) +
  geom_point() + geom_line() +
  facet_grid(scenario ~ scenario)
#示例输入数据

df这里有一个选项,使用一些函数,从
tidyr
到首先
spread
数据,以允许计算对比度,然后
将其收集到一起以允许绘图:

forPlotting <-
  df %>%
  spread(scenario, value) %>%
  mutate(`a - b` = a - b
         , `b - a` = b - a
         , `a - a` = 0
         , `b - b` = 0) %>%
  gather(Comparison, Difference, -(year:b) ) %>%
  separate(Comparison, c("First Val", "Second Val"), " - ")
你可以这样画:

ggplot(forPlotting
       , aes(x = year, y = Difference)) +
  geom_point() + geom_line() +
  facet_grid(`First Val` ~ `Second Val`)

更大的问题是你为什么要这样做。我假设您已经知道,仅将两个集绘制为不同的颜色线更容易可视化:

ggplot(df, aes(x=year, y=value, col = scenario)) +
  geom_point() + geom_line()

所以,我假设您有更复杂的数据——具体来说,有更多的列要比较。因此,这里有一种方法可以自动化(并简化)多列的上述许多步骤。这种方法基本上是相同的,但它使用
mutate\uu
允许您传入一个向量,其中包含您试图创建的列

df <-
  data.frame(
    year = 2011:2015
    , a = 0:4
    , b = 1:5
    , c = 2:6
    , d = 3:7
  )

allContrasts <-
  outer(colnames(df)[-1]
        , colnames(df)[-1]
        , paste
        , sep = " - ") %>%
  as.character() %>%
  setNames(., .) %>%
  as.list()

forPlotting <-
  df %>%
  mutate_(.dots = allContrasts) %>%
  select(-(a:d)) %>%
  gather(Comparison, Difference, -year ) %>%
  separate(Comparison, c("First Val", "Second Val"), " - ") %>%
  filter(`First Val` != `Second Val`)

ggplot(forPlotting
       , aes(x = year, y = Difference)) +
  geom_point() + geom_line() +
  facet_grid(`First Val` ~ `Second Val`) +
  theme(axis.text.x = element_text(angle = 90))
df%
集合名(,)%>%
as.list()
forPlotting%
突变(点=所有对比度)%>%
选择(-(a:d))%>%
收集(比较,差异,-年)%>%
单独(比较,c(“第一个Val”,“第二个Val”),“-”%>%
过滤器(`First Val`!=`Second Val`)
ggplot(用于绘图)
,aes(x=年份,y=差异))+
几何点()+几何线()+
面网格(`First Val`~`Second Val`)+
主题(axis.text.x=元素\文本(角度=90))
给出了:

为什么我不能把这件事放在一边?我太喜欢玩标准评估了。如果您有非解析列名(例如,带有空格的东西),上述操作将失败。因此,下面是一个具有此类列名的示例,显示了添加反勾号以确保正确解析列

df <-
  data.frame(
    year = 2011:2015
    , value = c(0:4, 1:5, 2:6, 3:7)
    , scenario = rep(c("Unit 1", "Exam 2"
                       , "Homework", "Final Exam")
                     , each = 5)
  ) %>%
  spread(scenario, value)

allContrasts <-
  outer(paste0("`", colnames(df)[-1], "`")
        , paste0("`", colnames(df)[-1], "`")
        , paste
        , sep = " - ") %>%
  as.character() %>%
  setNames(., .) %>%
  as.list()

forPlotting <-
  df %>%
  mutate_(.dots = allContrasts) %>%
  select_(.dots = paste0("-`", colnames(df)[-1], "`")) %>%
  gather(Comparison, Difference, -year ) %>%
  separate(Comparison, c("First Val", "Second Val"), " - ") %>%
  filter(`First Val` != `Second Val`) %>%
  mutate_each(funs(gsub("`", "", .)), `First Val`, `Second Val`)

ggplot(forPlotting
       , aes(x = year, y = Difference)) +
  geom_point() + geom_line() +
  facet_grid(`First Val` ~ `Second Val`) +
  theme(axis.text.x = element_text(angle = 90))
df%
价差(情景、价值)
所有对比度%
as.character()%>%
集合名(,)%>%
as.list()
forPlotting%
突变(点=所有对比度)%>%
选择“(.dots=paste0(“-”),colnames(df)[-1],“`”)%>%
收集(比较,差异,-年)%>%
单独(比较,c(“第一个Val”,“第二个Val”),“-”%>%
筛选器(`First Val`!=`Second Val`)%>%
每个(funs(gsub(“`,”“,)),`First Val`,`Second Val`)都进行变异
ggplot(用于绘图)
,aes(x=年份,y=差异))+
几何点()+几何线()+
面网格(`First Val`~`Second Val`)+
主题(axis.text.x=元素\文本(角度=90))

您想要以下内容吗

dflist <- split(df, df$scenario)
df <- rbind(merge(dflist$a, dflist$a, by='year'),
      merge(dflist$a, dflist$b, by='year'),
      merge(dflist$b, dflist$a, by='year'),
      merge(dflist$b, dflist$b, by='year'))
df$value <- df$value.x - df$value.y
ggplot(df, aes(x=year, y=value)) +
  geom_point() + geom_line() +
  facet_grid(scenario.x ~ scenario.y)

dflist太棒了,谢谢你,马克-你是对的,我的理由是我的真实数据中有更多的列和行。自动解决方案看起来很棒,我将在真实的数据集上试用!很高兴这有帮助。我刚刚添加了一个编辑来解释可能导致问题的列名(例如空格或特殊字符)。
dflist <- split(df, df$scenario)
df <- rbind(merge(dflist$a, dflist$a, by='year'),
      merge(dflist$a, dflist$b, by='year'),
      merge(dflist$b, dflist$a, by='year'),
      merge(dflist$b, dflist$b, by='year'))
df$value <- df$value.x - df$value.y
ggplot(df, aes(x=year, y=value)) +
  geom_point() + geom_line() +
  facet_grid(scenario.x ~ scenario.y)