背景图片和循环在qplot上,我怎么才能更新日期而不重新打印其余的

时间:2014-07-10 20:00:32

标签: r image dynamic background ggplot2

我想为我的绘图使用背景png并更改循环中绘图点的数据集。不幸的是,print(qplot_object)重新打印所有内容而不仅仅是更改数据,因此背景再次绘制,并且缓慢闪烁:(

我正在使用annotation_custom(g, xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf)作为背景和qplot(ggplot确实不起作用,因为那时图片不在后台,而是在数据前面)。此外,opts(panel.background=function(...)picture)的旧版本不再有效。

这里是代码:

library(ggplot2)
library(gridExtra) # for ebimageGrob
require(png)
require(grid)

img <- readPNG("bla.png")
g <- rasterGrob(img, interpolate=TRUE)

mdat <- data.frame(100,100)
colnames(mdat ) <- c("X","Y")

plot_field <- qplot(mdat[,1],mdat[,2], geom="blank") +
  coord_cartesian(xlim = c(0, 1200),ylim = c(0, 799)) +
  annotation_custom(g, xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf) +
  geom_point()+ theme_bw() +
  theme(
   panel.grid.major=element_blank(),
       panel.grid.minor=element_blank(),
       panel.margin.x = unit(12,"cm"),
       panel.margin.y = unit(7.99,"cm"),
       aspect.ratio = 799/1200
   )       

print(plot_field)

for (i in 1:100){ 
 mdat <- data.frame(100+i*5,100+i)
 colnames(mdat) <- c("X","Y")
 print(plot_field) # this works, but replots all, so its flashing all the time and slow,  
                   #because of the background png (annotation_custom)
}

我希望有人有一个想法,也许有任何动态绘图类或画布在R中绘制。代码的想法实际上是加载一个足球场,然后运行模拟并更新球员的位置每一步。因此,qlot不应该一直闪烁,只是玩家应该移动,也许我可以处理单独的层?

1 个答案:

答案 0 :(得分:0)

停止闪烁的一种方法是防止屏幕更新,直到完成所有绘图。尝试

for (i in 1:100){ 
   mdat <- data.frame(100+i*5,100+i)
   colnames(mdat) <- c("X","Y")
   dev.hold()  #pause device update
   print(plot_field)
   dev.flush() #send plot to device
}