#r #ggplot2
#r #ggplot2
Вопрос:
Как добавить строку с общим количеством людей (или, что еще лучше, затенить область под этой линией в качестве фона) к каждому графику, создаваемому:
library(ggplot2)
library(readxl)
library(dplyr)
library(RColorBrewer)
dataset %>%
ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))
geom_col()
facet_wrap(~ office)
scale_fill_brewer(palette = "RdYlGn")
theme_classic()
theme(
strip.background = element_blank(),
strip.text.x = element_blank()
)
Я перепробовал много версий geom_hline, но ни одна из них не работала.
Мой набор данных:
region office Nr_Individuals total_Nr_Individuals PovertyDecile weighted_PovDecile
1 A 80 105 2 2.5
1 A 23 105 3 2.5
1 B 2 105 4 4
2 C 100 160 1 1.5
2 C 60 160 2 1.5
3 D 20 70 8 9
3 D 50 70 10 9
Ответ №1:
Попробуйте этот подход geom_segment()
и задайте стиль полос леденцов для вашего графика следующим образом:
library(ggplot2)
#Code
df %>%
ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))
geom_col()
geom_segment(aes(x=factor(PovertyDecile),xend=factor(PovertyDecile),yend=total_Nr_Individuals))
geom_point(aes(x=factor(PovertyDecile),y=total_Nr_Individuals,fill=factor(PovertyDecile)),
shape=21,show.legend = F)
facet_wrap(~ office)
scale_fill_brewer(palette = "RdYlGn")
theme_classic()
theme(
strip.background = element_blank(),
strip.text.x = element_blank()
)
Вывод:
Некоторые используемые данные:
#Data
df <- structure(list(region = c(1L, 1L, 1L, 2L, 2L, 3L, 3L), office = c("A",
"A", "B", "C", "C", "D", "D"), Nr_Individuals = c(80L, 23L, 2L,
100L, 60L, 20L, 50L), total_Nr_Individuals = c(105L, 105L, 105L,
160L, 160L, 70L, 70L), PovertyDecile = c(2L, 3L, 4L, 1L, 2L,
8L, 10L), weighted_PovDecile = c(2.5, 2.5, 4, 1.5, 1.5, 9, 9)), class = "data.frame", row.names = c(NA,
-7L))
Вы можете обмануть сегменты над каждой строкой, используя следующий код:
#Code 2
df %>%
ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))
geom_errorbar(aes(x=factor(PovertyDecile),
y=total_Nr_Individuals,ymin=total_Nr_Individuals,
ymax=total_Nr_Individuals,color=factor(PovertyDecile)))
geom_col()
facet_wrap(~ office)
scale_fill_brewer(palette = "RdYlGn")
scale_color_brewer(palette = "RdYlGn")
theme_classic()
theme(
strip.background = element_blank(),
strip.text.x = element_blank()
)
Вывод:
И для затененного стиля вы можете использовать этот трюк с другими geom_col()
, но корректирующими alpha
:
#Code 3
df %>%
ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))
geom_errorbar(aes(x=factor(PovertyDecile),
y=total_Nr_Individuals,ymin=total_Nr_Individuals,
ymax=total_Nr_Individuals,color=factor(PovertyDecile)))
geom_col(aes(x=factor(PovertyDecile),
y=total_Nr_Individuals,
fill=factor(PovertyDecile)),alpha=0.5)
geom_col()
facet_wrap(~ office)
scale_fill_brewer(palette = "RdYlGn")
scale_color_brewer(palette = "RdYlGn")
theme_classic()
theme(
strip.background = element_blank(),
strip.text.x = element_blank()
)
Вывод:
Обновить:
#Code 4
df %>%
ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))
geom_errorbar(aes(x=factor(PovertyDecile),
y=total_Nr_Individuals,ymin=total_Nr_Individuals,
ymax=total_Nr_Individuals))
geom_col(aes(x=factor(PovertyDecile),
y=total_Nr_Individuals
),alpha=0.6,fill='gray')
geom_col()
facet_wrap(~ office)
scale_fill_brewer(palette = "RdYlGn")
theme_classic()
theme(
strip.background = element_blank(),
strip.text.x = element_blank()
)
Вывод:
Для непрерывной строки:
#Code 5
df %>%
ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))
geom_hline(aes(yintercept=total_Nr_Individuals))
geom_col(aes(x=factor(PovertyDecile),
y=total_Nr_Individuals
),alpha=0.6,fill='gray')
geom_col()
facet_wrap(~ office)
scale_fill_brewer(palette = "RdYlGn")
scale_color_brewer(palette = "RdYlGn")
theme_classic()
theme(
strip.background = element_blank(),
strip.text.x = element_blank()
)
Вывод:
Комментарии:
1. Большое спасибо, Дак, это довольно круто, но у меня много «офисов», поэтому может быть непонятно видеть их все с этими точками… Я пытался найти способ построить линию или затенить область под линией в качестве фона для каждого «офиса» — есть мысли о том, как этого добиться?
2. @DanielaRodrigues Вы имеете в виду горизонтальную линию для каждого столбца?
3. горизонтальная линия с total_Nr_Individuals для каждого «офиса», поэтому над всеми столбцами. В идеале я хотел бы заштриховать область под линией до оси x.. не уверен, возможно ли это?
4. Это именно то, что мне было нужно — большое спасибо. В последний момент, я изменил #2 кода, чтобы получить черную линию, так что у меня есть: «scale_color_manual(values=c(«black»,»black»,»black»,»black»,»black»,»black»,»black»,»black»,»black»,»black»))» Как я могу изменить цвет оттенков на просто серый?
5. @DanielaRodrigues Я добавил дополнительное обновление для задачи, которую вы ищете. Надеюсь, это поможет!