Подтвердить что ты не робот

Расширение ggplot2 должным образом?

Недавно появилось несколько опрятных применений ggplot2, и были опубликованы частичные или полные решения:

ggheat примечателен тем, что он скорее разбивает метафору ggplot, просто рисует, а не возвращает объект.

Варианты фигурных скобок примечательны тем, что ни одна из них не соответствует концепции высокого уровня ggplot2 (например, вы должны указывать диапазон точек, которые хотите разбить, а затем где-нибудь еще указать геометрию того, как вы хотите диапазон отображается - скобка, коробка, пурпурная корова и т.д.).

ggplot2 book (который я закажу в ближайшее время и прочитаю 2 онлайн-главы), похоже, касается использования грамматики и функций, а чем писать новые или широко распространять существующие.

Я хотел бы научиться добавлять определенную функцию или разрабатывать новую геометрию и делать это правильно. ggplot2 может не предназначаться как общий графический пакет таким же образом, что grid или базовая графика, но есть очень много графиков, которые являются только шагом или двумя расширениями из существующей геометрии ggplot2. Когда возникают такие ситуации, я могу собрать достаточно объектов, чтобы что-то сделать один раз, но что, если мне понадобится один и тот же сюжет несколько десятков раз? Что делать, если другие люди любят это и хотят использовать его - теперь им приходится клонировать через один и тот же процесс каждый раз, когда они хотят этот график. Мне кажется, что правильное решение заключается в добавлении в stat_heatplot и geom_heatplot, или для добавления geom_Tuftebox для графических полей Tufte и т.д. Я никогда не видел примера расширения ggplot2; просто примеры того, как его использовать.

Какие существуют ресурсы, чтобы углубиться в ggplot2 и начать распространять его? Меня особенно интересует способ высокого уровня для определения диапазона на оси, как описано выше, но общие знания о том, что делает гаджет ggplot2, также приветствуются.

Отсутствует когерентная направляющая (которая редко существует для достаточно продвинутого мастеринга и, следовательно, может не существовать здесь), как можно было бы узнать об внутренних деталях? Проверка источника, очевидно, является одним из способов, но с каких функций начать и т.д.

4b9b3361

Ответ 1

ggplot2 постепенно становится все более расширяемым. Версия разработки https://github.com/hadley/ggplot2/tree/develop использует roxygen2 (вместо двух отдельных доморощенных систем) и начал переход от прото к более простым классам S3 ( в настоящее время завершено для коордов и шкал). Эти два изменения должны надеяться облегчить понимание исходного кода и, следовательно, проще для других расширить (резервное копирование по тому факту, что запрос на pull для ggplot2 увеличивается).

Еще одно большое улучшение, которое будет включено в следующую версию, - это усовершенствования системы навигации в Kohske Takahashi (https://github.com/kohske/ggplot2/tree/feature/new-guides-with-gtable). Помимо улучшения руководства по умолчанию (например, с элегантными непрерывными цветовыми полосами), его изменения также упрощают переопределение значений по умолчанию с вашими собственными легендами и осями. Это позволило бы нарисовать фигурные скобки в осях, где они, вероятно, принадлежат.

Следующий большой раунд изменений (который я, вероятно, не смогу решить до лета 2012 года) будет включать переписку геометрий, статистику и корректировку положения вдоль линий эскиза в пакете слоев (https://github.com/hadley/layers). Это должно сделать намного проще писать геометрии, статистические данные и корректировки положения, и, мы надеемся, будет способствовать увеличению вклада сообщества, например, geom_tufteboxplot.

Ответ 2

Я не уверен, что согласен с вашим анализом. Я объясню, почему, и затем укажу вам на некоторые ресурсы для написания собственных геометров.

ggheat

Насколько я могу судить, ggheat возвращает объект класса ggplot. Таким образом, это удобная оболочка вокруг ggplot, настроенная для конкретного варианта использования. Хотя qplot гораздо более общий, он в принципе делает то же самое: это обертка вокруг ggplot, которая делает некоторые информированные предположения о данных и выбирает разумные значения по умолчанию. Хэдли называет эту функцию графика, и она кратко описана на странице 181 книги ggplot2.

фигурные скобки

Решение фигурной скобки делает именно то, что говорит философия ggplot, то есть отдельные данные из презентации. В этом случае данные генерируются с помощью небольшой пользовательской функции и сохраняются в data.frame. Затем он отображается с использованием геометрии, которая имеет смысл, т.е. geom_line.

quo vadis?

Вы отметили (в r chat room), что вы предпочли бы иметь более общий подход к построению фигурных скобок. Что-то в следующих строках (и я перефразирую и расширяюсь в одно и то же время):

  • Поставлять данные в виде координат ограничивающей рамки (т.е. x0, x1, y0 и y1)
  • Укажите "статистику", такую ​​как скобка, поле или другое.
  • Укажите geom, например geom_custom_shape

Это звучит как хорошее обобщение и расширение идей, лежащих в основе фигурного скобки, и явно требовало бы написания новой геометрии. Существует официальная ggplot wiki, где вы можете найти инструкции для создание новой геометрии.

Ответ 3

Почему вы хотите его расширить? Какова мотивация? Как я вижу, ggplot2 предназначен для высокоуровневого графического пакета, предназначенного для создания хороших цифр из определенного набора данных. И делайте все правильно и делайте другие вещи проще: например, шкалы, легенды и т.д. ggplot2 не предназначен для универсального графического инструментария. Подобно решетке, она имеет особую парадигму и вы используете ее для этой цели.

grid - это базовый графический инструментарий, который вы хотите использовать для общего назначения, индивидуального построения. И IIRC, относительно легко добавить сетчатые grobs в решетку или ggplot2 графики/объекты для такого рода произвольных обозначений/аннотаций и т.д.

Что не имеет особого значения, это расширение ggplot2 или решетки вдоль линий, о которых вы думаете. Я не понимаю, почему ggplot2 не может делать тепловые плиты так, как есть? Или я здесь что-то не хватает?

Что было бы очень полезно, если бы хэши обработки данных ggplot2 или решетки были доступны для других, чтобы написать фактический код построения поверх. Хэдли упомянул об этом где-то раньше.

ggplot2, в частности, и решетка - довольно сложные коды, которые нужно читать или понимать. ggplot2 использует пакет proto для версии OOP, что означает, что вам нужно понять, что это делает, а также семантику ggplot2. решетка похожа на то, что на этом языке много вычислений, что, если вы не знакомы с такого рода R-программированием, может быть довольно запугивающим, устрашающим и непроницаемым!

Для сетки, я предлагаю вам посмотреть Графическую книгу Пола Меррелла R, второе издание которой принадлежит издателю: http://www.stat.auckland.ac.nz/~paul/RG2e/

Изменить: То, что я собирался понять, заключается в том, что интерфейсы, предоставляемые такими пакетами, как ggplot2 и решетка, обязательно являются высокоуровневыми. Расширение их в порядке, если они придерживаются используемой парадигмы/философии. Тепловые плиты уже могут быть сделаны с использованием существующих геометрий; частью философии системы ggplot является разделение данных с дисплеем/презентацией и удобное использование геометрий для создания желаемого отображения.

Обтекание базы ggplot + geom вызывает более удобную для пользователя функцию в порядке, пока i) она работает, как ggplot уже делает и возвращает объект, и ii) у нее нет интерфейса, который слишком отличается от способа ggplot работает. Разработчики могут свободно писать любой код, который им нужен, а просто не рекомендуется более широкому сообществу предоставлять упаковщики, которые слишком далеко от оригинальной работы. Это приводит к путанице со стороны пользователя и не способствует изучению самого ggplot2.

Идея динамического позиционирования интересна; вы можете включить эти идеи во все планы построения. Вы можете закрепить это в геометре или, альтернативно, как внешнюю функцию, которая изменила входные координаты, чтобы создать новый объект данных, который может быть использован соответствующей геомойкой. Эта же функция может быть использована для других пакетов построения - это не обязательно будет специфичным для ggplot.