注意:过去的问题已删除,我决定将我要解决的整个问题都放在上面,因为答案使我提出的问题无法解决。
所以,我有这个数据框:
> head(dfz)
X Y Question Category
1 1.00 0.32 Q1 FIN
5 0.27 0.61 Q2 IKA
6 0.13 0.39 Q3 OKS
7 0.25 0.60 Q4 RES
9 0.09 0.57 Q5 RES
12 0.04 0.39 Q6 IKA
我需要为每个类别(它们有30个唯一的类别,但您可以在上面看到其中的4个类别)使用ggplot,并使用它们的X
和Y
值以及Question
作为标签。
ggplot代码(简体):
ggplot(FIN, aes(x=X, y=Y)) +
geom_point(colour="red",size=3) +
geom_text_repel(label=df$Question, family="sans", fontface="bold", size=4) +
scale_x_continuous(labels = scales::percent_format(accuracy = 1)) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), position = "right")
每个图必须保存在一个特定的文件夹中。在此文件夹中,我们将在不同的.png
文件中找到这30个图(准确地说是30 .png
个文件)。每个文件的名称必须是其类别值(对于类别FIN
,文件应为"C:/ME/Plots/FIN.png"
,对于IKA
应为"C:/ME/Plots/IKA.png"
,依此类推)。
预期输出是这样:
[1] "C:/ME/Plots/FIN.png " # Plot of FIN category
[1] "C:/ME/Plots/PLE.png " # Plot of IKA category
[1] "C:/ME/Plots/OKS.png " # Plot of OKS category
[1] "C:/ME/Plots/INX.png " # Plot of RES category
[1] "C:/ME/Plots/MES.png " # Plot of PLZ category
因此,我决定采用下一种方法: (1)创建30个数据框,(2)创建这30个数据框的列表,(3)遍历该数据框列表,(4)绘制每个循环,(5)将每个循环的图保存在特定文件夹中。但是,每次循环工作时,我都在努力调用数据帧的“名称”(在过去的问题中解决了这一问题,但不是整个问题都解决了,因此我们决定删除它并提出一个新问题)
可能是一个更简单的方法(但是我不知道如何实现它):
(1)告诉ggplot()为每个类别打印一个图,然后(2)将ggsave()
保存在特定文件夹中,并将类别名称作为.png
文件的名称。
PS:根据需要将图保存为ggsave()
,以具有特定大小。
答案 0 :(得分:1)
考虑by
遍历 Category 的唯一值,并使用ggsave
将每个子集数据图保存到磁盘:
by(dfz, dfz$Category, function(sub) {
g <- ggplot(sub, aes(x=X, y=Y)) +
geom_point(colour="red",size=3) +
geom_text_repel(label=sub$Question, family="sans", fontface="bold", size=4) +
scale_x_continuous(labels = scales::percent_format(accuracy = 1)) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), position = "right")
fn <- paste0("C:/ME/Plots/", sub$Category[1], ".png")
ggsave(file=fn, plot=g, device = "png")
})
答案 1 :(得分:0)
这里是一种可能性:
library(tidyverse)
library(ggrepel)
library(scales)
# create directory where to save plots
dirpath <- file.path("C:", "ME", "plots")
if (!dir.exists(dirpath)) {
dir.create(dirpath, showWarnings = F, recursive = T)
}
# define plotting function
fff <- function(d, dirpath) {
#plot
p <-
ggplot(d, aes(x=X, y=Y)) +
geom_point(colour="red",size=3) +
geom_text_repel(aes(label=Question),
family="sans",
fontface="bold",
size=4) +
scale_x_continuous(labels = percent_format(accuracy = 1)) +
scale_y_continuous(labels = percent_format(accuracy = 1),
position = "right")
#save
fn <- paste0(as.character(d$Category[1]), ".png")
fp <- file.path(dirpath, fn)
ggsave(filename = fp, plot = p)
}
# split data to list by Category
dfz_sp <- split(dfz, dfz$Category)
# save the plots
dfz_sp %>%
walk(fff, dirpath)