2016-04-15 72 views
2

我有一些数据我想要可视化,并且我可以在左侧创建图表,但是我希望能够通过x轴提供更多信息给观察者实现如右图所示的功能:基于预定义的范围着色,以及每个范围的面积百分比。 enter image description here基于x轴改变ggplot2中的密度图的颜色

我认识到这个问题类似于这两个答案,但我不明白的密度足以让正确的格式数据帧:

这里是复制我的例子的代码。

如果可以,请在您的回复中使用dplyr。

预先感谢您。

library(dplyr) 
library(ggplot2) 
options(scipen = 999) 

#Get percentages 
    diamonds%>% 
    mutate(Cut = cut, 
      Prices = cut(price, 
         breaks=c(0,2499,4999, 19000), 
         include.lowest=T, dig.lab=10))%>% 
    group_by(Cut, Prices)%>% 
     summarise(Count = n())%>% 
    group_by(Cut)%>% 
     mutate(Pct = round(Count/sum(Count), 2))%>% 
    ungroup() 


#Plot 
    ggplot(diamonds, aes(x=price))+ 
    geom_density(fill="grey50")+ 
    facet_grid(cut~.)+ 
    geom_vline(xintercept = c(2500,5000))+ 
    theme(axis.text.y = element_blank(), 
      axis.ticks.y = element_blank()) 
+1

密度数据没有经过处理步骤和了'你是管道diamonds'数据之间没有任何联系'ggplot'调用。 – shekeine

回答

1

的问题是,你不必在diamondsdata.frame密度数据。你面对的另一个问题是你需要保持方面的信息。我不知道如何通过cut获得dplyr,并得到density()。你可以像你一样生成汇总数据,但为了制作一个密度图,你需要每个点的x,y信息。

一个解决办法,我发现正在密度图p这样

p<-ggplot(diamonds,aes(x=price))+geom_density()+facet_wrap(~cut,nrow=5) 

然后尤斯ggplot_build函数来获得正在绘制的数据

pg <- ggplot_build(p) 

这让你一个列表,其中的第一个元素是实际数据集

pg_data<-data.frame(pg$data[[1]],stringsAsFactors = F) 

你可以检查你是否在在y栏感兴趣(这与密度相同)x将成为价格,PANEL将成为方面。我没有改变这个因素模式,好,很好......但我猜你可以。

head(pg_data) 
       y  x  density scaled  count n PANEL group 
1 0.00005370272 326.0000 0.00005370272 0.2756038 0.08646139 1610  1 -1 
2 0.00005829975 362.1977 0.00005829975 0.2991959 0.09386259 1610  1 -1 
3 0.00006307436 398.3953 0.00006307436 0.3236993 0.10154972 1610  1 -1 
4 0.00006798165 434.5930 0.00006798165 0.3488836 0.10945045 1610  1 -1 
5 0.00007298816 470.7906 0.00007298816 0.3745772 0.11751094 1610  1 -1 
6 0.00007807049 506.9883 0.00007807049 0.4006598 0.12569348 1610  1 -1 
    ymin   ymax fill weight colour alpha size linetype 
1 0 0.00005370272 NA  1 black NA 0.5  1 
2 0 0.00005829975 NA  1 black NA 0.5  1 
3 0 0.00006307436 NA  1 black NA 0.5  1 
4 0 0.00006798165 NA  1 black NA 0.5  1 
5 0 0.00007298816 NA  1 black NA 0.5  1 
6 0 0.00007807049 NA  1 black NA 0.5  1 

现在我们可以重新绘制的一切,但使用我们需要

ggplot(data=pg_data,aes(x,y))+geom_line()+facet_wrap(~PANEL,nrow=5)+geom_area(data=subset(pg_data,x>2499&x<5000),aes(x,y),fill = "red", alpha = 0.5) 

enter image description here

+0

哇,非常感谢!我从你的回答中学到了很多东西。 – yake84