如何在X中将x轴拆分为十分位并制作ggplot

时间:2018-01-05 20:48:38

标签: r ggplot2 quantile

您好我想知道如何将X轴拆分为R中的十分位并制作ggplot?

我目前有年龄范围数据和NO2污染数据。这两个数据集共享名为ward的相同地理参考。我希望将我的人口统计数据绘制在相同数量的病房(总计298)的分位数中。

My Table

我在R中尝试了分位数回归,我使用了以下内容:

library(SparseM) 
library(quantreg)
mydata<- read.csv("M:/Desktop10/Test2.csv") 
attach(mydata) 
Y <- cbind(NO2.value)
X <- cbind(age.0.to.4, age..5.to.9, age.10.to.14, age.15.to.19, age.20.to.24, age.25.to.29, age.30.to.44, age.45.to.59, age.60.to.64, age.65.to.74, age.75.to.84, age.85.to.89, age.above.90) 
quantreg.all <- rq(Y ~ X, tau = seq(0.05, 0.95, by = 0.05), data=mydata) 
quantreg.plot <- summary(quantreg.all) 
plot(quantreg.plot) 

但我得到的并不是我所期望的,因为y轴不是NO2数据。

附上理想情节:

ideal plot

非常感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,我认为cut函数与quantile函数结合将创建十进制。这是假数据的一个例子。

在下面的代码中,我们使用cut函数将数据拆分为十进制,我们使用quantile函数为breaks设置cut参数。这告诉cut将数据分组为10个相同大小的组,从最小值NO2到最大值。

group_by(age)表示我们为每个age组分别创建十分位数。这意味着在给定年龄组中每个十分位数内的受试者数量相等,但每个十分位数的NO2临界值对于不同年龄组是不同的。要在整个数据上创建十分位数,只需删除group_by(age)即可。这将导致所有年龄组的每个十分位数的NO2截止值相同,但在给定年龄组中,每个十分位数中的受试者数量将不相同。

library(tidyverse)

# Fake data
set.seed(2)
dat = data.frame(NO2=c(runif(600, 0, 10), runif(400, 1, 11)), 
                 age=rep(c("0-10","11-20"), c(600,400)))

# Create decile groups
dat = dat %>% 
  group_by(age) %>% 
  mutate(decile = cut(NO2, breaks=quantile(NO2, probs=seq(0,1,0.1)), 
                      labels=10:1, include.lowest=TRUE),
         decile = fct_rev(decile))

现在我们使用ggplot2进行绘图。 stat_summary函数返回每个decile组中每个age的均值。

ggplot(dat, aes(decile, NO2, colour=age, group=age)) +
  stat_summary(fun.y=mean, geom="line") +
  stat_summary(fun.y=mean, geom="point") +
  expand_limits(y=0) +
  theme_bw()

enter image description here