обратная гистограмма ggplot2

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть некоторые данные, которые выглядят следующим образом:

 value direction
2.2 UP
2.3 DOWN
2.4 UP
2.4 DOWN
2.5 DOWN
2.5 UP
2.5 DOWN
2.5 UP
2.6 DOWN
 

… и т.д.

Я использую ggplot2 в R и хочу создать обратную гистограмму. Я могу сделать оба по отдельности, используя scale_y_reverse() …. Но это не то, что мне нужно.

Мне нужно составить обратный график, чтобы все значения «ВНИЗ» находились на отрицательной оси y, а значения «ВВЕРХ» — на положительной оси y. Ось x — это столбец «значение», а ось y — количество значений ВВЕРХ или ВНИЗ в этом диапазоне.

Кто-нибудь может помочь с этим? Таким образом, значения ВНИЗ подсчитываются в отрицательном направлении..

Любая помощь приветствуется. Спасибо.

Комментарии:

1. Преобразовать все отрицательные значения в отрицательные? data$value <- ifelse(data$direction=="DOWN",-1*value, value)

2. Какие-либо обновления по этому вопросу или фрагмент, отсутствующий в приведенном ниже ответе?

3. Извините за поздний ответ. Я смог создать код, который работает с помощью аналитика, который создал пример графика, который я хотел воспроизвести. В принципе, я создал 3 столбца в Excel — один со всеми значениями, один со значениями ВВЕРХ и один со значениями ВНИЗ. Оттуда я создал разрывы, используя столбец со всеми значениями, гистограмму ВВЕРХ и гистограмму ВНИЗ с уменьшением количества (-DOWN.hist $ counts) и УВЕЛИЧЕНИЕМ (UP.hist $ counts). Затем использование функции plot очень эффективно объединило два графика.

4. Если кто-то заинтересован и хотел бы увидеть код, дайте мне знать. Это был долгий процесс проб и ошибок. Спасибо всем за помощь! -Клэр Дж.

Ответ №1:

Я думаю, что самый простой способ сделать это — самостоятельно вычислить ячейки, а затем поменять знак для них.

Во-первых, некоторые образцы данных, которые достаточно велики, чтобы продемонстрировать эффект:

 testData <-
  data.frame(
    value = rnorm(1000, 10, 2)
    , direction = sample(c("UP","DOWN")
                         , 1000
                         , TRUE)
  )
 

Затем cut переместите данные в ячейки по вашему выбору и измените значения, чтобы они были отрицательными для одной из групп. (с использованием dplyr и magrittr )

 toPlot <-
  testData %>%
  mutate(bin = cut(value, pretty(value, 20))) %$%
  table(bin, direction) %>%
  as.data.frame() %>%
  mutate(plotVal = ifelse(direction == "DOWN"
                          , -1*Freq
                          , Freq))
 

Затем передайте этот data.frame ggplot , и вы должны получить то, что хотите. (Обратите внимание, что для этого используется версия разработчика ggplot2 , которую вам может потребоваться использовать geom_bar(stat = "identity") вместо geom_col , если вы используете стабильную версию).

 toPlot %>%
  ggplot(aes(x = bin
             , y = plotVal
             , fill = direction))  
  geom_col()
 

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

Очевидно, что очистите метки и цвета в соответствии с вашими интересами.

В качестве последнего замечания, в зависимости от вашего варианта использования, вы можете подумать, действительно ли этот подход «back-to-back» является тем, что вам нужно. Это очень затрудняет сравнение высот столбцов.

Комментарии:

1. Извините за поздний ответ. Я смог создать код, который работает с помощью аналитика, который создал пример графика, который я хотел воспроизвести. В принципе, я создал 3 столбца в Excel — один со всеми значениями, один со значениями ВВЕРХ и один со значениями ВНИЗ. Оттуда я создал разрывы, используя столбец со всеми значениями, гистограмму ВВЕРХ и гистограмму ВНИЗ с уменьшением количества (-DOWN.hist $ counts) и УВЕЛИЧЕНИЕМ (UP.hist $ counts). Затем использование функции plot очень эффективно объединило два графика.

2. Если кто-то заинтересован и хотел бы увидеть код, дайте мне знать. Это был долгий процесс проб и ошибок. Спасибо всем за помощь! -Клэр Дж.

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

4. Нет, с вашим ответом проблем не было. Это было тщательно и весьма полезно для понимания. Я пытался использовать ggplot с учетом вашего ответа, но обнаружил, что hist и plot проще. Если у меня будет больше времени в ближайшем будущем, я планирую снова попробовать с ggplot.

5. Спасибо за ваш ответ! Можете ли вы сдвинуть два графика по вертикали (т. Е. Как добавить вертикальный пробел между ними), чтобы получить фигуру, подобную рисунку 1 из этой статьи ( link.springer.com/article/10.1007/s00426-018-1112-6 )?