38 votes

Étendre ggplot2 correctement?

Récemment, quelques soigné utilise de ggplot2 ont, de façon partielle ou complète, des solutions ont été posté:

ggheat est remarquable car il plutôt casse la ggplot métaphore simplement en traçant plutôt que de retourner un objet.

L'accolade solutions sont remarquables parce que pas vraiment adapté dans la ggplot2 de haut niveau concept (par exemple, vous devriez être en spécifiant une plage de points que vous voulez pauses, et puis ailleurs être en mesure de préciser la geom de la façon dont vous voulez que la gamme affiche--accolade, une boîte, une vache violette, etc.).

Le ggplot2 livre (que je vais commander bientôt et avoir lu les 2 en ligne chapitres) semble être sur l'utilisation de la grammaire et des fonctions plutôt que de l'écriture de nouvelles ou largement l'extension de celles existantes.

Je voudrais apprendre l'ajout d'une fonctionnalité spécifique ou de développer une nouvelle geom, et de le faire correctement. ggplot2 ne peut pas être conçu comme un général dans le domaine du graphisme, de la même manière qu' grid ou de graphismes de base, mais il y a un grand nombre de graphiques, qui ne sont qu'une étape ou deux d'extension à partir d'un ggplot2 geom. Lorsque ces situations viennent, je peux généralement mis ensemble assez d'objets pour faire quelque chose une fois, mais que faire si j'ai besoin de la même parcelle de quelques dizaines de fois? Que faire si d'autres personnes comme elle et que vous voulez l'utiliser, ils ont maintenant à quelque chose par le même processus à chaque fois qu'ils veulent que graphique. Il me semble que la bonne solution est d'ajouter en stat_heatplot et geom_heatplot, ou pour ajouter un geom_Tuftebox pour Tufte boîte de parcelles, etc. Pourtant, je n'ai jamais vu un exemple de l'extension de ggplot2; juste des exemples de comment l'utiliser.

Quelles sont les ressources à creuser plus profondément dans ggplot2 et le début de l'étendre? Je suis particulièrement intéressé par un haut niveau de manière à spécifier une plage sur un axe tel que décrit ci-dessus, mais en général les connaissances sur ce qui fait ggplot2 tique est la bienvenue.

En l'absence d'un guide cohérent (qui n'existe que rarement suffisamment avancée pour bricoler et, par conséquent, peut ne pas exister ici), comment peut-on aller sur l'apprentissage sur le fonctionnement interne? L'inspection de la source est évidemment une façon, mais quelles sont les fonctions pour commencer, etc.

25voto

hadley Points 33766

ggplot2 est progressivement de plus en plus extensible. La version de développement, https://github.com/hadley/ggplot2/tree/develop, utilise roxygen2 (au lieu de deux systèmes "maison"), et a commencé à passer de proto de plus simple S3 classes (actuellement complet pour coords et échelles). Ces deux changements devraient rendre le code source plus facile à comprendre, et par conséquent plus facile pour les autres de s'étendre (sauvegarde par le fait que la demande d'extraction de ggplot2 sont en augmentation).

Une autre grande amélioration qui sera inclus dans la prochaine version est Kohske Takahashi améliorations au système de guidage (https://github.com/kohske/ggplot2/tree/feature/new-guides-with-gtable). Ainsi que l'amélioration de la valeur par défaut guides (par exemple avec un élégant continu barres de couleur), ses changements aussi plus facile à remplacer les valeurs par défaut avec vos propres légendes et des haches. Cela ferait-il possible de tracer les accolades dans les axes, où ils appartiennent probablement.

Le prochain grand cycle de changements (que je ne sera probablement pas en mesure de s'attaquer jusqu'à l'été 2012) comprendra une réécriture de geoms, des statistiques et des ajustements de position, le long de la lignes de l'esquisse dans le paquet de couches (https://github.com/hadley/layers). Cela devrait rendre geoms, les statistiques et les réglages de la position de beaucoup plus facile à écrire, et nous espérons encourager les contributions de la communauté, comme un geom_tufteboxplot.

8voto

Andrie Points 66979

Je ne suis pas certain que je suis d'accord avec votre analyse. Je vais vous expliquer pourquoi, et puis pointez vous à certaines ressources pour la rédaction de votre propre geoms.

ggheat

Aussi loin que je peux dire, ggheat renvoie un objet de la classe ggplot. C'est donc une pratique wrapper autour de ggplot, personnalisé pour un cas d'utilisation spécifiques. Bien qu' qplot est beaucoup plus générique, il n'est en principe la même chose: C'est un wrapper autour de ggplot qui en fait des estimations sur les données et choisit des valeurs par défaut raisonnables. Hadley appelle cette parcelle fonctions et il est brièvement décrite à la page 181 de la ggplot2 livre.

accolades

L'accolade solution est exactement ce que l' ggplot philosophie dit, c'est à dire séparer les données de la présentation. Dans ce cas, les données sont générées par un peu de fonction personnalisée et est stocké dans un data.frame. Il est ensuite affichée à l'aide d'un geom qui fait sens, c'est à dire geom_line.

quo vadis?

Vous l'avez remarqué (dans la r de la salle de chat) que vous préférez avoir une approche plus générique de tracer les accolades. Quelque chose le long des lignes suivantes (et je paraphrase et de l'étendre en même temps):

  • Fournir des données sous la forme d'un rectangle de coordonnées (i.e. x0, x1, y0 et y1)
  • Spécifier une "statistique", comme le corset, la boîte ou quoi
  • Spécifier un geom, comme geom_custom_shape

Cela sonne comme une bonne généralisation et l'extension des idées derrière l'accolade de la solution, et serait de toute évidence que l'écriture d'un nouveau geom. Il y a un officiel ggplot wiki, où vous pouvez trouver des instructions pour la création d'une nouvelle geom.

4voto

Gavin Simpson Points 72349

Pourquoi voulez-vous l'étendre? Qu'est-ce que la motivation? Comme je le vois ggplot2 est destiné à un haut niveau dans le domaine du graphisme conçu pour produire de nice chiffres à partir d'un ensemble de données particulier. Et de faire les choses et de faire d'autres choses facile: comme les échelles, légendes etc. ggplot2 n'est pas destiné à être un outil graphique-kit. Comme des treillis , il dispose d'un paradigme particulier à l'esprit, et vous l'utiliser à cette fin.

la grille de la boîte à outils graphiques que vous souhaitez utiliser pour le faire à des fins générales, personnalisé, à la carte. Et autant que je me souvienne, il est relativement facile d'ajouter une grille grobs de treillis ou de ggplot2 parcelles/objets, pour ce genre de l'arbitraire de la notation/annotation etc.

Ce qui n'a pas trop de sens est l'extension de ggplot2 ou treillis le long des lignes que vous pensez. Je ne vois pas pourquoi le ggplot2 ne peut pas faire heatplots que c'est? Ou ai-je raté quelque chose ici?

Ce serait très utile si le traitement des données entrailles de ggplot2 ou treillis étaient disponibles pour les autres à écrire réelle de traçage code sur le dessus de. Hadley a mentionné quelque part avant.

ggplot2, en particulier, et les treillis sont assez difficiles codes à entrer dans lire/comprendre. ggplot2 utilise le proto forfait pour une version de la programmation orientée objet, ce qui signifie que vous devez comprendre ce qui est à faire ainsi que ggplot2 sémantique. treillis est similaire car il y a beaucoup de calcul sur la langue fait-il que, si vous n'êtes pas familier avec ce genre de R de programmation, peut très impressionnant, intimidant et impénétrable!

Pour la grille, je vous suggère de regarder à Paul Murrell R Graphique livre, une deuxième édition avec l'éditeur: http://www.stat.auckland.ac.nz/~paul/RG2e/

Edit: j'avais l'intention de faire passer est que les interfaces fournies par paquets comme ggplot2 et les treillis sont nécessairement de haut niveau. Leur extension est bien tant qu'ils s'en tiennent à le paradigme/philosophie en cours d'utilisation. Heatplots peut déjà être fait en utilisant les geoms; une partie de la philosophie de la ggplot système est de séparer les données à partir de l'écran/la présentation et à l'utilisation geoms de manière intéressante pour produire le type d'affichage désiré.

Habillage de la base de ggplot + geom appels dans un cadre plus convivial fonction est OK aussi longtemps que je l'ai), il fonctionne comme ggplot déjà fait et retourne un objet, et ii) il n'a pas une interface qui est trop différent de la façon dont ggplot œuvres. Les développeurs sont libres d'écrire ce code qu'ils veulent, il n'est pas utile à l'ensemble de la communauté pour fournir des wrappers qui s'éloignent trop de l'original du fonctionnement. Cela mène à la confusion de la part de l'utilisateur et de ne pas favoriser l'apprentissage de ggplot2 lui-même.

Le positionnement dynamique idée est intéressante; on pourrait intégrer ces idées dans tout traçage de paquets. Vous pourriez boulon dans un geom, ou comme une fonction externe qui a modifié l'entrée de coordonnées pour produire un nouvel objet de données qui pourrait être utilisée par la geom. La même fonction peut être utilisée pour d'autres traçage de paquets - il n'aurait pas besoin d'être ggplot spécifiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X