Привет, ребята, мне нужно воспроизвести такой сюжет Разница в реальных зарплатах для каждого города
По оси 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
, часть красной полосы, которая покрывает разницу. Если нет разницы только синяя полоса. Я поместил картинку сюда, чтобы дать вам представление
Как я могу решить?
library(tidyverse)
df %>%
pivot_longer(-City_Code) %>%
ggplot() +
aes(x = reorder(City_Code, value), y = value, fill = name) +
geom_col() +
coord_flip()
как вы установили переменные "значение" и "имя" из моей базы данных??
Чтобы добавить «%», добавьте 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 спасибо еще раз за ответ. Я думаю, что в коде чего-то не хватает или в отличие от моего набора данных... я отредактировал сообщение, чтобы вы могли видеть, что такое ответ R
Правильно, повернуться с помощью pivot_longer(-c(City_Code, pct))
вместо этого
@r2evans это работает! но я получаю все 13 переменных моего набора данных при заполнении столбцов... Как я могу иметь только «Реальную заработную плату 1» и «Реальную заработную плату 2»?
Вы не должны быть удивлены моим ответом на этот вопрос ... его нет в ваших примерных данных, поэтому я не совсем уверен, что у вас есть и что вы намереваетесь. Возможно, вам нужно select(City_Code, starts_with("Real_Wage"))
в начале dplyr pipe (до поворота)?
@ r2evans, ты прав. У меня есть этот набор данных с 14 переменными и 106 наблюдениями. Мне нужно сделать график только с двумя последними, которые я назвал здесь для простоты «Реальная заработная плата 1» и «Реальная заработная плата 2» (на самом деле их настоящие имена «Реальная заработная плата» и «Заработная плата PPA»)
Хорошо, так что ... select
только те, которые вы хотите построить перед поворотом. Разве это не решает проблему?
@ r2evans это правильный путь? mutate(pct = scales::percent((Salario Reale
- PPA Salario
) / Salario Reale
)) %>% select(Salario Reale
,PPA salario
) %>% pivot_longer(-c(Provincia
, pct)) %>%
потому что R отвечает <<Ошибка в build_longer_spec()
: ! Невозможно создать подмножество несуществующих столбцов. ✖ Колонка Provincia
не существует.>>
Переменная "Provincia" - это символьная переменная.... Для простоты я назвал ее "Код города". Я собираюсь обновить пост с ответом R
io_boh, я правда не знаю. Ответ, который предоставляет Чамкрай, решает вашу первую проблему, мой прилагаемый код поддерживает вторую, оба основанные на предоставленных вами примерах данных. Как правило, вы должны адаптировать код, основанный на ваших примерных данных, к вашим реальным данным.
@ r2evans, ты прав. Я пытался это сделать... Я только что загрузил свой код в исходное сообщение... Является ли эта проблема переменной "Provincia" (которая содержит имя, а не число)??
Я действительно не знаю, io_boh. Возможно, добавьте вывод из dput(head(df))
в свой вопрос.
@r2evans Это работает!! Я должен был использовать "выбрать" перед "мутировать"!! СПАСИБО
@ r2evans Я только что обнаружил, что скрипт делает не то, что я искал .... Я добавил ОБНОВЛЕНИЕ 5, чтобы объяснить проблему ... Вы можете мне помочь?
Нет, я думаю, что не могу: слишком много путаницы между кодами и «Торино», изменением имен столбцов и неконкретным «это то, что я хочу», основанным на совершенно других данных. io_boh, действительно трудно понять, что происходит, когда вы продолжаете переключаться между выборочными данными и реальными данными, отфильтрованными реальными данными и тому подобным.
Этот расширенный код основан на превосходном первом ответе @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)
Спасибо! у вас есть идеи, как поместить% разницы в каждом баре?