许多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)
按照哈德利在意见建议,我已经提交了一个通用的S3 autoplot()
到ggplot2
Github上库.因此,如果它被接受并检查出来,autoplot
将来应该有这个用途.
更新
autoplot
现已上市ggplot2
.