Когда использовать сопоставление aes для аргумента xend функции geom_segment() в пакете ggplot2 от R?

#r #ggplot2 #aes

#r #ggplot2 #aes

Вопрос:

Я пытаюсь создать 32 вертикальных отрезка, используя столбец mpg фрейма данных mtcars. Все хорошо, когда я запускаю следующий код:

 a <- ggplot (mtcars) 
b <- geom_segment (x = 1:32, y = 0, aes (xend = 1:32, yend = mpg))
a   b
 

введите описание изображения здесь

Однако, когда я определяю аргумент xend вне функции aes(), это выглядит следующим образом.

 a <- ggplot (mtcars) 
b <- geom_segment (x = 1:32, y = 0, xend = 1:32, aes (yend = mpg))
a   b
 

введите описание изображения здесь

Мой вопрос в том, почему это не работает? Почему я могу определить x и y вне функции aes(), но не xend? Что означает новая диаграмма?

Ответ №1:

Итак, вкратце, цель aes() функции — связать эстетику с масштабами, чтобы их можно было отобразить. Это также причина colour = "blue" , по которой внешний цвет будет синим aes() , но будет отображен в дискретную цветовую шкалу, если вы поместите его внутрь aes() .

Масштабы, помимо прочего, измеряют пределы диапазона данных. Если вы определяете оба x и xend вне aes() и, следовательно, они не связаны напрямую со шкалой, измерение, которое будут выполнять шкалы, не увидит этих значений.

В приведенном ниже примере вы можете видеть, что использование этой стратегии дает вам масштаб x, который имеет ограничения по умолчанию, вместо ограничений, которые вы бы измеряли по данным.

 library(ggplot2)

a <- ggplot (mtcars) 
b <- geom_segment (x = 1:32, y = 0, xend = 1:32, aes (yend = mpg))
g <- a   b

sc <- layer_scales(g)
(sc$x$get_limits())
#> [1] 0 1
 

Создано 2020-12-10 пакетом reprex (версия 0.3.0)

Если вы поиграете еще немного, вы увидите, что вы можете определить geom_segment (aes(x = 1:32, yend =mpg), y = 0, xend = 1:32) , что не привязывает масштаб xend к масштабу, но в любом случае будет отображаться правильно из-за того, что масштаб видит x отображение.