5

这是对此问题的后续问题:R:在一个图中绘制多条线

在那里,我使用我的部分数据绘制了 1 个带有多条线的图形。现在我想在一个网格中绘制多个图表,因为我已经对数据进行了分组。现在我正在为每组数据创建数据框,然后为每个数据框创建一个图表并使用它们组合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

那么有没有办法一次处理这个并绘制 3 个图表(对于每个类别),并为每个公司的年度(2011 年和 2013 年)绘制线条?

4

2 回答 2

8

您绝对应该学习如何构建数据以及如何制作可重现的示例。处理这种非结构化格式的数据真的很困难。不仅为您,也为我们。

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"]]
于 2013-06-17T16:17:57.770 回答
0

至少对于 ggplot2,您需要使用reshape2包将数据转换为稍微不同的格式。

假设您有一个这样的 data.frame:

test <- structure(list(Company = structure(1:3, .Label = c("Company1", 
"Company2", "Company3"), class = "factor"), X2011.1 = c(300L, 
320L, 310L), X2013.1 = c(350L, 430L, 420L), X2011.2 = c(290, 
305, 400), X2013.2 = c(300, 301, 305), X2011.3 = c(295, 300, 
400), X2013.3 = c(290L, 400L, 410L)), .Names = c("Company", "X2011.1", 
"X2013.1", "X2011.2", "X2013.2", "X2011.3", "X2013.3"), class = "data.frame", row.names = c(NA, 
-3L))

现在忽略丑陋,看起来像:

  Company  X2011.1 X2013.1 X2011.2 X2013.2 X2011.3 X2013.3
  Company1     300     350     290     300     295     290
  Company2     320     430     305     301     300     400
  Company3     310     420     400     305     400     410

如果我们使用这个melt()函数,我们可以让它看起来像这样:

melt(test) -> test.melt

test.melt

Using Company as id variables
    Company variable value
1  Company1  X2011.1   300
2  Company2  X2011.1   320
3  Company3  X2011.1   310
4  Company1  X2013.1   350
5  Company2  X2013.1   430
6  Company3  X2013.1   420
7  Company1  X2011.2   290
8  Company2  X2011.2   305

然后使用公司或variable作为 ggplot2 的分组因素。显然你会想要更明智地命名这些。:)

例如你可以做

ggplot(melt(test)) + geom_bar(aes(x = Company, y = value, fill = variable), stat = "identity", position = "dodge")

或者其他的东西。

于 2013-06-17T15:52:37.087 回答