В чем разница между geoms и stats в ggplot2?

Как geoms, так и stats можно использовать для создания графиков в пакете R ggplot2, и они часто дают схожие результаты (например, geom_area и stat_bin). Они также часто имеют несколько разные аргументы, например, в2-D графики плотности:

geom_density_2d(mapping = NULL, data = NULL, stat = "density2d",
  position = "identity", ..., lineend = "butt", linejoin = "round",
  linemitre = 1, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)

stat_density_2d(mapping = NULL, data = NULL, geom = "density_2d",
  position = "identity", ..., contour = TRUE, n = 100, h = NULL, na.rm =
  FALSE, show.legend = NA, inherit.aes = TRUE)

Есть ли принципиальные различия между двумя типами объектов?

Ответы на вопрос(2)

Решение Вопроса

которые вы видите на графике, такие объекты, как точки, линии, области, кривые.

статистика означает «статистические преобразования». Эти объекты суммируют данные различными способами, такими как подсчет наблюдений, создание линии лесса, которая наилучшим образом соответствует данным, или добавление доверительного интервала к линии лесса.

Поскольку геомы являются «ядром» сюжета, это обязательные объекты. С другой стороны, статистика не обязательна для построения графика, но может значительно улучшить окончательный график.

Как отмечает @ eipi10 в комментариях, эти различия носят несколько концептуальный характер, так как большинство геомов претерпевает некоторую статистическую трансформацию перед тем, как их построить. Они включаютgeom_bar, geom_smooth, а такжеgeom_quantile, Некоторые распространенные исключения, когда данные представлены в более или менее «необработанной» форме:geom_point а такжеgeom_line и менее часто используемыеgeom_rug.

 lmo04 авг. 2016 г., 21:40
Спасибо за ссылку, я добавлю заметку, чтобы, надеюсь, лучше охватить это мнение.
 eipi1004 авг. 2016 г., 21:40
Вероятно, наиболее распространенный случай, когда это имеет значениеgeom_bar где по умолчанию считается количество строк (по умолчаниюgeom_bar являетсяstat_count). Таким образом, если ваши данные предварительно суммированы, вам необходимо указатьstat="identity", что означает отсутствие преобразования необработанных данных.
 eipi1004 авг. 2016 г., 21:34
Статистика AFAIK и гемы всегда идут вместе, но у каждого геома есть стат по умолчанию. Таким образом, вам не нужно явно указывать статистику, но она все еще требуется. Если вы посмотрите напомощь ggplot Вы можете увидеть, какой стат по умолчанию для каждого geom. Вы также можете отменить процесс и указатьgeom в пределах звонкаstat_xxx(), В большинстве случаев вам не нужно беспокоиться об этих деталях, но это полезно знать, если вы хотите изменить поведение по умолчанию.

Это только для дополнения принятого ответа.

По словам Хэдли Виккама, автора ggplot2, в своей книге «ggplot2: элегантная графика для анализа данных»(ссылка здесь) на стр. 91, раздела 5.2 «Построение графика слой за слоем»:

Вам нужно только установить одно из stat и geom: каждый geom имеет стат по умолчанию, а каждый stat имеет геом по умолчанию.

Принятый ответ выше хорошо объясняет, почему они разные. Это должно объяснить, почему их трудно различить на практике - всякий раз, когда вы используете слой geom, вы также неявно используете слой статистики (даже если это просто преобразование идентичности); аналогично, всякий раз, когда вы используете слой статистики, вы также неявно используете слой geom.

Если вы согласны со значениями по умолчанию, используемыми любым слоем, то было бы излишне указывать явно оба слоя. Даже если вас не устраивают значения по умолчанию, предоставляемые любым слоем, вы можете изменить значения по умолчанию как параметры для каждого слоя (то есть вы можете изменить geom по умолчанию в качестве параметра для передачи любомуstat_* функция, и вы можете изменить стат по умолчанию в качестве параметра для передачи любомуgeom_* функция). По словам Хэдли Уикхем (тот же источник, что и выше):

Вы можете передавать параметры в... (в этом случае параметры stat и geom автоматически разделяются)

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

Например, без спецификаций по умолчанию и с использованием только грамматики графики код для простого точечного графика может выглядеть следующим образом:

ggplot() +
layer(
data = diamonds, mapping = aes(x = carat, y = price),
geom = "point", stat = "identity", position = "identity"
) +
scale_y_continuous() +
scale_x_continuous() +
coord_cartesian()

Используя значения по умолчанию для шкал и координат, мы можем написать что-то вроде:

ggplot(data = Diamonds, aes(x = carat, y = price)) + 
layer(
geom = "point", stat = "identity", position = "identity"
)

Но этоеще раздражающе долго, конечно, так как значенияstat а такжеposition просто"identity", что в основном означает «ничего не делать» - так зачем говорить это явно?

Тем не менееlayer() функция не имеет значений по умолчанию дляstat или жеposition - они должны быть указаны явно в вызовеlayer() функция.

Чтобы обойти это, Хэдли сделалgeom_* функции, а такжеstat_* функционирует какоберток кlayer() функция, которая имеет значения по умолчанию для обоихgeom а такжеstat параметр. Разница междуstat_* а такжеgeom_* функции, какой параметр имеетнеизменный (неизменяемое) значение по умолчанию,stat или жеgeom.

Источник:http://ggplot2.tidyverse.org/reference/layer.html

Так что дляgeom_* Функции, которые вы можете изменить значение по умолчаниюstat параметр, но не значение по умолчаниюgeom параметр, а дляstat_* Функции, которые вы можете изменить значение по умолчаниюgeom параметр, но не значение по умолчаниюstat параметр.

Слой - это комбинация данных, статистики и геометрии с возможностью корректировки положения. Обычно слои создаются с использованиемgeom_* или жеstat_* вызовы, но это также может быть создано непосредственно с помощью этой функцииlayer() функция].

 Laryx Decidua19 июл. 2017 г., 12:11
Большое спасибо за объяснение того, чтоstat_* а такжеgeom_* функции на самом деле являются обертками, обеспечивающими разумные значения по умолчаниюlayer() функция. Для меня это был самый откровенный аспект вашего ответа. Мои ученики будут (косвенно) вам очень благодарны :-)

Ваш ответ на вопрос