descargar - pie chart r ggplot2
¿Mala idea? ggplotting un objeto de clase S3 (4)
Muchos objetos R tienen métodos S3 para trazar asociados con ellos. Por ejemplo, cada tutorial de regresión R contiene algo como esto:
dat <- data.frame(x=runif(10))
dat$y <- dat$x+runif(10)
my.lm <- lm( y~x, dat )
plot(my.lm)
Que muestra diagnósticos de regresión.
De manera similar, tengo un objeto S3 para un paquete que consiste en una lista que básicamente contiene algunas series de tiempo. Tengo un método plot.myobject
para él, que llega a la lista, elimina la serie de tiempo y las grafica en el mismo gráfico. Me gustaría reescribir esto como una función ggplot2 para que sea más bonita y quizás más extensible también.
Debido a que este paquete está destinado a hacer que las personas sin mucha experiencia en R se pongan en marcha rápidamente, me gustaría que sea de una sola línea con un solo argumento , como en plot(myobject)
, ggplot(myobject)
, o cualquiera que sea la versión apropiada. ser. Luego, una vez que se enganchan, pueden aprender más sobre ggplot2
y personalizar el gráfico al contenido de su corazón.
Mi tentación inicial fue simplemente reemplazar las plot.myobject
internas del método plot.myobject
para usar ggplot2. Esto, sin embargo, parece que podría perder puntos importantes de estilo.
¿Es esta una mala idea? Si es así, ¿por qué y qué alternativa debo usar?
Hay un idioma existente en ggplot2
para hacer exactamente lo que usted propone. Se llama fortify
. Toma un objeto y produce una versión del objeto en una forma con la que ggplot puede trabajar, es decir, un data.frame. La Sección 9.3 en el libro ggplot2 de Hadley describe cómo hacerlo, usando la clase de objeto S3 lm
como ejemplo. Para ver esto en acción, escriba fortify.lm
en su consola para obtener el siguiente código:
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>
Este es mi propio ejemplo de cómo escribir un método fortify
para el tree
, publicado originalmente en la lista de correo 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"
)
Y el código de la trama. Observe que los datos pasados a ggplot
no son un data.frame
sino un objeto de 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)
Según la sugerencia de Hadley en los comentarios, he enviado un S3 autoplot()
genérico autoplot()
al repositorio Github de ggplot2
. Por lo tanto, si se acepta y se autoplot
, debería haber un autoplot
disponible para este uso en el futuro.
Actualizar
autoplot
ya está disponible en ggplot2
.
Usar plot.myobject
es fácil de recordar y ejecutar. Sin embargo, si está hablando de myobject
s que ya tienen funciones plot.myobject
, posiblemente plot.myobject
preocuparse por las diferentes versiones en los diferentes espacios de nombres. Pero si es solo por tus propios myobject
, no pierdas ningún punto de estilo conmigo. El paquete nlme
, por nlme
, hace esto extensivamente, aunque con gráficos de celosía en lugar de ggplot.
Usar ggplot.myobject
es una alternativa; No debería tener que preocuparse por otras versiones, a menos que otras personas comiencen a hacer lo mismo. Sin embargo, como ggplot
, rompe el paradigma de uso de ggplot
.
Otra alternativa es usar un nombre nuevo, por ejemplo, gsk3plot
; nunca tiene que preocuparse por otras versiones, no es tan difícil de recordar y puede hacer alternativas para trazar el contenido de su corazón sin tener que preocuparse por los conflictos. Esto es probablemente lo que elegiría, ya que deja claro a la audiencia que estas gráficas son personalizables y esta es una función que hace que la trama sea la que usted prefiere, y que si están tan inclinados, podrían profundizar y hacer la misma cosa.
ggplot
métodos ggplot
y ggplot2
generalmente esperan que los datos lleguen a ellos en forma de fusión (). Por lo tanto, es posible que sus métodos deban realizar una fusión (desde el paquete plyr) y luego "asignar" los nombres de columna resultantes a los argumentos en los métodos de ggplot.