ggplot change r ggplot2 prototype-programming

r - change - ggplot2 pdf



¿Extendiendo ggplot2 correctamente? (3)

Recientemente se han presentado algunos usos geniales de ggplot2, y se han publicado soluciones parciales o completas:

ggheat es notable porque más bien 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 otro lugar puede especificar el tamaño de cómo desea que se muestre ese rango- -Fuerza, caja, vaca púrpura, etc.).

El libro ggplot2 (que voy a pedir pronto y he leído los 2 capítulos en línea) parece tratarse del 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 que no se ggplot2 como un paquete de gráficos general de la misma manera que los gráficos de grid o base, pero hay una gran cantidad de gráficos que están a solo un paso o dos de la extensión 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 un stat_heatplot y un geom_heatplot , o agregar un geom_Tuftebox para los geom_Tuftebox de caja de Tufte , etc. Sin embargo, nunca he visto un ejemplo de la extensión de 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 acerca de los aspectos internos? La inspección de la fuente es, obviamente, de una manera, pero con qué funciones comenzar, etc.


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

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

Lo que no tiene demasiado sentido es extender ggplot2 o celosía a lo largo de las líneas que estás 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 tripas de procesamiento de datos de ggplot2 o celosía estuvieran disponibles para que otros escriban el código de trazado real además de. Hadley ha mencionado esto en alguna parte antes.

ggplot2 , en particular, y el enrejado son códigos bastante difíciles de entender para leer. ggplot2 usa el paquete proto para una versión de OOP, lo que significa que necesita comprender lo que está haciendo, así como la semántica de ggplot2 . El enrejado es similar ya que hay mucha informática en el lenguaje que allí se usa, que si no estás familiarizado con ese tipo de programación R, puede ser bastante intimidante, desalentador e impenetrable.

Para la grilla , sugiero que mires el libro R Graphics de Paul Murrell, una segunda edición de la cual es para el editor: http://www.stat.auckland.ac.nz/~paul/RG2e/

Editar: El punto que quería transmitir es que 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 las llamadas ggplot + geom base en una función más amigable para el usuario está bien siempre que i) funcione como ggplot ya lo hace y devuelve un objeto, y ii) no tiene una interfaz que sea muy diferente de la forma en que funciona ggplot. 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.


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 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, en principio hace lo mismo: es un envoltorio alrededor de ggplot que hace algunas conjeturas informadas sobre los datos y elige los valores predeterminados razonables. Hadley llama a esta trama funciones y se describe brevemente en la página 181 del libro ggplot2 .

llaves

La solución de ggplot hace exactamente lo que dice la filosofía ggplot , es decir, separa los datos de la 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 utilizando un geom que tiene sentido, es decir, geom_line .

quo vadis?

Ha notado (en la sala de chat r ) que preferiría tener un enfoque más genérico para trazar las llaves. Algo a lo largo de las siguientes líneas (y parafraseo y extiendo al mismo tiempo):

  • Suministre datos en forma de coordenadas de cuadro delimitador (es decir, x0, x1, y0 e y1)
  • Especifique una "estadística", como llaves, 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 de llavero, y claramente requeriría escribir un nuevo geom. Hay una wiki oficial de ggplot , donde puedes encontrar instrucciones para crear un nuevo geom .


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 de color continuas), sus cambios también facilitan la anulación de 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, a lo largo de 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.