PC用は別頁
=== 読者が配色を変更したい場合 ===
◎外側の色を変えるには,次の色をクリック
◎内側の色を変えるには,次の色をクリック
標準文字色を変えるには,次の色をクリック
《体験・入門レベル》
== Rによるグラフの表示 ==
R version 4.0.3, 4.0.4Patched
----- 最終更新年月日:2021.4.12
この教材は,体験・入門のレベルで,30分から1時間ほどで「そこそこ分かる」ことを目指す.
Rによるグラフの作成
1. 高水準作図関数と低水準作図関数
Rでグラフを作るとき,
(1) 高水準作図関数・・・与えられたデータを元にして「その図がうまくグラフに入るx座標とy座標の範囲を決めて描画する」
plot( ), curve( ), hist( )など
(2) 低水準作図関数・・・高水準作図関数で描かれたグラフの上に「点,線,テキスト,タイトルなどを付け足すことに使う」
points( ), lines( ), abline( ), axis( ), text( ), rect( )など
がある.描画を重ねていくときに,高水準作図関数,低水準作図関数をうまく使い分ける必要がある.
• 高水準作図関数を使ってグラフを描くとき,上書きを指定しない限り,それまでにグラフィック画面に描かれていた図は消されて,新たに図が描かれる.
• 低水準作図関数を使ってグラフを描くと,それまでにグラフィック画面に描かれていた図に上書きする形で図が描かれる.
• 何も描かれていないグラフィック画面に,低水準作図関数だけで描画することはできない.

1.1 plot( )
 高水準作図関数のうちで,curve( )はこのページ,hist( )はこのページ,plot( )はこのページで述べている.このでは媒介変数表示との関わりで,さらにplot( )を取り上げる.
 plot( )は,デフォルトでは2次元の散布図を描く
x<-c(1,0,-1,0)
y<-c(0,1,0,-1)
plot(x,y)

--図1--
• ベクトルx=(x1,x2,x3,x4),
ベクトルy=(y1,y2,y3,y4)のとき,plot(x,y)は
点(x1, y1), (x2, y2), (x3, y3), (x4, y4)に〇を打って散布図を描く.右図では(1, 0), (0, 1), (−1, 0), (0, −1)に点がある.
• plot( )において,名前タグ付き引数 type="p", ="l", ="b" 他を指定することができ,各々「点」「線」「両方」他に対応している.type=を省略した場合は,右図1のように「点」が〇で示される.
引数としてtype="l"を選ぶと,次の図2のように線で結ばれる.type="b"を選ぶと,次の図3のように点と線の両方が描かれる.

--図2--

--図3--

1.2 座標軸だけを表示する abline( )
 座標軸(xy軸)を追加するには,低水準作図関数abline( )の追加が便利
 図2の散布図(折れ線)に,単純に座標軸(xy軸)だけ[目盛り等なし]を追加するには,abline( )が簡単
x<-c(1,0,-1,0)
y<-c(0,1,0,-1)
plot(x,y, tyle="l",col="red") #グラフを赤にした
abline(h=0) # x軸
abline(v=0) # y軸

--図4--
• abline( )はy=a+bxのグラフが描けるようになっている.(aがy切片でbが傾きであることに注意.統計では定数がα,傾きがβとすることが多い)
 ただし,特にh=0でx軸を,v=0でy軸を表す.
abline(a=..., b= ...)
abline(h=0)
abline(v=0)
abline(a=-1, b=2, col="blue")
abline(a=0.5, b=-0.5, col="green")
• 図4では,y=−1+2xを青色で追加し,y=0.5−0.5xを緑色で追加している.

1.3 目盛り付き座標軸を表示する axis( )
 基本
axis(side, at=min:max, pos=)
により,どの向きの(side)座標軸を,どの目盛り(min)から,どの目盛(max)まで(at which)表示するかを指定する.pos=は,その座標軸が交差する相手方の軸の座標
【例】
curve(sin(x),0,2*pi) #高水準作図関数でグラフを描く@
axis(1, at=0:7, pos=0) #座標軸を描くA

--図5--

--図6--

 図5のように,@の段階で既に外枠に目盛りが付いているので,これにAの座標軸を上書きすると,図6のように目盛りが二重になる

--図7--
 座標軸の目盛りを生かしたいときは,@の側で目盛りを表示しないようにするとよい.高水準作図関数に,名前付き引数 xaxt="n", yaxt="n"を追加すると,各々x軸,y軸の目盛りを非表示にできる.右図7(表示は省略または="s")
 このように,高水準作図関数curve()やplot()の側で,名前付き引数xaxt="n", yaxt="n"を指定しておいてから,目盛り付き座標軸を表示する低水準作図関数axia()を書き込むと目盛りが重複しなくなる.
【例】
curve(sin(x),0,2*pi, xaxt="n", yaxt="n")
axis(side=1, at=-1:5, pos=0)
axis(4, at=-2:2, pos=0)

--図8--

--図9--

• 第1引数として書けば,side=は省略できる.(上記のようにside=1と書いてもよく,第1引数に4 と書いてもよい)
• sideは右図のように決まるので,通常は1としてx軸を,4としてy軸を表示するとよい.
• y軸のat=−2:2のように,min=−2から,max=2までを(at which)指定しても,実際のグラフが−1から1までしかないときは,−1から1までが表示される.
• x軸のat=−1:5のように指定して,実際のグラフが0から2π≒6.28までのとき,実際のグラフがある範囲0から2π≒6.28が表示され,目盛りは指定した範囲だけ(5まで)になる.
• このグラフでy軸の目盛りの「文字方向」が「軸と平行」になっていて読みにくいのは,las=0,1,2,3の名前タグ付き引数によって直せる.
las(the style of axis labels)の値
省略時 ⇒ 軸と平行な向き
las=0 ⇒ 軸と平行な向き
las=1 ⇒ 画面に対して頭が上向き
las=2 ⇒ 軸と垂直な向き
las=3 ⇒ 画面に対して頭が左向き

 ここまでの内容を踏まえて,とりあえずの完成形を作ると次の式とグラフになる.
【完成形】
curve(sin(x),0,2*pi, xaxt="n",
yaxt="n",col="red") axis(side=1, at=0:7, pos=0) axis(4, at=-1:1, pos=0,las=1)

--図10--

1.4 点(列)を表示する points( )
 基本
points(x, y)
により,ベクトルx, yで示される点を描く
ベクトルx=(x1, x2, x3, ・・・, xn), y=(y1, y2, y3, ・・・, yn)に対して,points(x, y)で描かれる点列とは,
n個の点の列
  (x1, y1), (x2, y2), (x3, y3), ・・・ ,(xn, yn)
をいう
【例】
plot(c(-2,2,2,-2),c(-2,-2,2,2))・・・@
points(c(-1,0,1),c(-1,1,-3),pch=17, col="red")・・・A
points(c(2,1,-1),c(2,-1,1),pch="A", col="blue")・・・B
points(c(-1,0,1),c(0,-1,1),pch="あ",col="green")・・・C
x<-c(-2,2,2,-2)
y<-c(-2,-2,0,0)
points(x,y,type="l",col="#990000")・・・D
x2<-c(1,2,1,0)
y2<-c(0,2,2,1)
points(x2,y2,type="b", col="#009900")・・・E
x3<-c(0,0,-1,-1)
y3<-c(0,2,2,0)
points(x3,y3,type="o",lty="solid",lwd=2,col="#999900")
                      ・・・F
x4<-c(0.5, 0.5, -0.5,-0.5)
y4<-c(-1.5,1.5, 1.5,-0.5)
points(x4,y4,type="l", lty=6)・・・G
 低水準作図関数points()は,@のような高水準作図関数によって,何らかの描画があるところへ後から上書きするのを基本とする.
 A 名前タグ付き引数 pch(plotting character)はプロットされるマーカーに用いられる文字を示す.
@) pch=1〜25の整数を指定すると,Rにおいてあらかじめ用意されている記号がマーカーに用いられる.この例ではpch=17によりマーカーを▲にして,col="red"により赤色で示した.
 ただし,pch=が省略されたときの既定値は,pch=1の〇になる.
pch=01234・・・15161718・・・25

×・・・・・・
 Aの低水準作図関数points()による描画の中で,3番目の点(1, −3)は,初めに高水準作図関数@によって描画される範囲に入っていないので,描画されない.
BCマーカーにアルファベット1文字(pch="A"など)や日本語漢字・かな・カナ(pch="あ"など)を用いることはできる.ただし,pch="・・・"の形でアルファベットもしくは日本語漢字・かな・カナの2文字以上を用いることはできない.(先頭の1文字のみになる)
 dog, Jan, Mondayのような複数の文字から成るマーカーを用いる必要がある場合は,別の低水準作図関数text( )を用いることができる.
 DEtype="l"(英小文字のエル)を指定すると,点列を結んだ「折れ線」ができる.この他,typeに指定できるパラメータは次の通り.
type="p" (point)
省略時の既定値
⇒点がプロットされる
type="l" (line)
大文字"L"は不可
⇒折れ線になる
type="b" (both)
⇒点と線の両方
線は点で途切れる
type="c"
⇒点なしの線(途切れあり)
type="o"
⇒点と線の重ね書き
type="h"
⇒各点からx軸までの垂線を描く
type="s"
⇒左詰めのヒストグラム(赤は参考:元の点)
type="S"
⇒右詰めのヒストグラム(赤は参考:元の点)
type="n"
⇒マーカーをプロットしない
 FGltyは line type 線種で,lty=0〜6または"solid", "dotted"などにより線種を指定する.("solid"などの文字列で指定するときは,すべて小文字に限る)
lty=0またはlty="blank"⇒無し
lty=1またはlty="solid"⇒実線
lty=2またはlty="dashed"⇒ダッシュ
lty=3またはlty="dotted"⇒鎖線
lty=4またはlty="dotdash"⇒1点鎖線
lty=5またはlty="longdash"⇒跳び破線
lty=6またはlty="twodash"⇒長短の鎖線(1点鎖線で詰まり気味=4よりも空白が短いもの)
※lty=7以上はlty=1からの繰り返し(lty=0は再登場しない)
 FGlwdは線幅line widthで,省略すれば1(最も細い線)になる.
※正の整数値で指定するのが基本だと考えられるが,小数や分数でも可能.実験的には,小数点以下を切り捨てた整数と一致する(ただし0〜1までは1になる)

1.5 等差数列を作る関数seq( )
 seq( )は,数列[sequence]を生成する関数で
 次の@により,初項a,末項l,項数nの等差数列のn項から成るベクトルが作られる.
 Aの形で指定した場合には,初項a,末項l,公差dの等差数列から成るベクトルが作られる.
 Bの形で書いたとき,Aの省略と解され,第3引数は公差と見なされる.
 Cのように名前付きタグを引数とするときは,引数の順序に依らずに指定できる.
seq(a, l, length=n)・・・@
seq(a, l, by=d)・・・A
seq(a, l, d)・・・B
seq(from=a, to=l, by=d)・・・C
@
seq(1, 10, length=5)
のように,入力した場合,初項=1,末項=10,項数=5となる等差数列の各項が作られる.
[1] 1.00 3.25 5.50 7.75 10.00
⇒ この場合,第2,3,4項は小数になる.
• lengthは正の数とし,分数や小数が指定された場合は「切り上げて整数に直される」
• @の形でa>lのときは,減少する数列になる.
A
seq(1, 5, by=3)
のように,入力した場合,初項=1,公差=3で5以下の数から成る等差数列の各項が作られる.
[1] 1 4
⇒ Bの場合も同様
※lengthとbyの両方を書くことはできない.
 次の式で,0からまでを100等分した等差数列ができる.
t<-seq(0, 2*pi, length=101)
 CやPythonでは,要素数がn個のベクトルaの要素は,a[0]〜a[n-1]ですが,Rでは要素数がn個のベクトルaの要素は,a[1]〜a[n]になる.
 そこで,上記のベクトルtの要素は,t[1]=0.00000000,t[2]=0.06283185←2π/100,・・・ , t[101]=6.28318531←2πになる.

2 媒介変数表示
2.1 円の媒介変数表示
 円の方程式を媒介変数表示で表すと,


 これを,Rのplot(x,y,type="l")を使って表すと
t<-seq(0,2*pi,length=101)
plot(cos(t), sin(t), type="l", asp=1)

--図11--
• plot( , , type="l")は原理的には「折れ線」であるが,折り目を細かくしている(100等分)ので,十分なめらかな曲線になる.
• 必要に応じて,分割をさらに細かく500等分,1000等分, ...などとすることも可能

--図12--
• asp=はアスペクト比と呼ばれ,写真を印刷するときに,アスペクト比を保存する(1:1)にするかどうかという形で,日常生活でも見かける用語になっている.ここでは,もとの比率が1:1のときに表示後の「縦÷横の比率」がaspになっている.

2.2 楕円の媒介変数表示
 楕円の方程式を媒介変数表示で表すと,


ここでは,a=3, b=2の場合について,Rのplot(x,y,type="l")を使って表すと
t<-seq(0, 2*pi,length=101)
plot(3*cos(t), 2*sin(t), type="l",
asp=1,col="blue") abline(h=0) abline(v=0)

--図13--
• 変数tの図形的な意味は,図の動径OPがx軸となす角ではない.実際には,半径3の円周上の点Qについて,OQとx軸がなす角になっている.
• OQ=3 ⇒ OH=3cos t, PH=QH×2/3
=3sin t×2/3=2sin t

2.3 サイクロイドの媒介変数表示
 サイクロイドを媒介変数表示で表すと,


 ここでは,a=2の場合について,Rのplot(x,y,type="l")を使って表すと
t<-seq(0,2*pi,length=101)
plot(2*(t-sin(t)),2*(1-cos(t)),type="l",asp=1)

--図14--
• 自転車のタイヤの1点に目印を付けておいて、タイヤが1回転したときの軌跡がサイクロイド
t<-seq(-0.5*pi, 2.5*pi,length=201)
plot(2*(t-sin(t)),2*(1-cos(t)),type="l",
asp=1,col="red")
abline(h=0) abline(v=0)

--図15--
• グラフを赤色にし,座標軸を上書き
• 1周の前後も表示するようtの値の範囲を前後に伸ばした場合

2.4 アステロイドの媒介変数表示
 アステロイド(星芒形)を媒介変数表示で表すと,


 ここでは,a=3の場合について,Rのplot(x,y,type="l")を使って表すと
t<-seq(0, 2*pi,length=101)
plot(3*cos(t)^3,3*sin(t)^3,type="l",
asp=1,col="blue") abline(h=0) abline(v=0)

--図16--
においてk=2のときが円,0<k<2のときは,座標軸に近づいて,凹形になる
• 媒介変数表示直した場合は



において,m=1のときが円.1<mのときは,座標軸に近づいて,凹形になる

2.5 アルキメデスの渦巻き線
 アルキメデスの渦巻き線(螺旋)を,極座標で書くと:
 これをによって媒介変数表示に直すと


 ここでは,a=1の場合について,Rのplot(x,y,type="l")を使って表すと
t<-seq(0, 4*pi,length=101)
plot(t*cos(t),t*sin(t),type="l",asp=1,col="darkgreen")
abline(h=0)
abline(v=0)

--図17--
• ここでは2回転()までのグラフを描いたが,実際には限りなく大きくできる

2.6 正葉曲線
 3枚葉の正葉曲線を極座標で書くと:
 これをによって媒介変数表示に直すと


 ここでは,a=1の場合について,Rのplot(x,y,type="l")を使って表すと
t<-seq(0, 2*pi,length=101)
plot(cos(3*t)*cos(t), cos(3*t)*sin(t),
type="l", asp=1,col="#990000") abline(h=0) abline(v=0)

--図18--

で定まる正葉曲線も3枚葉であるが,下の図のように縦と横を入れ替えたものになる.
--図19--

2.7 カージオイド(心臓型)
 カージオイド(心臓型)を極座標で書くと:
 これをによって媒介変数表示に直すと


 ここでは,a=1の場合について,Rのplot(x,y,type="l")を使って表すと
t<-seq(0, 2*pi,length=101)
plot((1+cos(t))*cos(t), (1+cos(t))*sin(t),
type="l", asp=1,col="red") abline(h=0) abline(v=0)

--図20--

3 plot(), points(), lines()の比較
 何もない所に,いきなり低水準作図関数だけで描画することはできないが,何らかの描画ができた範囲に対して,媒介変数表示によりブラフを描くことに関しては,
plot(x, y, type="l")・・・@
points(x, y, type="l")・・・A
lines(x, y, type="l")・・・B
は同じ働きをする・・・polygon()・・・Cはlines()の最後に中塗り作業が入るだけなので,ここでは扱わない.
【例3.1】楕円を描く
t<-seq(0, 2*pi,length=101)            #・・・(*)
plot(3*cos(t), 2*sin(t), type="l", 
asp=1,col="blue", xaxt="n", yaxt="n") #・・・@ points(3*cos(t), 2*sin(t)+0.1, type="l",
col="red") #・・・A lines(3*cos(t), 2*sin(t)+0.2, type="l",
col="darkgreen") #・・・B axis(1, at=-3:3, pos=0) axis(4, at=-2:2, pos=0) #・・・(4)

--図20--
(*)1回転(360度)を100等分した(植木算により項数は101項)数列を作る.
@高水準作図関数point()により−3≦x≦3, −2≦y≦2の範囲に青色で楕円を描く.
xaxt="n", yaxt="n"により外枠の目盛りを書かない.
Apoints()により同じ楕円を赤色で描く(完全に重なると前の図形が見えなくなるので,y座標に+0.1のズレを追加する) Blines()により同じ楕円を暗緑色で描く(完全に重なると前の図形が見えなくなるので,y座標に+0.2のズレを追加する)
(4)座標軸を描く

【例3.2】指数関数×三角関数
t<-seq(-pi/2, pi/2,length=101)       #・・・(*)
curve(exp(2*x)*sin(5*x), -pi/2, pi/2, 
xlim=c(-pi/2,pi/2),ylim=c(-10,10))#・・・@ points(t+0.1, exp(2*t)*sin(5*t),
type="l", col="red") #・・・A lines(t+0.2, exp(2*t)*sin(5*t), type="l",
col="darkgreen") #・・・B

--図21--
(*)を100等分した(植木算により項数は101項)数列を作る.
@高水準作図関数curve()により, の範囲に黒色で指数関数×三角関数を描く.
外枠の目盛りは書く
Apoints()により同じ図形を赤色で描く(完全に重なると前の図形が見えなくなるので,x座標に+0.1のズレを追加する)
Blines()により同じ図形を暗緑色で描く(完全に重なると前の図形が見えなくなるので,x座標に+0.2のズレを追加する)

...(PC版)メニューに戻る