R:使用ggplot2绘制组间差异的刻面网格图
我正在尝试创建一系列显示测量变量组之间差异的图,并正在使用R中的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
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)