R語言——基本繪圖函數


通過一個綜合的例子測試繪圖函數

學習的內容是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  x3
1   201321001 85 86  45
2   201321002 68 76  89
3   201321003 69 85  87
4   201321004 92 86  78
5   201321005 76 82  88
6   201321006 67 67  87
7   201321007 90 81 100
8   201321008 82 77  72
9   201321009 98 80  82
10  201321010 68 72 100
11  201321011 98 80  73
12  201321012 68 81  77
13  201321013 80 85 100
14  201321014 74 81  80
15  201321015 75 82  51
16  201321016 90 76  79
17  201321017 78 89  94
18  201321018 52 89  80
19  201321019 55 80  99
20  201321020 75 73  75
21  201321021 91 78  86
22  201321022 63 65  92
23  201321023 99 88  71
24  201321024 89 81  57
25  201321025 93 86  78
26  201321026 85 82  61
27  201321027 65 79  99
28  201321028 79 75  90
29  201321029 55 76  81
30  201321030 89 81  84
31  201321031 98 89 100
32  201321032 83 79 100
33  201321033 56 82  88
34  201321034 73 78  73
35  201321035 75 81  98
36  201321036 56 91  80
37  201321037 90 93 100
38  201321038 70 82  89
39  201321039 82 72  74
40  201321040 68 70  56
41  201321041 62 86  75
42  201321042 90 77  93
43  201321043 78 83  97
44  201321044 83 77 100
45  201321045 81 74  64
46  201321046 95 82  87
47  201321047 63 85 100
48  201321048 98 84  94
49  201321049 79 77  79
50  201321050 89 68 100
51  201321051 59 89 100
52  201321052 56 72  88
53  201321053 60 75  77
54  201321054 69 71  75
55  201321055 68 76  87
56  201321056 93 74 100
57  201321057 85 75  73
58  201321058 65 87 100
59  201321059 64 81  64
60  201321060 68 79  99
61  201321061 73 81  93
62  201321062 97 76  94
63  201321063 86 72  70
64  201321064 88 84  77
65  201321065 93 76 100
66  201321066 71 83  99
67  201321067 65 91 100
68  201321068 71 72 100
69  201321069 82 75  92
70  201321070 70 81 100
71  201321071 63 87  76
72  201321072 76 81  96
73  201321073 60 83  78
74  201321074 97 73 100
75  201321075 92 80  75
76  201321076 78 81  82
77  201321077 99 76  91
78  201321078 54 89 100
79  201321079 50 85 100
80  201321080 79 93 100
81  201321081 74 73  69
82  201321082 85 80  84
83  201321083 58 88 100
84  201321084 92 81  92
85  201321085 80 87  92
86  201321086 64 95  79
87  201321087 50 87 100
88  201321088 64 88  97
89  201321089 95 81  97
90  201321090 83 81 100
91  201321091 91 78  74
92  201321092 73 75 100
93  201321093 87 81  81
94  201321094 79 79 100
95  201321095 85 78  76
96  201321096 85 87 100
97  201321097 67 75  87
98  201321098 51 76  83
99  201321099 70 86  70
100 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其實提供了很多樣式供使用,如下圖。參考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 a3
1 78 32 12
2 45 23 23
3 23 45 43
4 88 54 22
5 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的曲線圖

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM