ggplot2 geom_rect绘制四分位数堆叠数据点和离散x轴

时间:2017-08-25 17:05:36

标签: r ggplot2

我的数据结构如下:

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")

enter image description here

但是有没有办法使用geom_rect根据msr_type绘制四分位数,因为它是一个堆叠在彼此顶部的离散变量?

1 个答案:

答案 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的传奇,那就不那么简单......

Approach 1

方法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("")

默认情况下使用此方法创建图例。如果您有其他四分位数/十分位数/百分位数/等来绘制,它也会更灵活。

Approach 2