我的数据结构如下:
msr_type <- c('Clinic','Hospital','Lab','Office')
result <- c(10.5, 21.9, 30.5, 14.5)
sec_q <- c(9.5, 15.2, 25, 9)
third_q <- c(11, 17, 34, 20)
four_q <- c(17, 25, 29, 25)
df_check <- data.frame(msr_type, result, sec_q, third_q, four_q)
将结果绘制成点是很容易的:
ggplot() + geom_point(data=df_check, aes(x=msr_type, y=result), colour="blue")
但是有没有办法使用geom_rect根据msr_type绘制四分位数,因为它是一个堆叠在彼此顶部的离散变量?
答案 0 :(得分:2)
根据您的需要,这里有两种可能的方法。不过,在任何一种情况下,我认为geom_col
会更容易。 (当你的x轴数据是离散的时,可以使用geom_rect
,但这不是最直接的。Example)
样本数据(我将实验室的Q3和Q4值切换为Q3的值更大,这没有意义):
msr_type <- c('Clinic','Hospital','Lab','Office')
result <- c(10.5, 21.9, 30.5, 14.5)
sec_q <- c(9.5, 15.2, 25, 9)
third_q <- c(11, 17, 29, 20)
four_q <- c(17, 25, 34, 25)
df_check <- data.frame(msr_type, result, sec_q, third_q, four_q)
方法1 (保持原始数据集的宽格式):
ggplot(df_check,
aes(x = msr_type)) +
geom_col(aes(y = four_q), fill = "slategray3") +
geom_col(aes(y = third_q), fill = "slategray2") +
geom_col(aes(y = sec_q), fill = "slategray1") +
geom_point(aes(y = result)) +
xlab("") + ylab("")
由于Q2&lt; = Q3&lt; = Q4,您可以简单地为每个四分位数创建一组条形图。覆盖他们。但如果你需要Q2 / Q3 / Q4的传奇,那就不那么简单......
方法2 (将数据集转换为长格式,以便所有四分位数值都在同一个变量中):
df_check2 <- df_check %>%
tidyr::gather(quartile, quartile.value, -msr_type, -result) %>%
mutate(quartile = factor(quartile, levels = c("sec_q", "third_q", "four_q")))
ggplot(df_check2,
aes(x = msr_type)) +
geom_col(aes(y = quartile.value, fill = quartile),
position = position_dodge(0), width = 2.5) +
geom_point(aes(y = result)) +
scale_fill_manual(values = c("slategray1", "slategray2", "slategray3")) +
xlab("") + ylab("")
默认情况下使用此方法创建图例。如果您有其他四分位数/十分位数/百分位数/等来绘制,它也会更灵活。