R:处理和绘制分组数据

Chr*_*rge 4 r ggplot2

这是关于这一点的后续问题: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年)?

Bea*_*eld 5

您一定要学习如何构建数据以及如何制作可重现的示例.以这种非结构化格式处理数据真的很难.不仅适合您,也适合我们.

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)

但是,如果你可以避免从一开始就反复推送所有这些数据,你应该这样做.

使用facet

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)