R语言绘制概率密度图

R语言绘制概率密度图

leengsmile
2016年9月24日

本文源于在高斯混合模型估计中,绘制概率密度图的方法。一般而言,在R语言中,可以使用ggplot2绘制常见的统计图形,本文的方式稍微有所不同,先介绍lattice如何绘制概率密度图,然后再介绍通过ggplot2如何绘制概率密度图。

为了可以重复本文的数据,先设置随机数种子

set.seed(123)

加载magrittr包,以管道形式操作数据流。

require(magrittr)

首先产生如下的一组数据

n <- 1000
mean_s <- c(1, 7)
y <- sample(c("head", "tail"), size = n, replace = TRUE, prob = c(0.25, 0.75))
x <- rnorm(n = 1000, mean = mean_s[1])
tails <- y %in% c("tail")
x[tails] <- rnorm(sum(tails), mean = mean_s[2])

data <- data.frame(x = x, y = y)

这是有服从均值分别为17的正态分布随机变量构成的混合变量。在进行数据分析时,可以先查看数据的分布,这里通过lattice包产看数据的概率密度分布

首先引入lattice

require(lattice)

然后调用densityplot绘制相应的函数

densityplot(~x, data = data, par.settings = list(plot.symbol = list(col = factor(data$y))))
density-plot-1.png

其中par.settings用以将不同混合成分产生的数据用不同颜色的图形表示。par.settings接受由name = value构成的list,可以接收的name可以通过trellis.par.get获取

trellis.par.get() %>% names()
##  [1] "grid.pars"         "fontsize"          "background"       
##  [4] "panel.background"  "clip"              "add.line"         
##  [7] "add.text"          "plot.polygon"      "box.dot"          
## [10] "box.rectangle"     "box.umbrella"      "dot.line"         
## [13] "dot.symbol"        "plot.line"         "plot.symbol"      
## [16] "reference.line"    "strip.background"  "strip.shingle"    
## [19] "strip.border"      "superpose.line"    "superpose.symbol" 
## [22] "superpose.polygon" "regions"           "shade.colors"     
## [25] "axis.line"         "axis.text"         "axis.components"  
## [28] "layout.heights"    "layout.widths"     "box.3d"           
## [31] "par.xlab.text"     "par.ylab.text"     "par.zlab.text"    
## [34] "par.main.text"     "par.sub.text"

所绘制的概率密度图有plot.symbol控制,可以通过一个list参数列表指定。plot.symbol可以接受的参数通过向trellis.par.get传入"plot.symbol"即可。

trellis.par.get("plot.symbol")
## $alpha
## [1] 1
## 
## $cex
## [1] 0.8
## 
## $col
## [1] "#0080ff"
## 
## $font
## [1] 1
## 
## $pch
## [1] 1
## 
## $fill
## [1] "transparent"

在这里通过col指定不同的混合成分指定不同的颜色,在data数据中,不同的混合成分,通过y变量可以获取。因此将data$y赋值给col

可以通过plot.symbol指定图形的类型

densityplot(~x, data = data, par.settings = list(plot.symbol = list(col = factor(data$y),
                                                                    pch = 25, 
                                                                    alpha = 0.4)
                                                 
                                                 
                                                 )
)
unnamed-chunk-7-1.png

下面在来看看ggplot2中如何绘制类似的图。

首先引入ggplot2

require(ggplot2)

然后通过geom_density来绘制概率密度图

ggplot(data, aes(x = x)) + geom_density(colour = "cadetblue3")
unnamed-chunk-9-1.png

基本的图形已经出来,但是有以下几个问题

  1. 密度曲线下方有条直线。
  2. 没有原始数据的分布情况。类似于densityplot中的各个数据点,根据这些数据点,可以直观的判断数据的分布情况。

下面依次解决相应的问题

首先去除概率密度图下方的直线,可以使用geom_line,并制定stat = "density",可以参见[1]

ggplot(data, aes(x = x)) + geom_line(colour = "cadetblue3", stat = "density")
unnamed-chunk-10-1.png

下一步要标记原始数据,在ggplot2中,我觉得更适合用geom_rug来表示原始数据的分布情况。<span style="col:red">2016年9月24日<span>

ggplot(data, aes(x = x)) + geom_line(colour = "cadetblue3", stat = "density") +
    geom_rug(aes(colour = y), sides = "b")
unnamed-chunk-11-1.png

当然,也可以绘制与densityplot类似的图形

ggplot(data, aes(x = x)) + geom_line(colour = "cadetblue3", stat = "density") +
    geom_point(aes(y = 0, colour = y), shape = 25, alpha = 0.4, size = 4) +
    theme(legend.position = "none")
unnamed-chunk-12-1.png

参考文献

[1]. http://stackoverflow.com/questions/21600754/ggplot2-and-geom-density-how-to-remove-baseline

[2]. http://stackoverflow.com/questions/14604435/turning-off-some-legends-in-a-ggplot

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容