Ggplot: как нарисовать график с цветными столбцами?

Привет, ребята, мне нужно воспроизвести такой сюжет Разница в реальных зарплатах для каждого города

По оси x отложен код каждого города, а по оси y значения реальной заработной платы. На самом деле у меня есть две разные переменные для реальной заработной платы ( Real wage 1 и Real Wage 2 ). Реальная заработная плата 1 всегда больше, чем Реальная заработная плата 2, поэтому оранжевая часть столбцов должна представлять процентное увеличение по сравнению с Реальной заработной платой 1 (синяя часть).

Моя база данных примерно такая

#database
City Code   Real Wage 1    Real Wage 2
91          530            500
92          520            490
93          410            390
94          300            270
95          205            200
96          501            434
97          700            678
98          800            730   
99          900            820
100         740            700
101         590            560 
102         420            400
103         340            320
104         290            270   
105         120            100

Как мне это сделать? Я даже не знаю, можно ли с помощью ggplot2 перекрыть столбцы двух переменных или написать процент в оранжевой части каждого столбца.

ОБНОВЛЯТЬ Спасибо @Chamkrai за код. Кто-нибудь знает, как написать% разницы в каждом баре, как на картинке, которую я разместил?

ОБНОВЛЕНИЕ 2 Спасибо @r2evans за оставшуюся часть кода

ОБНОВЛЕНИЕ 3 (Я заменил переменную City Code на переменную Provincia, которая является символьной переменной, содержащей название каждого города).

ОБНОВЛЕНИЕ 4 Оно работает!! Я должен был использовать select перед мутацией!! СПАСИБО ВСЕМ

ОБНОВЛЕНИЕ 5

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

 df %>%
    filter( COD_PROV == 1 | COD_PROV == 6 | COD_PROV == 5 ) %>%
    select(`Provincia`,`Real Wage 1`,`Real Wage 2`) %>%
    mutate(pct = scales::percent((`Real Wage 1` - `Real Wage 2`) / `Real Wage 1`)) %>%
    pivot_longer(-c(`Provincia`, pct)) %>%
    group_by(`Provincia`) %>%
    mutate(pcty = sum(value)) %>%
    ggplot() +
    aes(x = reorder(`Provincia`, value), y = value, fill = name) +
    geom_col() +
    coord_flip() +
    geom_text(aes(label = pct, y = pcty), data = ~ subset(., name == "Real Wage 1"), hjust = 1.1)

Это сюжет, который я получаю: Сюжет

Учитывая, что разница нулевая, я должен получить только блю-бар... Я заметил, что скрипт рисует столбцы, суммирующие значения переменных Real Wage 1 и Real Wage 2, а затем разделяет результат в соответствии с их значениями (например, в случае «Торино» Реальная заработная плата 1 и Реальная заработная плата 2 имеют одинаковое значение. ( 15 и 15), следовательно, полоса из 30 разделена пополам: 15 синих и 15 красных). К сожалению, это не то, что я искал.... Учитывая, что обычно Real Wage 1 больше, чем Real Wage 2 в моем наборе данных, вместо этого мне нужна синяя полоса, представляющая Real Wage 2, а когда Real Wage 1 больше, чем Real Wage 2, часть красной полосы, которая покрывает разницу. Если нет разницы только синяя полоса. Я поместил картинку сюда, чтобы дать вам представление

Что я получаю

То, что я искал

Как я могу решить?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
library(tidyverse)

df %>% 
  pivot_longer(-City_Code) %>% 
  ggplot() + 
  aes(x = reorder(City_Code, value), y = value, fill = name) + 
  geom_col() + 
  coord_flip() 

Спасибо! у вас есть идеи, как поместить% разницы в каждом баре?

io_boh 04.02.2023 14:36

как вы установили переменные "значение" и "имя" из моей базы данных??

io_boh 04.02.2023 16:41

Чтобы добавить «%», добавьте mutate(pct = scales::percent((Real_Wage_2 - Real_Wage_1) / Real_Wage_1)) перед поворотом, а затем добавьте + geom_text(aes(label = pct), data = ~ subset(., name == "Real_Wage_1")), в результате чего получится i.stack.imgur.com/1AC0L.png . Вы можете использовать hjust=, чтобы сместить его влево/вправо от линии соединения. Если вы хотите сместить его в крайнее правое положение каждой горизонтальной полосы, то, возможно, вы можете выполнить пост-поворот group_by(City_Code) %>% mutate(pcty = sum(value)), а затем aes(label = pct, y = pcty) для i.stack.imgur.com/QJPdP.png.

r2evans 04.02.2023 16:49

привет @r2evans спасибо еще раз за ответ. Я думаю, что в коде чего-то не хватает или в отличие от моего набора данных... я отредактировал сообщение, чтобы вы могли видеть, что такое ответ R

io_boh 04.02.2023 17:11

Правильно, повернуться с помощью pivot_longer(-c(City_Code, pct)) вместо этого

r2evans 04.02.2023 17:13

@r2evans это работает! но я получаю все 13 переменных моего набора данных при заполнении столбцов... Как я могу иметь только «Реальную заработную плату 1» и «Реальную заработную плату 2»?

io_boh 04.02.2023 17:16

Вы не должны быть удивлены моим ответом на этот вопрос ... его нет в ваших примерных данных, поэтому я не совсем уверен, что у вас есть и что вы намереваетесь. Возможно, вам нужно select(City_Code, starts_with("Real_Wage")) в начале dplyr pipe (до поворота)?

r2evans 04.02.2023 17:17

@ r2evans, ты прав. У меня есть этот набор данных с 14 переменными и 106 наблюдениями. Мне нужно сделать график только с двумя последними, которые я назвал здесь для простоты «Реальная заработная плата 1» и «Реальная заработная плата 2» (на самом деле их настоящие имена «Реальная заработная плата» и «Заработная плата PPA»)

io_boh 04.02.2023 17:20

Хорошо, так что ... select только те, которые вы хотите построить перед поворотом. Разве это не решает проблему?

r2evans 04.02.2023 17:22

@ r2evans это правильный путь? mutate(pct = scales::percent((Salario Reale - PPA Salario) / Salario Reale)) %>% select(Salario Reale,PPA salario) %>% pivot_longer(-c(Provincia, pct)) %>%

io_boh 04.02.2023 17:28

потому что R отвечает <<Ошибка в build_longer_spec(): ! Невозможно создать подмножество несуществующих столбцов. ✖ Колонка Provincia не существует.>>

io_boh 04.02.2023 17:28

Переменная "Provincia" - это символьная переменная.... Для простоты я назвал ее "Код города". Я собираюсь обновить пост с ответом R

io_boh 04.02.2023 17:31

io_boh, я правда не знаю. Ответ, который предоставляет Чамкрай, решает вашу первую проблему, мой прилагаемый код поддерживает вторую, оба основанные на предоставленных вами примерах данных. Как правило, вы должны адаптировать код, основанный на ваших примерных данных, к вашим реальным данным.

r2evans 04.02.2023 17:35

@ r2evans, ты прав. Я пытался это сделать... Я только что загрузил свой код в исходное сообщение... Является ли эта проблема переменной "Provincia" (которая содержит имя, а не число)??

io_boh 04.02.2023 17:39

Я действительно не знаю, io_boh. Возможно, добавьте вывод из dput(head(df)) в свой вопрос.

r2evans 04.02.2023 17:40

@r2evans Это работает!! Я должен был использовать "выбрать" перед "мутировать"!! СПАСИБО

io_boh 04.02.2023 18:01

@ r2evans Я только что обнаружил, что скрипт делает не то, что я искал .... Я добавил ОБНОВЛЕНИЕ 5, чтобы объяснить проблему ... Вы можете мне помочь?

io_boh 04.02.2023 19:13

Нет, я думаю, что не могу: слишком много путаницы между кодами и «Торино», изменением имен столбцов и неконкретным «это то, что я хочу», основанным на совершенно других данных. io_boh, действительно трудно понять, что происходит, когда вы продолжаете переключаться между выборочными данными и реальными данными, отфильтрованными реальными данными и тому подобным.

r2evans 04.02.2023 23:37

Этот расширенный код основан на превосходном первом ответе @Chamkrai, пожалуйста, примите этот ответ. Я предлагаю это здесь для краткой ясности в комментариях.

df %>%
  mutate(pct = scales::percent((Real_Wage_2 - Real_Wage_1) / Real_Wage_1)) %>%
  pivot_longer(-c(City_Code, pct)) %>%
  group_by(City_Code) %>%
  mutate(pcty = sum(value)) %>%
  ggplot() +
  aes(x = reorder(City_Code, value), y = value, fill = name) +
  geom_col() +
  coord_flip() +
  geom_text(aes(label = pct, y = pcty), data = ~ subset(., name == "Real_Wage_1"), hjust = 1.1)

Другие вопросы по теме

Похожие вопросы

R: Легенда для geom_polygon() с одним значением
Как выбрать столбцы фрейма данных со значениями символов в R на основе значений столбца?
Объедините несколько CSV-файлов из разных папок, используя имена папок и файлов в качестве идентификаторов
Как я могу преобразовать свой код R в цикл и воспроизводимый скрипт?
Определение того, часто ли проходят определенные курсы вместе в течение семестра. R-анализ
Количество времени для подсчета строк для последовательности файлов с использованием Rcpp выше ожидаемого
Вычисление расстояния между конкретными строками, содержащимися в массиве в R
Преобразование набора данных из широкого в длинный с использованием pivot_longer, но возвращается ошибка, говорящая, что x не является вектором
Функция resample() в библиотеке R "terra" не работает должным образом в конкретной ситуации
Выберите две верхние строки на основе столбца и отобразите их в сводной таблице