Ggplot 不显示源函数中的图
Ggplot does not show plots in sourced function
我一直在尝试在 RStudio 中使用 R 的 ggplot 库绘制两个图。问题是,当我在一个函数中绘制两个时,只有最后一个显示(在 RStudio 的 "plots" 视图中)而第一个消失。更糟糕的是,当我 运行 ggsave()
在每个绘图之后 - 将它们保存到一个文件 - 它们都不会出现(但文件按预期保存)。但是,我想像以前一样查看我在绘图中保存的内容。
有没有一种方法既可以显示我将在 RStudio 的 plots 视图中绘制的内容,又可以保存它们?另外,在不保存地块的情况下,为什么多块地块会出现显示问题? (即为什么显示最后一个而不显示之前的?)
绘图部分的代码如下。我删除了一些部分,因为它们似乎没有必要(但如果确实相关,可以添加)。
HHIplot = ggplot(pergame)
# some ggplot geoms and misc. here
ggsave(paste("HHI Index of all games,",year,"Finals.png"),
path = plotpath, width = 6, height = 4)
HHIAvePlot = ggplot(AveHHI, aes(x = AveHHI$n_brokers))
# some ggplot geoms and misc. here
ggsave(paste("Average HHI Index of all games,",year,"Finals.png"),
path = plotpath, width = 6, height = 4)
我已经看过 here and here 但都没有帮助。在 ggsave()
行后添加 print(HHIplot)
或 print(HHIAvePlot)
未显示该图。
非常感谢。
更新 1:下面建议的解决方案无效,尽管它适用于答案的示例代码。我将 ggplot 对象传递给 .Globalenv
并且 print()
在绘图区域上给我一个空的灰色框(我想这是一个没有图层的空 ggplot 对象)。我认为问题可能出在我使用的某些图层或操纵器上,因此我在下面提供了一个 ggplot 对象的完整代码。有什么想法吗? (注意:我已经尝试将 assign()
行放在与 ggsave()
和 ggplot()
相关的所有可能位置。)
HHIplot = ggplot(pergame)
HHIplot +
geom_point(aes(x = pergame$n_brokers, y = pergame$HHI)) +
scale_y_continuous(limits = c(0,10000)) +
scale_x_discrete(breaks = gameSizes) +
labs(title = paste("HHI Index of all games,",year,"Finals"),
x = "Game Size", y = "Herfindahl-Hirschman Index") +
theme(text = element_text(size=15),axis.text.x = element_text(angle = 0, hjust = 1))
assign("HHIplot",HHIplot, envir = .GlobalEnv)
ggsave(paste("HHI Index of all games,",year,"Finals.png"),
path = plotpath, width = 6, height = 4)
我先声明以下是不好的做法。对于像这样微不足道的事情,打破编程语言的范围规则被认为是不好的做法,但无论如何它都是这样做的。
因此,在您的函数体内,您将创建两个图并将它们放入变量中。然后您将使用 ggsave()
将它们写出来。最后,您将使用 assign()
将变量推送到全局范围。
library(ggplot2)
myFun <- function() {
#some sample data that you should be passing into the function via arguments
df <- data.frame(x=1:10, y1=1:10, y2=10:1)
p1 <- ggplot(df, aes(x=x, y=y1))+geom_point()
p2 <- ggplot(df, aes(x=x, y=y2))+geom_point()
ggsave('p1.jpg', p1)
ggsave('p2.jpg', p2)
assign('p1', p1, envir=.GlobalEnv)
assign('p2', p2, envir=.GlobalEnv)
return()
}
现在,当您 运行 myFun()
时,它会将您的两个绘图写入 .jpg 文件,并将绘图放入您的全局环境中,这样您就可以 运行 p1
或 p2
在控制台上,它们将出现在 RStudio 的绘图窗格中。
再说一次,这是错误的做法
好的做法是不要担心它们不会出现在 RStudio 中。他们写了文件,你知道他们写了,所以去那里看看。
我一直在尝试在 RStudio 中使用 R 的 ggplot 库绘制两个图。问题是,当我在一个函数中绘制两个时,只有最后一个显示(在 RStudio 的 "plots" 视图中)而第一个消失。更糟糕的是,当我 运行 ggsave()
在每个绘图之后 - 将它们保存到一个文件 - 它们都不会出现(但文件按预期保存)。但是,我想像以前一样查看我在绘图中保存的内容。
有没有一种方法既可以显示我将在 RStudio 的 plots 视图中绘制的内容,又可以保存它们?另外,在不保存地块的情况下,为什么多块地块会出现显示问题? (即为什么显示最后一个而不显示之前的?)
绘图部分的代码如下。我删除了一些部分,因为它们似乎没有必要(但如果确实相关,可以添加)。
HHIplot = ggplot(pergame)
# some ggplot geoms and misc. here
ggsave(paste("HHI Index of all games,",year,"Finals.png"),
path = plotpath, width = 6, height = 4)
HHIAvePlot = ggplot(AveHHI, aes(x = AveHHI$n_brokers))
# some ggplot geoms and misc. here
ggsave(paste("Average HHI Index of all games,",year,"Finals.png"),
path = plotpath, width = 6, height = 4)
我已经看过 here and here 但都没有帮助。在 ggsave()
行后添加 print(HHIplot)
或 print(HHIAvePlot)
未显示该图。
非常感谢。
更新 1:下面建议的解决方案无效,尽管它适用于答案的示例代码。我将 ggplot 对象传递给 .Globalenv
并且 print()
在绘图区域上给我一个空的灰色框(我想这是一个没有图层的空 ggplot 对象)。我认为问题可能出在我使用的某些图层或操纵器上,因此我在下面提供了一个 ggplot 对象的完整代码。有什么想法吗? (注意:我已经尝试将 assign()
行放在与 ggsave()
和 ggplot()
相关的所有可能位置。)
HHIplot = ggplot(pergame)
HHIplot +
geom_point(aes(x = pergame$n_brokers, y = pergame$HHI)) +
scale_y_continuous(limits = c(0,10000)) +
scale_x_discrete(breaks = gameSizes) +
labs(title = paste("HHI Index of all games,",year,"Finals"),
x = "Game Size", y = "Herfindahl-Hirschman Index") +
theme(text = element_text(size=15),axis.text.x = element_text(angle = 0, hjust = 1))
assign("HHIplot",HHIplot, envir = .GlobalEnv)
ggsave(paste("HHI Index of all games,",year,"Finals.png"),
path = plotpath, width = 6, height = 4)
我先声明以下是不好的做法。对于像这样微不足道的事情,打破编程语言的范围规则被认为是不好的做法,但无论如何它都是这样做的。
因此,在您的函数体内,您将创建两个图并将它们放入变量中。然后您将使用 ggsave()
将它们写出来。最后,您将使用 assign()
将变量推送到全局范围。
library(ggplot2)
myFun <- function() {
#some sample data that you should be passing into the function via arguments
df <- data.frame(x=1:10, y1=1:10, y2=10:1)
p1 <- ggplot(df, aes(x=x, y=y1))+geom_point()
p2 <- ggplot(df, aes(x=x, y=y2))+geom_point()
ggsave('p1.jpg', p1)
ggsave('p2.jpg', p2)
assign('p1', p1, envir=.GlobalEnv)
assign('p2', p2, envir=.GlobalEnv)
return()
}
现在,当您 运行 myFun()
时,它会将您的两个绘图写入 .jpg 文件,并将绘图放入您的全局环境中,这样您就可以 运行 p1
或 p2
在控制台上,它们将出现在 RStudio 的绘图窗格中。
再说一次,这是错误的做法
好的做法是不要担心它们不会出现在 RStudio 中。他们写了文件,你知道他们写了,所以去那里看看。