加载中…
个人资料
ccpacer
ccpacer
  • 博客等级:
  • 博客积分:0
  • 博客访问:893,489
  • 关注人气:147
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

ggplot2画boxplot的学习和总结

(2015-12-01 22:00:30)
分类: R

ggplot2作为一个具有强大绘图功能的包,其使用范围相对广泛。很多人都是为了用它才开始学习R的(其实我指的是我自己)。

那么要用ggplot2,首先需要对数据格式进行转换,因为ggplot2只识别data frame(数据框)。数据框是一系列向量组成的,可以有不同的数据类型,比如字符串,因子,数字等,但是必须有同样的长度,否则就成为了列表。但是我们遇到的数据可能并不是典型的数据框,所以学习ggplot2之前应该学习reshape2的用法。其实就两个函数meltcast,并且通常我们只用melt就可以了。

要使用melt就需要reshape2这个包。

参考资料:

(1)http://www.zilhua.com/Rcourse/ggplot2.html

(2)http://docs.ggplot2.org/0.9.3.1/geom_boxplot.html

(3)http://www.cookbook-r.com/Graphs/Plotting_distributions_(ggplot2)/



library("reshape2")
mat1 <- matrix(runif(16),4);mat1


##        [,1]   [,2]   [,3]   [,4]
## [1,] 0.2673 0.2645 0.3610 0.2977
## [2,] 0.8609 0.5424 0.5742 0.2944
## [3,] 0.8371 0.6668 0.2764 0.3932
## [4,] 0.7899 0.3107 0.7623 0.5826


df1 <- melt(mat1);#矩阵转化为数据框
head(df1)


##   Var1 Var2  value
## 1    1    1 0.2673
## 2    2    1 0.8609
## 3    3    1 0.8371
## 4    4    1 0.7899
## 5    1    2 0.2645
## 6    2    2 0.5424


df2 <- data.frame(x1=runif(10),x2=rnorm(10),y=1:10);df2


##         x1       x2  y
## 1  0.58151  0.15814  1
## 2  0.06731 -0.42398  2
## 3  0.61796  1.43790  3
## 4  0.15082 -0.23791  4
## 5  0.30061 -1.83373  5
## 6  0.92706 -1.79223  6
## 7  0.08120 -0.01914  7
## 8  0.25702 -0.69151  8
## 9  0.25598 -2.04359  9
## 10 0.65348  1.23797 10


df2.slim <- melt(df2,id=3);df2.slim

 


##     y variable    value
## 1   1       x1  0.58151
## 2   2       x1  0.06731
## 3   3       x1  0.61796
## 4   4       x1  0.15082
## 5   5       x1  0.30061
## 6   6       x1  0.92706
## 7   7       x1  0.08120
## 8   8       x1  0.25702
## 9   9       x1  0.25598
## 10 10       x1  0.65348
## 11  1       x2  0.15814
## 12  2       x2 -0.42398
## 13  3       x2  1.43790
## 14  4       x2 -0.23791
## 15  5       x2 -1.83373
## 16  6       x2 -1.79223
## 17  7       x2 -0.01914
## 18  8       x2 -0.69151
## 19  9       x2 -2.04359
## 20 10       x2  1.23797

具体到我自己的数据来说,如下图所示:其中还包含了NaN(空值)

ggplot2画boxplot的学习和总结

要用ggplot2,则需要先把上述数据melt。但是由于我这里的表头有两行,也就是两类关键词的组合(一类是B/A, C/B, D/C, E/D, 一类是LFQ,MQ,PANDA),因此首先自己把这个矩阵转为单关键词的列表,如下所示:(我们暂时忽略含NaN的数据,只用前22行的数据),其实就是需要把某一类关键词从横排改为竖排,此时用melt之后会将剩下的一类关键词也竖排。

flag LFQ MQ PANDA
B/A 0.555453 6.68776 0.556743
B/A 0.659041 22.08908 4.677958
B/A 0.919295 1.276816 1.822468
B/A 1.037809 5.092131 1.64256
B/A 2.171829 3.847533 1.740213
B/A 2.362969 3.868363 5.494286
B/A 2.403145 4.058573 4.255197
B/A 2.51417 3.615853 5.818674
B/A 2.552152 10.72335 3.253154
B/A 2.745374 3.618914 4.897467
B/A 3.301005 9.265687 6.70443
B/A 3.392905 3.768219 6.287316
B/A 3.826588 10.50884 3.456734
B/A 3.974381 5.182199 2.970685
B/A 4.159787 4.140974 3.657225
B/A 4.308216 8.562157 6.076079
B/A 4.553871 5.299602 4.779004
B/A 4.576976 7.79729 2.50962
B/A 4.6693 4.863608 4.972427
B/A 5.004937 10.72318 4.698013
B/A 5.40506 10.0695 5.184903
B/A 6.069653 10.79059 1.302382
C/B 3.902091 4.745113 1.441969
C/B 6.574308 3.445539 3.674524
C/B 2.711133 2.478146 2.176673
C/B 3.22219 4.535173 3.535918
C/B 4.834217 3.27304 3.543664
C/B 2.594795 4.005382 3.792118
C/B 7.584027 3.545414 3.538637
C/B 3.118818 3.385945 3.165855
C/B 2.445268 2.428201 1.210269
C/B 3.841043 4.099999 3.495439
C/B 7.9802 3.106165 3.68028
C/B 4.765304 4.114436 3.876049
C/B 3.215212 2.607043 2.373022
C/B 3.565945 3.501021 2.385746
C/B 4.201793 4.70569 4.003987
C/B 3.360302 2.62787 2.862326
C/B 3.390694 3.071816 3.24156
C/B 7.379472 3.56967 2.789142
C/B 3.823474 3.597308 3.768713
C/B 3.45943 3.687404 2.407053
C/B 3.286729 3.234568 3.714577
C/B 3.79494 3.577284 2.061133
D/C 3.119096 3.838545 0.97915
D/C 1.660204 3.802431 3.143522
D/C 3.587823 4.76823 5.480517
D/C 6.000635 3.314998 3.398756
D/C 2.355977 3.268148 3.004729
D/C 5.644247 4.635748 5.422193
D/C 2.300619 2.920404 2.883632
D/C 7.128895 4.55269 3.492152
D/C 7.054363 8.517958 18.2161
D/C 2.278448 3.664664 4.379027
D/C 3.203586 4.659194 3.728079
D/C 2.919488 3.933745 3.603091
D/C 3.923736 6.524404 6.618993
D/C 3.690551 4.712325 4.17076
D/C 3.284069 4.848305 3.70429
D/C 3.421203 5.317381 5.144762
D/C 2.811181 4.574596 4.106441
D/C 2.599348 4.81509 3.996024
D/C 3.270222 3.866319 3.882258
D/C 7.294747 5.418865 4.560332
D/C 3.603735 4.060528 3.668704
D/C 3.634902 5.077522 3.533907
E/D 2.328997 3.970205 1.119457
E/D 2.778322 4.120182 4.376246
E/D 3.890716 4.973502 4.819771
E/D 1.453446 5.475188 4.583298
E/D 2.430761 2.558947 3.508924
E/D 3.303112 4.34496 4.509571
E/D 3.08537 3.079018 3.30776
E/D 3.468529 4.193507 4.47813
E/D 7.656994 5.388705 5.152169
E/D 2.99019 4.263651 4.025665
E/D 2.578198 4.030852 3.96822
E/D 2.663798 4.235488 3.986484
E/D 3.119392 4.649916 4.994367
E/D 2.991857 4.521596 4.245414
E/D 3.66113 4.784008 4.741553
E/D 3.668973 4.719544 4.31693
E/D 3.037549 4.066687 4.219817
E/D 2.964073 4.334195 4.12452
E/D 3.181051 3.674778 3.778444
E/D 3.554682 5.339055 4.900524
E/D 3.274021 4.257272 4.214073
E/D 3.196836 4.48544 4.128268

==============================================

将上述表格中的数据存为test.txt, 开始画图,代码如下:

ups<-read.delim("e:\\PANDA_20151028\\test.txt"); #读入为数据框

require(reshape2);

require(ggplot2);

ups.melt<-melt(ups,id.var="flag"); #melt之后整个ups.melt就是个竖排的列表

如下所示:

ggplot2画boxplot的学习和总结

===========下面才开始正式画图了==========================

(1) p<-ggplot(data=ups.melt, aes(x=flag,y=value))+geom_boxplot(aes(fill=variable)); #对应的图如下:

ggplot2画boxplot的学习和总结

p+ facet_wrap(~ variable, scales="free"); #分别把LFQ、MQ、PANDA画在三个boxplot中

ggplot2画boxplot的学习和总结

p+ facet_wrap(~ flag, scales="free"); #分别B/A, C/B, D/C, E/D把画在四个boxplot中

 

ggplot2画boxplot的学习和总结
==============================================================

参考资料:http://stackoverflow.com/questions/14604439/plot-multiple-boxplot-in-one-graph


p <- p + geom_jitter() #添加数据点

ggplot2画boxplot的学习和总结



p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title") #添加横纵坐标,添加title

p <- p + guides(fill=guide_legend(title="Legend_Title")) #添加图例title

ggplot2画boxplot的学习和总结

How to align geom_point() points to the center of box-plot? It could be done using position_dodge. This should work.(采用position_dodge对齐不同的subplot!)


p <- ggplot(data = df.m, aes(x=variable, y=value))

p <- p + geom_boxplot(aes(fill = Label)) 

p<-p+ facet_wrap(~ variable, scales="free")

# if you want color for points replace group with colour=Label 

p <- p + geom_point(aes(y=value, group=Label), position = position_dodge(width=0.75))

其它参考资料:http://stackoverflow.com/questions/14608422/box-plots-for-groups

待解决问题:

(1)如何调整坐标轴的大小?

(2)如何用包含NaN的数据画boxplot?

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有