您绝对应该学习如何构建数据以及如何制作可重现的示例。处理这种非结构化格式的数据真的很困难。不仅为您,也为我们。
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
如果类别的数量非常多,这当然可以自动化:
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)
} )
但是,如果您可以避免从一开始就来回推送所有这些数据,那么您应该这样做。
使用构面
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" )
获取单个地块
或者,您可以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"]]