#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 )?