Ggplot不显示源函数

时间:2015-12-29 20:53:04

标签: r plot ggplot2 rstudio

我一直试图在RStudio中使用R的ggplot库绘制两个图。问题是,当我在一个函数中绘制两个时,只显示最后一个(在RStudio的“图”视图中),第一个消失。更糟糕的是,当我在每个绘图之后运行ggsave() - 将它们保存到文件中 - 它们都不会出现(但文件会按预期保存)。但是,我想要查看我之前在剧情中保存的内容。

有没有办法可以在RStudio的情节视图中显示我将要绘制的内容并保存它们?此外,当没有保存地块时,为什么在有多个地块时会出现显示问题? (也就是为什么它显示最后一个而不是之前的?)

带有绘图部分的代码如下。我删除了一些部分,因为它们似乎没必要(但如果确实相关,可以添加它们)。

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)

我已经看了herehere,但都没有帮助。在print(HHIplot)行之后添加print(HHIAvePlot)ggsave()未显示该图。

非常感谢提前。

更新1 :下面建议的解决方案不起作用,尽管它适用于答案的示例代码。我将ggplot对象传递给.Globalenvprint()在绘图区域给出了一个空的灰色框(我想象的是一个没有图层的空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)

1 个答案:

答案 0 :(得分:2)

我将在前言中说以下是不好的做法。打破一种编程语言的范围规则是不好的做法,这对于像这样微不足道的事情,但无论如何都是这样做的。

因此,在函数体内,您将创建两个图并将它们放入变量中。然后你将使用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或{{1}在控制台上,它们将出现在RStudio的Plot窗格中。

再次,这是不好的做法

良好的做法是不要担心它们没有出现在RStudio中。他们写了文件,你知道他们做了,所以去那里看看。