R 在ggplot2中保存每个修改的方面

R 在ggplot2中保存每个修改的方面,r,ggplot2,R,Ggplot2,我尝试使用将iris数据集中的每个数据保存到.png文件。但在此之前,我想修改刻面带厚度,因为我需要在我的真实数据绘制过程中这样做 然而,当我试图写每个方面时 下面的代码只是给了我这些物种的空白区域 这是我的尝试 library(ggplot2) plot_list = list() for (i in unique(iris$Species)) { p = ggplot(iris[iris$Species == i, ], aes(x=Sepal.Length, y=Sepal.Width

我尝试使用将iris数据集中的每个数据保存到.png文件。但在此之前,我想修改刻面带厚度,因为我需要在我的真实数据绘制过程中这样做

然而,当我试图写每个方面时 下面的代码只是给了我这些物种的空白区域

这是我的尝试

library(ggplot2)
plot_list = list()
for (i in unique(iris$Species)) {
  p = ggplot(iris[iris$Species == i, ], aes(x=Sepal.Length, y=Sepal.Width)) +
    geom_point(size=3, aes(colour=Species))+
    facet_wrap(~Species)

#this part to modify facet_wrap strips
  g1 = ggplotGrob(p)

  pos =  c(unique(subset(g1$layout, grepl("panel", g1$layout$name), select = t)))
  for(i in pos) g1$heights[i-1] = unit(0.4,"cm")

  grobs = which(grepl("strip", g1$layout$name))
  for(i in grobs) g1$grobs[[i]]$heights <-  unit(1, "npc") 

  grid.newpage()
  grid.draw(g1)
  plot_list[[i]] = g1
}

#finally write the modified graphs to file


for (i in 1:3) {
  file_name = paste("iris_plot_", i, ".png", sep="")
  tiff(file_name)
  print(plot_list[[i]])
  dev.off()
}
库(ggplot2)
plot_list=list()
(一种独特的(虹膜$物种)){
p=ggplot(鸢尾[iris$Species==i,],aes(x=萼片长度,y=萼片宽度))+
geom_点(尺寸=3,aes(颜色=物种))+
面_包装(~种)
#此零件用于修改镶嵌面_包裹带
g1=ggb(p)
pos=c(唯一(子集(g1$layout,grepl(“panel”,g1$layout$name),select=t)))
对于(位置中的i)g1$高度[i-1]=单位(0.4,“cm”)
grobs=哪个(grepl(“strip”,g1$layout$name))

对于(i in grobs)g1$grobs[[i]]$heights您不需要使用
ggplotGrob
修改条带高度。在ggplot的
主题()中设置相关参数将执行以下操作:

p1 = ggplot(iris[iris$Species == "setosa",],
            aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point() +
  facet_wrap(~Species)

p2 = p1 + theme(strip.text.x = element_text(margin = margin(t = 10, b = 10)))
# note: default margin for top & bottom is 5.5

gridExtra::grid.arrange(p1, p2, ncol = 2)

至于其余部分,您可能希望在第一个循环后检查
plot_list
的长度。您最初指定
i
接受
iris$Species
的唯一值,然后尝试将其用作绘图列表的索引。
plot_list
的前三个元素不包含绘图

以下内容在本例中适用。您可能需要针对实际用例进行一些修改:

plot_list = list()
loop.list <- unique(iris$Species)
for (i in seq_along(loop.list)) {
  p = ggplot(iris[iris$Species == loop.list[i], ], 
             aes(x = Sepal.Length, y=Sepal.Width)) +
    geom_point(size = 3, aes(colour = Species))+
    facet_wrap(~Species) +
    theme(strip.text.x = element_text(margin = margin(t = 11, b = 11)))

  plot_list[[i]] <- ggplotGrob(p)
}

for (i in 1:3) {
  file_name = paste("iris_plot_", i, ".png", sep="")
  tiff(file_name)
  grid.draw(plot_list[[i]])
  dev.off()
}
plot\u list=list()

loop.list您不需要使用
ggplotGrob
修改条带高度。在ggplot的
theme()
中设置相关参数可以:

p1 = ggplot(iris[iris$Species == "setosa",],
            aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point() +
  facet_wrap(~Species)

p2 = p1 + theme(strip.text.x = element_text(margin = margin(t = 10, b = 10)))
# note: default margin for top & bottom is 5.5

gridExtra::grid.arrange(p1, p2, ncol = 2)

至于其余部分,您可能希望在第一个循环后检查
plot_list
的长度。您最初指定
i
接受
iris$Species
的唯一值,然后尝试将其用作绘图列表的索引。
plot_list
的前三个元素不包含绘图

以下内容在本例中适用。您可能需要针对实际用例进行一些修改:

plot_list = list()
loop.list <- unique(iris$Species)
for (i in seq_along(loop.list)) {
  p = ggplot(iris[iris$Species == loop.list[i], ], 
             aes(x = Sepal.Length, y=Sepal.Width)) +
    geom_point(size = 3, aes(colour = Species))+
    facet_wrap(~Species) +
    theme(strip.text.x = element_text(margin = margin(t = 11, b = 11)))

  plot_list[[i]] <- ggplotGrob(p)
}

for (i in 1:3) {
  file_name = paste("iris_plot_", i, ".png", sep="")
  tiff(file_name)
  grid.draw(plot_list[[i]])
  dev.off()
}
plot\u list=list()

loop.list Hi。感谢您的评论和解决方案。事实上,我知道设置文本大小是一种解决方案,但不是我所经历的正确方法。因为当您有许多面,并且您将条带文本设置得非常小时,很难看到条带文本。掉头方法是像我的操作代码中那样细化条带。我在[here]@Alexander中问过,如果你想继续对grob对象进行更改,只需保持循环计数器笔直即可。一种方法(如上所示)是让
I
unique(iris$Species)中的每个值进行索引
而不是值本身,如果此循环中有更多循环,请使用不同的计数器,例如
j
。很抱歉。更改循环
ggplotGrob
的索引值时,您是对的。问题已解决。感谢您的建议和解决方案。您好。感谢您的评论和解决方案。实际上我知道设置g文本大小是一种解决方案,但不是我所经历的正确方法。因为当你有许多面,并且你使条带文本非常小时,很难看到条带文本。翻转方法是像我的操作代码中那样细化条带。我在[这里]中问到@Alexander如果您想继续对grob对象进行更改,只需保持循环计数器笔直即可。一种方法(如上所示)是让
i
unique(iris$Species)中的每个值进行索引
而不是值本身,如果此循环中有更多的循环,请使用不同的计数器,例如
j
。很抱歉。更改循环
ggplotGrob
的索引值时,问题已解决。感谢您的建议和解决方案。