R 对于具有2个y轴的内部对象ggplot的循环?

R 对于具有2个y轴的内部对象ggplot的循环?,r,ggplot2,R,Ggplot2,我正在尝试使用ggplot在R中同时创建多个不同的绘图。每一个都代表我的数据集中的不同组(在group变量中命名)。这些群体多年来一直在测量他们的平均值和sd。我正在尝试创建图表,显示各个不同组的平均值和标准差在过去几年中是如何变化的 我的数据如下所示(这是一个缩写示例): 目前,我的代码生成了多个不可靠的图,除了顶部标记了不同的组之外,这些图看起来都像这样。我想我把所有的组组合在这些图中 我想知道如何更改代码,使每个图形只对应一个组及其随时间变化的不同平均值和sd?我认为您需要告诉它不要一次提

我正在尝试使用ggplot在R中同时创建多个不同的绘图。每一个都代表我的数据集中的不同组(在group变量中命名)。这些群体多年来一直在测量他们的平均值和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")