R 对于具有2个y轴的内部对象ggplot的循环?
我正在尝试使用ggplot在R中同时创建多个不同的绘图。每一个都代表我的数据集中的不同组(在group变量中命名)。这些群体多年来一直在测量他们的平均值和sd。我正在尝试创建图表,显示各个不同组的平均值和标准差在过去几年中是如何变化的 我的数据如下所示(这是一个缩写示例): 目前,我的代码生成了多个不可靠的图,除了顶部标记了不同的组之外,这些图看起来都像这样。我想我把所有的组组合在这些图中R 对于具有2个y轴的内部对象ggplot的循环?,r,ggplot2,R,Ggplot2,我正在尝试使用ggplot在R中同时创建多个不同的绘图。每一个都代表我的数据集中的不同组(在group变量中命名)。这些群体多年来一直在测量他们的平均值和sd。我正在尝试创建图表,显示各个不同组的平均值和标准差在过去几年中是如何变化的 我的数据如下所示(这是一个缩写示例): 目前,我的代码生成了多个不可靠的图,除了顶部标记了不同的组之外,这些图看起来都像这样。我想我把所有的组组合在这些图中 我想知道如何更改代码,使每个图形只对应一个组及其随时间变化的不同平均值和sd?我认为您需要告诉它不要一次提
我想知道如何更改代码,使每个图形只对应一个组及其随时间变化的不同平均值和sd?我认为您需要告诉它不要一次提取所有数据
dat
dat[dat$group==uniq_groups[i],]
将允许组基于i
一次成为一个唯一的组
uniq_groups = unique(dat$group)
for (i in 1:length(uniq_groups)) {
p= ggplot(dat=dat[dat$group==uniq_groups[i],], aes(x= as.numeric(year))) +
geom_line(aes(y= as.numeric(mean), color = "red")) +
geom_line(aes(y= as.numeric(sd), color = "blue")) +
ggtitle(uniq_groups[i])
ggsave(p, file=paste0("plot_", i,".png"), width = 14, height = 10, units = "cm")
}
您可以尝试这种方法,使用列表保存不同的组(
split()
),并使用绘图函数,然后使用mapply()
避免循环:
library(ggplot2)
library(tidyverse)
#Create list
List <- split(dat,dat$group)
#Plot
myfun <- function(x){
val <- unique(x$group)
#Format
x %>% select(year,mean,sd) %>%
mutate(mean=as.numeric(as.character(mean))) %>%
pivot_longer(-year) %>%
ggplot(aes(x= year,y=value,color=name,group=name)) +
geom_line() +
ggtitle(val)+
theme_bw()+
theme(axis.text = element_text(color='black',face='bold'),
axis.title = element_text(color='black',face='bold'),
legend.text = element_text(color='black',face='bold'),
legend.title = element_text(color='black',face='bold'),
plot.title = element_text(color='black',face='bold',hjust = 0.5)) -> G
return(G)
}
#Apply
Lplot <- lapply(List, myfun)
#Export
mapply(ggsave,Lplot,file=paste0("plot_", names(Lplot),".png"),
width = 14, height = 10, units = "cm")
库(ggplot2)
图书馆(tidyverse)
#创建列表
列表%
枢轴_更长(-year)%>%
ggplot(aes(x=年,y=值,颜色=名称,组=名称))+
geom_线()+
ggtitle(val)+
主题_bw()+
主题(axis.text=element_text(color='black',face='bold'),
axis.title=元素\文本(颜色为“黑色”,面为“粗体”),
legend.text=元素\文本(颜色为“黑色”,面为“粗体”),
legend.title=元素\文本(颜色为“黑色”,面为“粗体”),
plot.title=element_text(color='black',face='bold',hjust=0.5))->G
返回(G)
}
#申请
Lplot这里有一个整洁的解决方案,还有一些美观的清理
首先,您的as出现了一些大写问题。numeric
让我们来解决这些问题
dat$sd=as.numeric(dat$sd)
dat$平均值=数值形式(dat$平均值)
dat$year=数字形式(dat$year)
dat$group“data.frame”:11 obs。共有4个变量:
#>$组:系数w/3级“自由派”、“男性”…:1 1 3 2 2。。。
#>$year:num 1990 1991 1992 1994 1987。。。
#>$mean:num 50.250.45956.220.2。。。
#>$sd:num 20.31 20.44 23.55 22.56 1.23。。。
加载库
库(dplyr)
图书馆(GG2)
图书馆(purrr)
图书馆(stringr)
制作一个名为plot\u list
的绘图列表,并使用purrr::map
按组进行拆分,就像在其他解决方案中一样。清理传奇,打造美好的标题
绘图列表%
拆分(.$组)%>%
地图(~ggplot(数据=.x,aes(x=年))+
几何线(aes(y=平均值,color=“红色”),show.legend=假)+
几何图形线(aes(y=sd,color=“蓝色”),show.legend=FALSE)+
ggtitle(stringr::str_to_title(.$group)))
把它们全部打印出来
plot\u列表
#>美元自由派
现在,为了使用您喜欢的名称保存它们,我们将使用map2
并从列表本身获取名称
地图2(绘图列表,
名称(绘图列表),
~ggsave(plot=.x,
device=“png”,
filename=paste0(“plot_u,.y,.png”),
宽度=14,
高度=10,
单位(cm)
您的原始数据:
group@Kate很高兴这有帮助。请考虑将答案标记为“接受”,如果它解决了你的问题。我会查的!欢迎来到SO。接受答案有助于社区了解什么不再需要关注,什么仍然需要答案。见:
uniq_groups = unique(dat$group)
for (i in 1:length(uniq_groups)) {
p= ggplot(dat=dat[dat$group==uniq_groups[i],], aes(x= as.numeric(year))) +
geom_line(aes(y= as.numeric(mean), color = "red")) +
geom_line(aes(y= as.numeric(sd), color = "blue")) +
ggtitle(uniq_groups[i])
ggsave(p, file=paste0("plot_", i,".png"), width = 14, height = 10, units = "cm")
}
library(ggplot2)
library(tidyverse)
#Create list
List <- split(dat,dat$group)
#Plot
myfun <- function(x){
val <- unique(x$group)
#Format
x %>% select(year,mean,sd) %>%
mutate(mean=as.numeric(as.character(mean))) %>%
pivot_longer(-year) %>%
ggplot(aes(x= year,y=value,color=name,group=name)) +
geom_line() +
ggtitle(val)+
theme_bw()+
theme(axis.text = element_text(color='black',face='bold'),
axis.title = element_text(color='black',face='bold'),
legend.text = element_text(color='black',face='bold'),
legend.title = element_text(color='black',face='bold'),
plot.title = element_text(color='black',face='bold',hjust = 0.5)) -> G
return(G)
}
#Apply
Lplot <- lapply(List, myfun)
#Export
mapply(ggsave,Lplot,file=paste0("plot_", names(Lplot),".png"),
width = 14, height = 10, units = "cm")