ggplot:生成具有多个系列的小平面网格图
ggplot: Generate facet grid plot with multiple series
我有以下数据框:
Quarter x y p q
1 2001 8.714392 8.714621 3.3648435 3.3140090
2 2002 8.671171 8.671064 0.9282508 0.9034387
3 2003 8.688478 8.697413 6.2295996 8.4379698
4 2004 8.685339 8.686349 3.7520135 3.5278024
我的目标是生成一个方面图,其中 x 和 y 列在一个图中的一个图中,p,q 一起在另一个图中而不是 4 个方面。
如果我执行以下操作:
x.df.melt <- melt(x.df[,c('Quarter','x','y','p','q')],id.vars=1)
ggplot(x.df.melt, aes(Quarter, value, col=variable, group=1)) + geom_line()+
facet_grid(variable~., scale='free_y') +
scale_color_discrete(breaks=c('x','y','p','q'))
我在 4 个不同方面的所有四个系列,但我如何将 x、y 合并为一个而 p、q 合并为另一个。最好没有图例。
一个想法是创建一个新的分组变量:
x.df.melt$var <- ifelse(x.df.melt$variable == "x" | x.df.melt$variable == "y", "A", "B")
您可以在使用 variable
分组的同时使用它进行分面:
ggplot(x.df.melt, aes(Quarter, value, col=variable, group=variable)) + geom_line()+
facet_grid(var~., scale='free_y') +
scale_color_discrete(breaks=c('x','y','p','q'), guide = F)
我认为 beetroot 上面的回答更优雅,但我正在处理同样的问题并以不同的方式到达同一个地方。我认为这很有趣,因为我使用 "double melt"(yum!)来排列 x,y/p,q 对。此外,它演示了 tidyr::gather
而不是 melt.
library(tidyr)
x.df<- data.frame(Year=2001:2004,
x=runif(4,8,9),y=runif(4,8,9),
p=runif(4,3,9),q=runif(4,3,9))
x.df.melt<-gather(x.df,"item","item_val",-Year,-p,-q) %>%
group_by(item,Year) %>%
gather("comparison","comp_val",-Year,-item,-item_val) %>%
filter((item=="x" & comparison=="p")|(item=="y" & comparison=="q"))
> x.df.melt
# A tibble: 8 x 5
# Groups: item, Year [8]
Year item item_val comparison comp_val
<int> <chr> <dbl> <chr> <dbl>
1 2001 x 8.400538 p 5.540549
2 2002 x 8.169680 p 5.750010
3 2003 x 8.065042 p 8.821890
4 2004 x 8.311194 p 7.714197
5 2001 y 8.449290 q 5.471225
6 2002 y 8.266304 q 7.014389
7 2003 y 8.146879 q 7.298253
8 2004 y 8.960238 q 5.342702
绘图声明见下文。
这种方法(以及甜菜根对 ifelse
的使用)的一个弱点是,如果要比较很多对,filter
语句很快就会变得笨拙。在我的用例中,我将共同基金的表现与许多基准指数进行了比较。每个基金都有不同的基准。我通过 table 元数据解决了这个问题,将基金代码与各自的基准配对,然后使用 left/right_join
。在这种情况下:
#create meta data
pair_data<-data.frame(item=c("x","y"),comparison=c("p","q"))
#create comparison name for each item name
x.df.melt2<-x.df %>% gather("item","item_val",-Year) %>%
left_join(pair_data)
#join comparison data alongside item data
x.df.melt2<-x.df.melt2 %>%
select(Year,item,item_val) %>%
rename(comparison=item,comp_val=item_val) %>%
right_join(x.df.melt2,by=c("Year","comparison")) %>%
na.omit() %>%
group_by(item,Year)
ggplot(x.df.melt2,aes(Year,item_val,color="item"))+geom_line()+
geom_line(aes(y=comp_val,color="comp"))+
guides(col = guide_legend(title = NULL))+
ylab("Value")+
facet_grid(~item)
由于不需要新的分组变量,我们保留参考名称 item
作为分面图的标签。
我有以下数据框:
Quarter x y p q
1 2001 8.714392 8.714621 3.3648435 3.3140090
2 2002 8.671171 8.671064 0.9282508 0.9034387
3 2003 8.688478 8.697413 6.2295996 8.4379698
4 2004 8.685339 8.686349 3.7520135 3.5278024
我的目标是生成一个方面图,其中 x 和 y 列在一个图中的一个图中,p,q 一起在另一个图中而不是 4 个方面。
如果我执行以下操作:
x.df.melt <- melt(x.df[,c('Quarter','x','y','p','q')],id.vars=1)
ggplot(x.df.melt, aes(Quarter, value, col=variable, group=1)) + geom_line()+
facet_grid(variable~., scale='free_y') +
scale_color_discrete(breaks=c('x','y','p','q'))
我在 4 个不同方面的所有四个系列,但我如何将 x、y 合并为一个而 p、q 合并为另一个。最好没有图例。
一个想法是创建一个新的分组变量:
x.df.melt$var <- ifelse(x.df.melt$variable == "x" | x.df.melt$variable == "y", "A", "B")
您可以在使用 variable
分组的同时使用它进行分面:
ggplot(x.df.melt, aes(Quarter, value, col=variable, group=variable)) + geom_line()+
facet_grid(var~., scale='free_y') +
scale_color_discrete(breaks=c('x','y','p','q'), guide = F)
我认为 beetroot 上面的回答更优雅,但我正在处理同样的问题并以不同的方式到达同一个地方。我认为这很有趣,因为我使用 "double melt"(yum!)来排列 x,y/p,q 对。此外,它演示了 tidyr::gather
而不是 melt.
library(tidyr)
x.df<- data.frame(Year=2001:2004,
x=runif(4,8,9),y=runif(4,8,9),
p=runif(4,3,9),q=runif(4,3,9))
x.df.melt<-gather(x.df,"item","item_val",-Year,-p,-q) %>%
group_by(item,Year) %>%
gather("comparison","comp_val",-Year,-item,-item_val) %>%
filter((item=="x" & comparison=="p")|(item=="y" & comparison=="q"))
> x.df.melt
# A tibble: 8 x 5
# Groups: item, Year [8]
Year item item_val comparison comp_val
<int> <chr> <dbl> <chr> <dbl>
1 2001 x 8.400538 p 5.540549
2 2002 x 8.169680 p 5.750010
3 2003 x 8.065042 p 8.821890
4 2004 x 8.311194 p 7.714197
5 2001 y 8.449290 q 5.471225
6 2002 y 8.266304 q 7.014389
7 2003 y 8.146879 q 7.298253
8 2004 y 8.960238 q 5.342702
绘图声明见下文。
这种方法(以及甜菜根对 ifelse
的使用)的一个弱点是,如果要比较很多对,filter
语句很快就会变得笨拙。在我的用例中,我将共同基金的表现与许多基准指数进行了比较。每个基金都有不同的基准。我通过 table 元数据解决了这个问题,将基金代码与各自的基准配对,然后使用 left/right_join
。在这种情况下:
#create meta data
pair_data<-data.frame(item=c("x","y"),comparison=c("p","q"))
#create comparison name for each item name
x.df.melt2<-x.df %>% gather("item","item_val",-Year) %>%
left_join(pair_data)
#join comparison data alongside item data
x.df.melt2<-x.df.melt2 %>%
select(Year,item,item_val) %>%
rename(comparison=item,comp_val=item_val) %>%
right_join(x.df.melt2,by=c("Year","comparison")) %>%
na.omit() %>%
group_by(item,Year)
ggplot(x.df.melt2,aes(Year,item_val,color="item"))+geom_line()+
geom_line(aes(y=comp_val,color="comp"))+
guides(col = guide_legend(title = NULL))+
ylab("Value")+
facet_grid(~item)
由于不需要新的分组变量,我们保留参考名称 item
作为分面图的标签。