这是关于这一点的后续问题:R:在一个图中绘制多行
在那里,我使用了部分数据来绘制多行图形图.现在我想在一个网格中绘制多个图形,因为我已经对数据进行了分组.现在我这样做是为每组数据创建数据帧,然后为每个数据帧创建一个图表并将它们组合使用gridd.arrange()
但是,我想知道我是否可以将分组数据作为1个数据集处理,而不是创建所有这些单独的表?
我的数据结构如下:
Category1 Category2 Category3
Company 2011 2013 2011 2013 2011 2013
Company1 300 350 290 300 295 290
Company2 320 430 305 301 300 400
Company3 310 420 400 305 400 410
Run Code Online (Sandbox Code Playgroud)
那么有没有办法立即处理这个问题并绘制3个图表(每个类别)以及每个公司的年度(2011年和2013年)?
您一定要学习如何构建数据以及如何制作可重现的示例.以这种非结构化格式处理数据真的很难.不仅适合您,也适合我们.
mdf <- read.table( text="Company 2011 2013 2011 2013 2011 2013
Company1 300 350 290 300 295 290
Company2 320 430 305 301 300 400
Company3 310 420 400 305 400 410", header = TRUE, check.names=FALSE )
library("reshape2")
cat1 <- melt(mdf[c(1,2,3)], id.vars="Company", value.name="value", variable.name="Year")
cat1$Category <- "Category1"
cat2 <- melt(mdf[c(1,4,5)], id.vars="Company", value.name="value", variable.name="Year")
cat2$Category <- "Category2"
cat3 <- melt(mdf[c(1,6,7)], id.vars="Company", value.name="value", variable.name="Year")
cat3$Category <- "Category3"
mdf <- rbind(cat1, cat2, cat3)
head(mdf)
Company Year value Category
1 Company1 2011 300 Category1
2 Company2 2011 320 Category1
3 Company3 2011 310 Category1
4 Company1 2013 350 Category1
5 Company2 2013 430 Category1
6 Company3 2013 420 Category1
Run Code Online (Sandbox Code Playgroud)
如果类别数量非常大,这当然可以自动化:
library( "plyr" )
mdf <- adply( c(1:3), 1, function( cat ){
tmp <- melt(mdf[ c(1, cat*2, cat*2+1) ], id.vars="Company", value.name="value", variable.name="Year")
tmp$Category <- paste0("Category", cat)
return(tmp)
} )
Run Code Online (Sandbox Code Playgroud)
但是,如果你可以避免从一开始就反复推送所有这些数据,你应该这样做.
ggplot2如果它们可以是一个(或多个)变量的子集,则内置支持显示相同类型数据的分面图.见? facet_wrap或? facet_grid.
ggplot(data=mdf, aes(x=Year, y=value, group = Company, colour = Company)) +
geom_line() +
geom_point( size=4, shape=21, fill="white") +
facet_wrap( "Category" )
Run Code Online (Sandbox Code Playgroud)

或者,您可以data.frame按相应变量对您进行子集化,并将各个图存储在列表中:
librayr("plyr")
ll <- dlply( mdf, "Category", function(x){
ggplot(data=x, aes(x=Year, y=value, group = Company, colour = Company)) +
geom_line() +
geom_point( size=4, shape=21, fill="white")
})
ll[["Category1"]]
Run Code Online (Sandbox Code Playgroud)