【问题标题】:loop Freq plot with GGPLOT aes_string使用 GGPLOT aes_string 的循环频率图
【发布时间】:2016-12-21 15:27:49
【问题描述】:

我已经查看了与我的 ggplot 问题相关的关于堆栈溢出的上一个问题,但我无法找到明显有帮助的内容。

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

数据:

example.xlsx

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

代码:

#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)

输出:

a1.sum 的图 Example of plot output

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

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

#get variable names that end in .sum
n <- names(DAT[grep("*.sum",names(DAT))])

#loop through variable names
for (i in 1:length(n)){
  in_dat <- c(n[i])

   ...ggplot...

print(p[i]);

}

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    原始答案 - 使用 Facet Wrap

    这听起来像是在ggplot2 中使用facet_wrap 的机会。您可以首先使用tidyr gather 您的数据,以便从宽格式转换为窄格式。另外,我根据您的数据使用了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
    

    更新答案 - 创建单独的 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 现在是ggplot 对象中的list,您可以使用myplots[1]myplots[2]、...或再次使用lapply 访问。

    【讨论】:

    • 谢谢@Nick Criswell
    • 谢谢@Nick Criswell。当 x 轴 ID 仅限于一个小集合时效果很好。仍然希望为每个变量生成单独的图。您的代码只是在最后一行中缺少 p 。我喜欢这个选项。
    • @BEMR,我添加了另一个解决方案,其中每一列用于创建一个单独的 ggplot 对象,该对象存储在列表中。
    • 很棒的@Nick Criswell 不是我想采用的方法,但效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多