2011-08-11 8 views
35

Recientemente algunos usos ordenadas de ggplot2 han llegado, y las soluciones, ya sea parcial o total se han publicado:¿Extiende ggplot2 correctamente?

ggheat es notable porque en vez rompe la metáfora ggplot simplemente trazando en lugar de devolver un objeto.

Las soluciones de llaves son notables porque ninguna realmente encaja en el concepto de alto nivel ggplot2 (por ejemplo, debe especificar un rango de puntos que desea romper, y luego en algún otro lugar especificar el tamaño de la forma que desee ese rango mostrado - corsé, caja, vaca morada, etc.).

El ggplot2 book (que voy a pedir pronto y he leído los 2 capítulos en línea) parece ser sobre el uso de la gramática y las funciones en lugar de escribir nuevas o ampliar extensivamente las existentes.

Me gustaría aprender a agregar una característica específica o desarrollar un nuevo geom, y hacerlo correctamente. ggplot2 puede no ser un paquete de gráficos generales de la misma manera que grid o gráficos base, pero hay muchos gráficos que están a solo un paso o dos de un geom ggplot2 existente. Cuando surgen estas situaciones, normalmente puedo armar suficientes objetos para hacer algo una vez, pero ¿y si necesito la misma trama unas docenas de veces? ¿Qué pasa si a otras personas les gusta y desea usarlo? Ahora tienen que pasar por el mismo proceso cada vez que quieren ese gráfico. Me parece que la solución adecuada es agregar stat_heatplot y geom_heatplot, o agregar geom_Tuftebox para Tufte box plots, etc. Sin embargo, nunca he visto un ejemplo de cómo extender ggplot2; solo ejemplos de cómo usarlo.

¿Qué recursos existen para profundizar en ggplot2 y comenzar a extenderlo? Estoy particularmente interesado en una forma de alto nivel para especificar un rango en un eje como se describió anteriormente, pero también es bienvenido el conocimiento general sobre lo que hace que ggplot2 funcione.

En ausencia de una guía coherente (que rara vez existe para retoques suficientemente avanzados y, por lo tanto, puede que no exista aquí), ¿cómo se podría aprender sobre las partes internas? La inspección de la fuente es obviamente de una manera, pero con qué funciones se inicia, etc.

+19

Desafortunadamente la función 'makeMeHadley()' en mi instalación R está rota. Quizás si probara 'make_me_hadley()' en su lugar? –

+2

He agregado una [página de lista de deseos] (https://github.com/hadley/ggplot2/wiki/wishlist---feature-requests) al wiki de ggplot2 para enumerar varias ideas de extensiones. – baptiste

+1

@ AriB.Friedman: ¿Es eso un comando o una solicitud? ¿Y a quién está dirigido? : P – naught101

Respuesta

23

ggplot2 se está volviendo cada vez más extensible. La versión de desarrollo, https://github.com/hadley/ggplot2/tree/develop, usa roxygen2 (en lugar de dos sistemas propios separados) y ha comenzado a cambiar de proto a clases de S3 más simples (actualmente completa para coords y escalas). Es de esperar que estos dos cambios hagan que el código fuente sea más fácil de entender y, por lo tanto, más fácil de extender para otros (respaldo por el hecho de que la solicitud de extracción para ggplot2 está aumentando).

Otra gran mejora que se incluirá en la próxima versión son las mejoras de Kohske Takahashi en el sistema de guía (https://github.com/kohske/ggplot2/tree/feature/new-guides-with-gtable). Además de mejorar las guías predeterminadas (por ejemplo, con elegantes barras continuas de color), sus cambios también hacen que sea más fácil anular los valores predeterminados con sus propias leyendas y ejes personalizados. Esto permitiría dibujar las llaves en los ejes, donde probablemente pertenecen.

La próxima gran ronda de cambios (que probablemente no pueda abordar hasta el verano de 2012) incluirá una reescritura de geoms, estadísticas y ajustes de posición, siguiendo las líneas del boceto en el paquete de capas (https://github.com/hadley/layers) . Esto debería hacer que los geoms, las estadísticas y los ajustes de posición sean mucho más fáciles de escribir, y con suerte fomentará más contribuciones de la comunidad, como geom_tufteboxplot.

+1

Sonidos como este habrán fructificado en 1.1.0. Gracias @hadley y el resto del equipo ggplot2. Parece que la viñeta ("extendiendo-ggplot2") explicará cómo extenderla. –

+1

Mecanismo de extensión oficial ahora disponible en 2.0.0 http://blog.rstudio.org/2015/12/21/ggplot2-2-0-0/ –

5

¿Por qué desea ampliarlo? ¿Cuál es la motivación? Como yo lo veo ggplot2 está destinado a ser un paquete de gráficos de alto nivel diseñado para producir buenas figuras de un conjunto de datos en particular. Y haga las cosas bien y haga otras cosas fáciles: como escalas, leyendas, etc. ggplot2 no está destinado a ser un conjunto de herramientas gráficas de uso general. Al igual que celosía tiene un paradigma particular en mente y lo usa para ese propósito.

rejilla es el conjunto de herramientas gráficas subyacente que desea utilizar para hacer un trazado de planos general y personalizado. Y IIRC, es relativamente fácil agregar rangos de grillas a celosía o ggplot2 gráficos/objetos, para este tipo de anotación/anotación arbitraria, etc.

Lo que no tiene demasiado sentido está extendiendo ggplot2 o celosía lo largo de las líneas que están pensando. No veo por qué el ggplot2 no puede hacer heatplots como es? ¿O me estoy perdiendo algo aquí?

Lo que sería muy útil sería si las agallas de procesamiento de datos de ggplot2 o celosía estaban disponibles para que otros escriban código de trazado real en la parte superior de. Hadley ha mencionado esto en alguna parte antes.

ggplot2, en particular, y celosía códigos son muy difíciles de conseguir en leer/entender. ggplot2 utiliza el paquete proto para una versión de OOP, lo que significa que necesita comprender lo que está haciendo así como semántica ggplot2. celosía es similar, ya que hay mucha informática en el idioma que se hace allí que, si no está familiarizado con ese tipo de programación R, puede ser bastante intimidante, intimidante e impenetrable.

Para rejilla, le sugiero que busque en el libro de I Gráficos de Pablo Murrell, una segunda edición de la que es con el editor: http://www.stat.auckland.ac.nz/~paul/RG2e/

Editar: El punto que tenía la intención de transmitir era que la las interfaces proporcionadas por paquetes como ggplot2 y celosía son necesariamente de alto nivel. Prolongarlos está bien siempre y cuando se apeguen al paradigma/filosofía en uso. Los diagramas de calor ya se pueden hacer mediante el uso de geoms existentes; Parte de la filosofía del sistema ggplot es separar los datos de la pantalla/presentación, y usar geoms de maneras interesantes para producir la visualización deseada.

Envolver base ggplot + geom llama a una función más amigable para el usuario está bien siempre y cuando i) funcione como ggplot ya lo hace y devuelve un objeto, y ii) no tiene una interfaz muy diferente de la manera en que ggplot funciona. Los desarrolladores son libres de escribir el código que quieran, simplemente no es útil para la comunidad en general para proporcionar envoltorios que se alejen demasiado del funcionamiento del original. Esto lleva a confusión por parte del usuario y no fomenta el aprendizaje de ggplot2.

La idea de posicionamiento dinámico es interesante; podrías incluir estas ideas en todos los paquetes de trazado. Puede atornillar esto en un geom, o alternativamente como una función externa que modificó las coordenadas de entrada para producir un nuevo objeto de datos que podría ser utilizado por el geom relevante. Esa misma función podría usarse para otros paquetes de trazado: no sería necesario que sea específica de ggplot.

+0

No había visto el libro de Murrell antes. Hubiera sido útil cuando estaba rebuscando con la parrilla interna. Pregunta aclarada para abordar algunos de sus puntos. –

+2

Creo que encontrará que Hadley está haciendo un gran trabajo para convertir al menos algunos de los elementos de ggplot en un conjunto de herramientas de propósito general. En particular, el trabajo para generar escalas inteligentes es un problema muy difícil. Por lo tanto, en este momento se está trabajando mucho para hacer que las escalas de ggplot estén disponibles como herramientas de uso general para su uso, por ejemplo, en celosía. (ver, por ejemplo, esta discusión en la lista de correo de ggplot2 http://groups.google.com/group/ggplot2/browse_thread/thread/8f5a1a7513ef0042) – Andrie

+0

@Andrie - Gracias por los detalles y el enlace. Había visto fragmentos de esto, pero no podía poner mis manos/cerebro en ellos, así que no estaba comprometido en mi Respuesta con respecto a lo que Hadley había dicho que haría/estaba haciendo. Hacer algunos de los internos inteligentes de ggplot2 disponibles para otros sería una contribución muy útil. –

8

No estoy seguro de estar de acuerdo con su análisis. Explicaré por qué, y luego te indicaré algunos recursos para escribir tus propios geoms.

ggheat

Por lo que yo puedo decir, ggheat devuelve un objeto de la clase ggplot. Por lo tanto, es un envoltorio conveniente alrededor de ggplot, personalizado para un caso de uso específico. Aunque qplot es mucho más genérico, hace en principio lo mismo: es un contenedor alrededor de ggplot que hace algunas conjeturas informadas sobre los datos y elige los valores predeterminados razonables.Hadley llama a esto funciones de trama y se describe brevemente en la página 181 del libro ggplot2.

llaves

La solución llave de hace exactamente lo que dice la filosofía ggplot, es decir, datos separados de presentación. En este caso, los datos se generan mediante una pequeña función personalizada y se almacenan en un data.frame. A continuación, se muestra usando un geom que tenga sentido, es decir, geom_line.

quo vadis?

Has notado (en el r chat room) que preferirías tener un enfoque más genérico para trazar las llaves. Algo a lo largo de las siguientes líneas (y parafraseo y se extienden al mismo tiempo):

  • datos de suministro en la forma de un cuadro delimitador coordenadas (es decir, x0, x1, y0 e y1)
  • Especificar un "Estadística ", como refuerzo, caja o lo que sea
  • Especifique un geom, como geom_custom_shape

Esto suena como una buena generalización y extensión de las ideas detrás de la solución llave de cierre, y requeriría claramente escribir un nuevo geom . Hay un ggplot wiki oficial, donde puede encontrar instrucciones para creating a new geom.

+1

+1 y Aceptar, para el enlace a la creación de una nueva página de geom, que a su vez se vincula a algunas buenas referencias en 'proto', de las cuales @Gavin explicó la importancia. –

+0

¿Están las instrucciones vinculadas anteriormente para crear un nuevo geom actualizado? ¿Y cuál es la práctica recomendada para incluir nuevos geoms en paquetes que se enviarán a CRAN? –