我已经回顾了上一个关于堆栈溢出的问题,这个问题与我的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)
答案 0 :(得分:1)
这听起来像是在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
为了创建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))
}
该函数需要data
和column
个参数。在此分析中,仅使用第二列到最后一列来制作单独的图。所以我们按如下方式调用lapply
:
myplots <- lapply(colnames(DAT[2:ncol(DAT)]), make_plots, data = DAT)
myplots
现在是list
ggplot
个myplots[1]
个对象,您可以使用myplots[2]
,lapply
,...或{{1}再次访问这些对象}。