ggplot2: масштабирование по сравнению с преобразованием координат

avatar
Brigadeiro
8 августа 2021 в 20:43
53
1
1

Я понимаю различные между a scale и coord Преобразование в ggplot2 - это то, что масштабные преобразования выполняются до статистика вычисляется. Однако мне трудно понять это на реальном примере.

Пакеты

library(ggplot2)
library(gapminder)

Создать базовый график

base <- ggplot(data = gapminder,
               mapping = aes(x = year,
                             y = gdpPercap * pop,
                             color = continent)) +
  geom_line(stat = "summary")

enter image description here

Масштабное преобразование

base +
  scale_y_continuous(trans = "log10")

enter image description here

Преобразование координат

base +
  coord_trans(y = "log10")

enter image description here

coord_trans() приводит к правильному отображению данных, но я не понимаю почему.

Примечание: я видел этот вопрос и он не полностью помог

Источник

Ответы (1)

avatar
Jon Spring
9 августа 2021 в 04:20
1

Вот более простой пример, который должен помочь объяснить различия. Предположим, у нас есть два значения во фрейме данных, 1 и 10. Среднее из них равно 11/2 = 5,5.

my_data = data.frame(y = c(1, 10))
mean(my_data$y)
#[1] 5.5

Если мы возьмем логарифм (по основанию 10) из них, мы получим 0 и 1. Среднее логарифмическое значение равно (0+1)/2 = 0,5. Если мы преобразуем это обратно в исходный масштаб, мы получим 10 ^ 0,5 = 3,162. Таким образом, мы можем видеть, что десять к среднему по бревнам — это не то же самое, что и среднее; журнал «сжимает» большие значения, чтобы они меньше влияли на среднее значение.

log10(my_data$y)
#[1] 0 1
mean(log10(my_data$y))
#[1] 0.5
10^mean(log10(my_data$y))
#[1] 3.162278

Мы увидим то же самое, если построим это. Использование преобразования координат будет управлять окном просмотра и пространственным положением точек данных (например, обратите внимание, что высота по вертикали в пикселях от 5,00 до 5,25 немного больше, чем расстояние от 5,75 до 6,00 из-за логарифмического масштаба), но это не меняет точки данных — мы по-прежнему получаем среднее значение 5,5:

ggplot(my_data, aes(y = y, x = 1)) +
  geom_point(stat = "summary", fun = "mean") +
  coord_trans(y = "log10")

enter image description here

Но если мы переключимся на scale_y_log10, преобразование будет применено перед вычислением среднего значения, поэтому значение, которое мы получим, равно десяти среднему значению журналов, которое, как мы видели, не совпадает со средним арифметическим.

ggplot(my_data, aes(y = y, x = 1)) +
  geom_point(stat = "summary", fun = "mean") +
  scale_y_log10()

enter image description here