1

在开发用于绘制数据和模型结果的 gWidgets 界面时,我创建了一个绘图页面par(mfrow=c(4,1))并将 4 个绘图堆叠起来。

第一个图(顶部的简单 y 与 x)工作正常,但循环中剩余的 3 个图创建轴但不绘制数据。为了测试代码,我尝试在循环遍历绘图之前打开一个新的绘图窗口,并且一切正常。

有什么gwdigets与之交互的东西plot(...)有用吗?

编辑 一个可重现的例子:

不起作用:

library(gWidgets)
options(guiToolkit="RGtk2") ## "Qt"
w <- gwindow("brush example", visible=FALSE)
g <- ggroup(container=w)
gg <- ggraphics(container=g)

addHandlerChanged(gg, handler=function(h,...) {
  par(mfrow=c(2,2))
  plot(mpg ~ wt, mtcars)
  plot(mpg ~ wt, mtcars,col='blue')
  plot(mpg ~ wt, mtcars,col='red')
  plot(mpg ~ wt, mtcars,col='green')
})
visible(w) <- TRUE

应该看起来像这样(正常的 R 图形窗口:

在此处输入图像描述

不像这样

在此处输入图像描述

4

2 回答 2

1

有两个问题。一个可能与 windows 上的 cairo 实现有关。这可以通过完全避免 gWidgets 来测试:

make_plot <- function() {
  par(mfrow=c(2,2))
  plot(mpg ~ wt, mtcars)
  plot(mpg ~ wt, mtcars,col='blue')
  plot(mpg ~ wt, mtcars,col='red')
  plot(mpg ~ wt, mtcars,col='green')
}

require(RGtk2)
require(cairoDevice)

w <- gtkWindow(show=FALSE)
da <- gtkDrawingArea()
w$add(da)
w$show(TRUE)

asCairoDevice(da)

make_plot()

另一个问题是将图形绘制调用放在处理程序中。对于 ggraphics,在完成橡皮筋之后调用更改处理程序,而不是在图形本身更改时调用。不确定这是最有用的东西,但它意味着在通过橡皮筋进行选择后调用一些处理程序。addHandlerClicked 可能更有趣。

于 2013-02-12T18:36:23.250 回答
1

由于某些原因,情节无法刷新。您可以使用多个 ggraphics 实例,也可以使用ggraphicsnotebook.

这是一个使用许多实例的解决方案ggraphics

library(gWidgets)
options(guiToolkit="RGtk2") ## "Qt"
w <- gwindow("brush example", visible=FALSE)
gg <- ggroup(container=w,horizontal=F,use.scrollwindow = T)
down.group <- ggroup(container = gg)
up.group <- ggroup(container = gg)

devs.up <- lapply(1:2, function(i) 
                 ggraphics(container=down.group,label=as.character(i)))
devs.down <- lapply(3:4, function(i) 
                 ggraphics(container=up.group,label=as.character(i)))
visible(w) <- TRUE
lapply(c(devs.up,devs.down), function(gg)
addHandlerChanged(gg, handler=function(h,...) {
  par(mfrow=c(1,1))
  plot(mpg ~ wt, mtcars)
}))
于 2013-02-12T18:27:23.450 回答