使用GGPLOT aes_string循环频率图

时间:2016-12-21 15:27:50

标签: r ggplot2

我已经回顾了上一个关于堆栈溢出的问题,这个问题与我的ggplot问题有关,但是我无法找到明显有用的东西。

问题:如何修改下面的代码,使用循环为数据框中的每个列(变量)生成单独的频率图(直方图)。即ID x每个变量?

数据:

example.xlsx

button

代码:

ID  a1.sum  b3.sum  c6.sum  d9.sum
April Showers   10  5   15  0
Anita Job   2   3   1   14
Candy Cain  4   7   14  17
Crystal Ball    6   8   16  12
Dot Matricks    15  9       1
Kay Largo   4   10  5   13

输出:

a1.sum的情节 Example of plot output

尝试创建一个循环,为变量b3,c6和d9生成相同的图。

我使用 aes_string 尝试了几种不同的方法。以下是我尝试设置循环的方法:

#set work DIR
setwd("C:/A")

library(rJava)
options(java.parameters = "-Xmx2048m")  ## memory set to 2 GB

library(xlsx)

#read in .xlsx file and apply encoding UTF-8 (French accents)
DAT <- read.xlsx("example.xlsx", 1, encoding="UTF-8")


#plot data
library(ggplot2)   

p <- ggplot(subset(DAT, a1.sum>1), aes(ID, a1.sum, y=a1.sum))    
p <- p + geom_bar(stat="identity", fill="blue", color="green")
p <- p + theme(plot.background = element_rect(fill = "white"),
           panel.background = element_rect(fill = "white"),        
           panel.grid.major = element_line(colour = "white",size=0.25),
           panel.grid.minor = element_blank())
p <- p + theme(axis.text.x=element_text(size=10,angle=90, hjust=1, face="plain", family="serif"))  
p <- p + theme(axis.text.y=element_text(size=10, hjust=1, face="plain", family="serif"))
p <- p + theme(axis.line.x = element_line(color="black", size = 0.50),
           axis.line.y = element_line(color="black", size = 0.5))
p
ggsave(filename="a1.png", plot=p)

1 个答案:

答案 0 :(得分:1)

原始答案 - 使用Facet Wrap

这听起来像是在facet_wrap中使用ggplot2的机会。您可以使用gather首先tidyr您的数据,以便从宽格式转变为窄格式。另外,我根据您的数据使用了read.table,并且一行缺少一个值,所以我用0填充了它。

DAT <- read.table(text = "ID  a1.sum  b3.sum  c6.sum  d9.sum
April_Showers   10  5   15  0
Anita_Job   2   3   1   14
Candy_Cain  4   7   14  17
Crystal_Ball    6   8   16  12
Dot_Matricks    15  9   0    1
Kay_Largo   4   10  5   13", 
                 header = TRUE, stringsAsFactors = FALSE)

    library(tidyr)
#gather data with
df2 <- gather(DAT, key, value, -ID)

这给了我们:

> df2
              ID    key value
1  April_Showers a1.sum    10
2      Anita_Job a1.sum     2
3     Candy_Cain a1.sum     4
4   Crystal_Ball a1.sum     6
5   Dot_Matricks a1.sum    15
6      Kay_Largo a1.sum     4
7  April_Showers b3.sum     5
8      Anita_Job b3.sum     3
9     Candy_Cain b3.sum     7
10  Crystal_Ball b3.sum     8
11  Dot_Matricks b3.sum     9
12     Kay_Largo b3.sum    10
13 April_Showers c6.sum    15
14     Anita_Job c6.sum     1
15    Candy_Cain c6.sum    14
16  Crystal_Ball c6.sum    16
17  Dot_Matricks c6.sum     0
18     Kay_Largo c6.sum     5
19 April_Showers d9.sum     0
20     Anita_Job d9.sum    14
21    Candy_Cain d9.sum    17
22  Crystal_Ball d9.sum    12
23  Dot_Matricks d9.sum     1
24     Kay_Largo d9.sum    13

然后我们制作与之前相同的图,但它将被key列拆分。我已经注意到我在下面做了哪些改动。

library(ggplot2)

p <- ggplot(df2, aes(x = ID, y=value))    ###Change made here
p <- p + geom_bar(stat="identity", fill="blue", color="green")
p <- p + theme(plot.background = element_rect(fill = "white"),
               panel.background = element_rect(fill = "white"),        
               panel.grid.major = element_line(colour = "white",size=0.25),
               panel.grid.minor = element_blank())
p <- p + theme(axis.text.x=element_text(size=10,angle=90, hjust=1, face="plain", family="serif"))  
p <- p + theme(axis.text.y=element_text(size=10, hjust=1, face="plain", family="serif"))
p <- p + theme(axis.line.x = element_line(color="black", size = 0.50),
               axis.line.y = element_line(color="black", size = 0.5)) +
  facet_wrap(~key) #facet added here

enter image description here

更新的答案 - 创建单独的ggplot对象

为了创建ggplot项目列表,我借用了这个question。您创建了一个函数,然后您可以将其传递给lapply来制作图表。

首先,制作功能:

make_plots = function(data, column){
  ggplot(data, aes_string(x = "ID", y=column)) +
  geom_bar(stat="identity", fill="blue", color="green") +
  theme(plot.background = element_rect(fill = "white"),
      panel.background = element_rect(fill = "white"),        
      panel.grid.major = element_line(colour = "white",size=0.25),
      panel.grid.minor = element_blank(),
      axis.text.x=element_text(size=10,angle=90, hjust=1, 
                               face="plain", family="serif"),
      axis.text.y=element_text(size=10, hjust=1, face="plain", family="serif"), 
      axis.line.x = element_line(color="black", size = 0.50), 
      axis.line.y = element_line(color="black", size = 0.5))
}

该函数需要datacolumn个参数。在此分析中,仅使用第二列到最后一列来制作单独的图。所以我们按如下方式调用lapply

myplots <- lapply(colnames(DAT[2:ncol(DAT)]), make_plots, data = DAT)

myplots现在是list ggplotmyplots[1]个对象,您可以使用myplots[2]lapply,...或{{1}再次访问这些对象}。