通过一个综合的例子测试绘图函数
学习的内容是tigerfish老师的教程。
第一节:基本知识
用seq函数产生100位学生的学号。
> num = seq(201321001,201321100)> num [1] 201321001 201321002 201321003 201321004 201321005 201321006 201321007 201321008 [9] 201321009 201321010 201321011 201321012 201321013 201321014 201321015 201321016 [17] 201321017 201321018 201321019 201321020 201321021 201321022 201321023 201321024 [25] 201321025 201321026 201321027 201321028 201321029 201321030 201321031 201321032 [33] 201321033 201321034 201321035 201321036 201321037 201321038 201321039 201321040 [41] 201321041 201321042 201321043 201321044 201321045 201321046 201321047 201321048 [49] 201321049 201321050 201321051 201321052 201321053 201321054 201321055 201321056 [57] 201321057 201321058 201321059 201321060 201321061 201321062 201321063 201321064 [65] 201321065 201321066 201321067 201321068 201321069 201321070 201321071 201321072 [73] 201321073 201321074 201321075 201321076 201321077 201321078 201321079 201321080 [81] 201321081 201321082 201321083 201321084 201321085 201321086 201321087 201321088 [89] 201321089 201321090 201321091 201321092 201321093 201321094 201321095 201321096 [97] 201321097 201321098 201321099 201321100
用runif函数产生100个随机数(随机数是小数),代表课程1的成绩,100个数字,最小值50,最大值100。
该结果是均匀分布,用round函数对其取整。
> x1 = round(runif(100,min=50,max=100));
> x1 [1] 85 68 69 92 76 67 90 82 98 68 98 68 80 74 75 90 78 52 55 75 91 63 99 89 93 85 65 [28] 79 55 89 98 83 56 73 75 56 90 70 82 68 62 90 78 83 81 95 63 98 79 89 59 56 60 69 [55] 68 93 85 65 64 68 73 97 86 88 93 71 65 71 82 70 63 76 60 97 92 78 99 54 50 79 74 [82] 85 58 92 80 64 50 64 95 83 91 73 87 79 85 85 67 51 70 93
用rnorm函数产生正态分布数字,代表课程2的成绩,平均值是80,标准差是7。再用round函数对其取整。
> x2 = round(rnorm(100,mean=80,sd=7))> x2 [1] 86 76 85 86 82 67 81 77 80 72 80 81 85 81 82 76 89 89 80 73 78 65 88 81 86 82 79 [28] 75 76 81 89 79 82 78 81 91 93 82 72 70 86 77 83 77 74 82 85 84 77 68 89 72 75 71 [55] 76 74 75 87 81 79 81 76 72 84 76 83 91 72 75 81 87 81 83 73 80 81 76 89 85 93 73 [82] 80 88 81 87 95 87 88 81 81 78 75 81 79 78 87 75 76 86 86
用rnorm函数产生正态分布数字,代表课程3的成绩,平均值是90,标准差是14。再用round函数对其取整。
> x3 = round(rnorm(100,mean=90,sd=14))> x3 [1] 45 89 87 78 88 87 104 72 82 103 73 77 113 80 51 79 94 80 99 75 [21] 86 92 71 57 78 61 99 90 81 84 100 100 88 73 98 80 106 89 74 56 [41] 75 93 97 103 64 87 120 94 79 102 100 88 77 75 87 100 73 104 64 99 [61] 93 94 70 77 102 99 112 104 92 105 76 96 78 101 75 82 91 113 101 114 [81] 69 84 102 92 92 79 103 97 97 113 74 107 81 102 76 103 87 83 70 77
从上面可以看到一些数字大于100,为了使得每个数字都小于等于100,使用which方法对x3进行修改,将超过100的修改为100。
> x3[which(x3>100)]=100> x3 [1] 45 89 87 78 88 87 100 72 82 100 73 77 100 80 51 79 94 80 99 75 [21] 86 92 71 57 78 61 99 90 81 84 100 100 88 73 98 80 100 89 74 56 [41] 75 93 97 100 64 87 100 94 79 100 100 88 77 75 87 100 73 100 64 99 [61] 93 94 70 77 100 99 100 100 92 100 76 96 78 100 75 82 91 100 100 100 [81] 69 84 100 92 92 79 100 97 97 100 74 100 81 100 76 100 87 83 70 77
将上面4个向量放到组合为数据框data.frame。
> x = data.frame(num,x1,x2,x3)> x num x1 x2 x31 201321001 85 86 452 201321002 68 76 893 201321003 69 85 874 201321004 92 86 785 201321005 76 82 886 201321006 67 67 877 201321007 90 81 1008 201321008 82 77 729 201321009 98 80 8210 201321010 68 72 10011 201321011 98 80 7312 201321012 68 81 7713 201321013 80 85 10014 201321014 74 81 8015 201321015 75 82 5116 201321016 90 76 7917 201321017 78 89 9418 201321018 52 89 8019 201321019 55 80 9920 201321020 75 73 7521 201321021 91 78 8622 201321022 63 65 9223 201321023 99 88 7124 201321024 89 81 5725 201321025 93 86 7826 201321026 85 82 6127 201321027 65 79 9928 201321028 79 75 9029 201321029 55 76 8130 201321030 89 81 8431 201321031 98 89 10032 201321032 83 79 10033 201321033 56 82 8834 201321034 73 78 7335 201321035 75 81 9836 201321036 56 91 8037 201321037 90 93 10038 201321038 70 82 8939 201321039 82 72 7440 201321040 68 70 5641 201321041 62 86 7542 201321042 90 77 9343 201321043 78 83 9744 201321044 83 77 10045 201321045 81 74 6446 201321046 95 82 8747 201321047 63 85 10048 201321048 98 84 9449 201321049 79 77 7950 201321050 89 68 10051 201321051 59 89 10052 201321052 56 72 8853 201321053 60 75 7754 201321054 69 71 7555 201321055 68 76 8756 201321056 93 74 10057 201321057 85 75 7358 201321058 65 87 10059 201321059 64 81 6460 201321060 68 79 9961 201321061 73 81 9362 201321062 97 76 9463 201321063 86 72 7064 201321064 88 84 7765 201321065 93 76 10066 201321066 71 83 9967 201321067 65 91 10068 201321068 71 72 10069 201321069 82 75 9270 201321070 70 81 10071 201321071 63 87 7672 201321072 76 81 9673 201321073 60 83 7874 201321074 97 73 10075 201321075 92 80 7576 201321076 78 81 8277 201321077 99 76 9178 201321078 54 89 10079 201321079 50 85 10080 201321080 79 93 10081 201321081 74 73 6982 201321082 85 80 8483 201321083 58 88 10084 201321084 92 81 9285 201321085 80 87 9286 201321086 64 95 7987 201321087 50 87 10088 201321088 64 88 9789 201321089 95 81 9790 201321090 83 81 10091 201321091 91 78 7492 201321092 73 75 10093 201321093 87 81 8194 201321094 79 79 10095 201321095 85 78 7696 201321096 85 87 10097 201321097 67 75 8798 201321098 51 76 8399 201321099 70 86 70100 201321100 93 86 77
计算每门课的平均分
> colMeans(x[2:4]) x1 x2 x3 76.74 80.49 86.26
> colMeans(x)[c('x1','x2','x3')] x1 x2 x3 76.74 80.49 86.26
使用apply函数也可以实现,参数2表示对列进行计算
> apply(x,2,mean) num x1 x2 x3 201321050.50 76.74 80.49 86.26
计算最大值,最小值。
> apply(x,2,min) num x1 x2 x3 201321001 50 65 45
> apply(x,2,max) num x1 x2 x3 201321100 99 95 100
计算总分
> apply(x[c('x1','x2','x3')],1,sum) [1] 216 233 241 256 246 221 271 231 260 240 251 226 265 235 208 245 261 221 234 223 [21] 255 220 258 227 257 228 243 244 212 254 287 262 226 224 254 227 283 241 228 194 [41] 223 260 258 260 219 264 248 276 235 257 248 216 212 215 231 267 233 252 209 246 [61] 247 267 228 249 269 253 256 243 249 251 226 253 221 270 247 241 266 243 235 272 [81] 216 249 246 265 259 238 237 249 273 264 243 248 249 258 239 272 229 210 226 256
计算总分最高的人的序号。
> which.max(apply(x[c('x1','x2','x3')],1,sum))[1] 31
计算最高分的学号。
> x$num[which.max(apply(x[c('x1','x2','x3')],1,sum))][1] 201321031
第二节:绘图基本函数
绘制直方图函数hist
对课程1绘制直方图,横坐标表示分数区间,纵坐标表示频次。
> hist(x$x1)
对课程1和课程2绘制散点图,plot函数。通过该图可以大致看出两门课是否存在相关关系。
> plot(x$x1,x$x2)
列联函数table,对每个数据进行统计。
柱状图绘制函数barplot对统计结果进行绘制。barplot必须和table函数结合使用才有意义。
> table(x$x2)65 67 68 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 91 93 95 1 1 1 1 1 5 3 2 6 8 4 4 4 5 15 6 3 2 4 6 5 3 5 2 2 1 > barplot(table(x$x2))
饼图函数pie。pie也需要和table函数结合使用。
> pie(table(x$x2))
箱线图boxplot,对三门课程画箱线图。
> boxplot(x$x1,x$x2,x$x3)
指定箱线图的颜色
> boxplot(x[2:4],col=c('red','green','blue'))
使用horizontal=T将箱线图水平放置
> boxplot(x[2:4],col=c('red','green','blue'),horizontal=T)
对每个人画雷达图。雷达图可以给出比较直观的感觉。
> stars(x[2:4])
对雷达图进行颜色和样式的修改。使用draw.segments=T画扇形。
> stars(x[2:4],draw.segments=T)
茎叶图
> stem(x$x1) The decimal point is 1 digit(s) to the right of the | 5 | 00124 5 | 5566689 6 | 002333444 6 | 5557788888899 7 | 0001133344 7 | 555668889999 8 | 001222333 8 | 555555678999 9 | 0000112223333 9 | 5577888899
散点图的参数设置
plot(x$x1,x$x2, main='课程1与课程2的关系', #设置标题 xlab='课程1',#设置横坐标名称,如果不写则默认为该变量的名称 ylab='课程2',#设置纵坐标名称 xlim=c(0,100),#设置横坐标的范围 ylim=c(0,100),#设置纵坐标的范围 xaxs='r',#xaxs='r', yaxs='i':分别设定 x 和y 轴的形式。 "i"(内部)与 "r"(预设值) 形式的刻度都会依照资料的范围而自动调整,但是 "r" 形式的刻度会在刻度范围两边留一些空隙。 yaxs='r', col='red',#设置点的颜色 pch=20 #设置画图的样式,20表示为圆点 )
关于点的样式,上面显示用的是编号为20的样式,那么R其实提供了很多样式供使用,如下图。参考
用plot画各种形式的图
plot默认情况下画点,但是还有很多不同的形式,用type来控制。下面是不同的画法代表不同的意思。
type 图形样式类型,有九种可能的取值,分别代表不同的样式:
- 'p' 画点;
- 'l' 画线;
a=c(2,3,5,6,9);b=c(3,5,7,5,7);plot(a,b,type='b',col='red')
- 'b' 同时画点和线,但点线不相交;
> plot(a,b,type='b',col='red')
- 'c' 将type = 'b'中的点去掉,只剩下相应的线条部分;
> plot(a,b,type='c',col='red')
- 'o' 同时画点和线,且相互重叠,这是它与type = 'b'的区别;
> plot(a,b,type='o',col='red',pch=20)
- 'h' 画铅垂线;
> plot(a,b,type='h',col='red')
- 's' 画阶梯线,从一点到下一点时,先画水平线,再画垂直线;
plot(a,b,type='s',col='red')
- 'S' 也是画阶梯线,但从一点到下一点是先画垂直线,再画水平线;
> plot(a,b,type='S',col='red')
- 'n' 作一幅空图,没有任何内容,但坐标轴、标题等其它元素都照样显示(除非用别的设置特意隐藏了)。
> plot(a,b,type='n',col='red')
在一个图上画多个线
构建一个数据框
> a a1 a2 a31 78 32 122 45 23 233 23 45 434 88 54 225 98 32 30
画图,lines函数只能在别的图形上面画图,即必须以别的图作为基础,不能自己单独画图。
plot(a$a1,#先画a1 type='l',#画曲线 ylim=c(0,100),#设置纵坐标范围 main='画多个曲线',#设置图表标题 lwd=2, #设置线宽度为2,默认为1 col='red'#设置颜色 )#在上图的基础上进一步画图lines(a$a2,type='l',col='blue',lwd=2)#画a2的曲线图lines(a$a3,type='l',col='green',lwd=2)#画a2的曲线图