馊主意?ggplotting一个S3类对象

Ari*_*man 16 r ggplot2

许多R对象都有S3方法来绘制与之关联的方法.例如,每个R回归教程都包含以下内容:

dat <- data.frame(x=runif(10))
dat$y <- dat$x+runif(10)
my.lm <- lm( y~x, dat )
plot(my.lm)
Run Code Online (Sandbox Code Playgroud)

其中显示回归诊断.

类似地,我有一个包含S3对象的包,它包含一个基本上包含几个时间序列的列表.我有一个plot.myobject方法,它进入列表,拉出时间序列,并在同一图表上绘制它们.我想将它重写为ggplot2函数,以便它更漂亮,也许更具可扩展性.

因为这个包的目的是让人们没有多少经验[R快速启动和运行,我想这是一个班轮有一个参数,如plot(myobject),ggplot(myobject)或任何适当的版本可能.然后,一旦他们迷上了,他们就可以了解更多关于ggplot2并根据他们内心的内容自定义图表.

我最初的诱惑是简单地替换plot.myobject方法的内部以使用ggplot2.然而,这似乎可能会失去我的主要风格点.

这是一个坏主意,如果是这样,为什么以及我应该使用哪种替代方案?

And*_*rie 12

有一个成语ggplot2可以完全按照你的建议去做.它被称为fortify.它接受一个对象,并以ggplot可以使用的形式生成对象的一个​​版本,即data.frame.Hadley的ggplot2一书中的9.3节描述了如何使用S3对象类lm作为示例.要查看此操作,请在fortify.lm控制台中键入以获取以下代码:

function (model, data = model$model, ...) 
{
    infl <- influence(model, do.coef = FALSE)
    data$.hat <- infl$hat
    data$.sigma <- infl$sigma
    data$.cooksd <- cooks.distance(model, infl)
    data$.fitted <- predict(model)
    data$.resid <- resid(model)
    data$.stdresid <- rstandard(model, infl)
    data
}
<environment: namespace:ggplot2>
Run Code Online (Sandbox Code Playgroud)

这是我自己编写一个fortify方法的例子tree,最初发布在ggplot2邮件列表中

fortify.tree <- function(model, data, ...){
  require(tree)
  # Uses tree:::treeco to extract data frame of plot locations
  xy <- tree:::treeco(model)
  n <- model$frame$n

  # Lines copied from tree:::treepl
  x <- xy$x
  y <- xy$y
  node = as.numeric(row.names(model$frame))
  parent <- match((node%/%2), node)
  sibling <- match(ifelse(node%%2, node - 1L, node + 1L), node)

  linev <- data.frame(x=x, y=y, xend=x, yend=y[parent], n=n)
  lineh <- data.frame(x=x[parent], y=y[parent], xend=x,
      yend=y[parent], n=n)

  rbind(linev[-1,], lineh[-1,])

} 

theme_null <- opts(
    panel.grid.major = theme_blank(),
    panel.grid.minor = theme_blank(),
    axis.text.x = theme_blank(),
    axis.text.y = theme_blank(),
    axis.ticks = theme_blank(),
    axis.title.x = theme_blank(),
    axis.title.y = theme_blank(),
    legend.position = "none"
)
Run Code Online (Sandbox Code Playgroud)

和剧情代码.请注意,传递给的数据ggplot不是data.frame一个tree对象.

library(ggplot2)
library(tree)

data(cpus, package="MASS")
cpus.ltr <- tree(log10(perf) ~ syct+mmin+mmax+cach+chmin+chmax, cpus)

p <- ggplot(data=cpus.ltr) + 
    geom_segment(aes(x=x,y=y,xend=xend,yend=yend,size=n),
      colour="blue", alpha=0.5) + 
    scale_size("n", to=c(0, 3)) + 
    theme_null
print(p) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Ari*_*man 9

按照哈德利在意见建议,我已经提交了一个通用的S3 autoplot()ggplot2Github上库.因此,如果它被接受并检查出来,autoplot将来应该有这个用途.

更新

autoplot现已上市ggplot2.