Дополнительная ось x на ggplot - PullRequest
0 голосов
/ 04 августа 2020

Я знаю, что есть похожие сообщения, но я не смог заставить эти ответы работать в моем случае.

например, Здесь и здесь .

Пример:

diamonds %>% 
  ggplot(aes(scale(price) %>% as.vector)) +
  geom_density() +
  xlim(-3, 3) +
  facet_wrap(vars(cut))

Возвращает график: введите описание изображения здесь

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

Я хотел бы добавить строку под эквивалентным немасштабированным необработанным номер, соответствующий каждому.

Попытка:

diamonds %>% 
  ggplot(aes(scale(price) %>% as.vector)) +
  geom_density() +
  xlim(-3, 3) +
  facet_wrap(vars(cut)) +
  geom_text(aes(label = price))

Дает:

Ошибка: geom_text требует следующей недостающей эстетики: y

Мой основной вопрос: как добавить необработанные значения под -3: 3 каждого разрыва? Я не хочу менять эти перерывы, я все еще хочу 6 перерывов между -3: 3.

Второй вопрос, как я могу получить -3 и 3, чтобы они действительно отображались в диаграмме? Они были обрезаны.

[edit] Я пытался заставить его работать с geom_text, но продолжаю выдавать ошибки:

diamonds %>% 
  ggplot(aes(x = scale(price) %>% as.vector)) +
  geom_density() +
  xlim(-3, 3) +
  facet_wrap(vars(cut)) +
  geom_text(label = price)

Ошибка в слое (data = data, mapping = mapping, stat = stat, geom = GeomText,: object 'price' not found

Затем я попытался изменить свой вызов на geom_text()

  geom_text(data = diamonds, aes(price), label = price)

Это приводит к тому же сообщению об ошибке.

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

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

labeller <- function(x) {
  paste0(x,"\n",  scales::dollar(sd(diamonds$price) * x + mean(diamonds$price)))
}

diamonds %>% 
  ggplot(aes(scale(price) %>% as.vector)) +
  geom_density() +
  geom_vline(aes(xintercept = -0.98580251364833), linetype = 2) +
  facet_wrap(vars(cut)) +
  scale_x_continuous(label = labeller, limits = c(-3, 3)) +
  xlab("price")

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

1 голос
/ 04 августа 2020

Мы можем использовать функциональность sec_axis в scale_x_continuous. Чтобы использовать эту функцию, нам необходимо вручную масштабировать ваши данные. Это добавит вторичную ось вверху графика, а не внизу. Так что это не совсем точно то, что вы ищете.

library(tidyverse)
# manually scale the data
mean_price <- mean(diamonds$price)
sd_price <- sd(diamonds$price)
diamonds$price_scaled <- (diamonds$price - mean_price) / sd_price
# make the plot
ggplot(diamonds, aes(price_scaled))+
geom_density()+
facet_wrap(~cut)+
scale_x_continuous(sec.axis = sec_axis(~ mean_price + (sd_price * .)),
                   limits = c(-3, 4), breaks = -3:3)

Вы можете немного обмануть, передав некоторые фиктивные данные на geom_text:

geom_text(data = tibble(label = round(((-3:3) * sd_price) + mean_price),
                            y = -0.25,
                            x = -3:3),
              aes(x, y, label = label))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...