作者andrew43 (讨厌有好心推文後删文者)
看板R_Language
标题Re: [问题] 特制Boxplot盒须图
时间Thu Mar 5 20:56:15 2015
首先,boxplot() 其实会回传一个物件,我叫 z 物件好了。
这个 z 物件本身是一个 list,里头就是 boxplot 的各种资讯。
像是 z$stat 就是各变数的 quantiles,z$name 是各变数的名称。
你可以观察看看 bx.p <- boxplot(split(rt(100, 4), gl(5, 20))) 的
bx.p 实际上是回传了什麽给你。
这个 z 物件可以自己建,就像建一个 list 一样。
然後再以 bxp(z物件) 画出一个 boxplot。
请看以下按你的需求设计的例子。
# 二组虚假资料
a <- c(1:100)
b <- c(50:1000)
# 建立 z 物件(本身是一个 list)
bxpObj <- list()
# 一定要有 bxpObj$stats 这项,里头是一个 matrix,
# 其中栏是变数,列是各 quantile,要有5列。
# 各 quantile 分别会被画成下底线、下盒线、中位线、上盒线和上底线。
bxpObj$stats <- rbind(
cbind(
quantile(a, c(0.1, 0.25, 0.5, 0.75, 0.9)),
quantile(b, c(0.1, 0.25, 0.5, 0.75, 0.9))
)
)
# bxpObj$name 这项就是变数名称
bxpObj$name <- c("a", "b")
# 重点来了:用 bxp() 画
bxp(bxpObj)
# 直接用 points() 补画你要求的 20% 和 80% quantile。
points(1, quantile(a, 0.2), pch=1) # a的20% quantile
points(1, quantile(a, 0.8), pch=2) # a的80% quantile
points(2, quantile(b, 0.2), pch=3) # b的20% quantile
points(2, quantile(b, 0.8), pch=4) # b的80% quantile
最後,如果你想自行改写成一个新的 function,也要视你的资料而定。
例如是 myboxplot(变数,组别) 还是 myboxplot(matrix) 的写法会不太一样。
但重点就是我前面写的:建一个 z 物件再喂 bxp() 吃下去就对了。
※ 引述《ming790925 (MING)》之铭言:
: [问题类型]:
: 程式谘询
: [软体熟悉度]:
: 使用者(已经有用R 做过不少作品)
: [问题叙述]:
: 我想画一个 boxplot 但不要内建那种,
: 因为我在意的是某几格特定的百分位数,
: 还有我不希望画出outliers
: 因为找了满久的 都没有找到能达到这样的套件
: 想请问各位是否有印象有什麽套件已经能完成?
: 举例来说:
: 除了中间的盒子外,我想要延伸出去到90% 10% quantile的值
: 并在80% 20%也加上标记
: 感激!!!!!
: [关键字]:
: boxplot quntile
--
http://apansharing.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.230.68.143
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1425560179.A.B7C.html
※ 编辑: andrew43 (125.230.68.143), 03/05/2015 21:00:12
※ 编辑: andrew43 (125.230.68.143), 03/05/2015 21:03:57
※ 编辑: andrew43 (125.230.68.143), 03/05/2015 21:04:51
1F:推 ming790925: 请问如果在80%画跟盒宽一样长的线,只能用segments吗? 03/05 22:18
2F:→ andrew43: 宽度是可以算的。 03/05 22:35
3F:→ andrew43: 请看看 ?bxp 里的 pars 参数里 *wex 这几项。 03/05 22:36
4F:→ andrew43: 但怎麽直接取得这个宽度,我就不知道了。 03/05 22:36
5F:→ andrew43: 例如 bxp(..., pars=list(boxwex = 1)) 可使盒子靠紧。 03/05 22:41
6F:→ andrew43: 此时,上例中,横轴的0.5--1.5就是宽度之范围。 03/05 22:43
7F:→ andrew43: boxwex预设是0.8,所以你应该能够算得预设的宽度范围。 03/05 22:44
8F:推 ming790925: 感恩! 03/05 22:50
9F:推 ming790925: 我又有一个小问题 03/08 15:35
10F:→ ming790925: 如果现在组data去画,ex: boxplot(a,b) 03/08 15:36
11F:→ ming790925: 他 a的x轴会在1 b的轴位子会在2. 如果我想改变这 03/08 15:36
12F:→ ming790925: 不知道有没有参数能改,我try了一阵子好想都没找到... 03/08 15:37
13F:→ ming790925: 好让我如果有很多组要两两笔较时候,让别人比较容易看 03/08 15:38
14F:→ ming790925: 麻烦了 感谢你!! 03/08 15:38
15F:推 ming790925: 感谢我找到那个参数了!!就是"at" 感谢你! 03/08 17:23