この記事はPGFPlotsでキホン的なグラフを書くに触発されて書いた。次のようなグラフを描きたい:
上は次のようにして描いた。コメント(#
の右側)に詳しく説明を書いた。1〜2行目と最後の行はコメントアウトしたままで実行し,微調整した上で,Macなら2行目と最後の行頭の #
を外して実行すると example.pdf
ができる(上の図はそれをPNGに変換したもの)。Windowsでは試していないが,1行目と最後の行頭の #
を外して実行するとできるかもしれない。
# pdf("example.pdf", width=5, height=4) # Rから直接PDF出力(幅・高さの単位はインチ)
# quartz(type="pdf", file="example.pdf", width=5, height=4) # MacのQuartz経由でPDF出力
par(mar=c(3,3,1,1)) # 下・左・上・右マージン(単位:行)
par(family="Times") # フォント(機種依存)
plot(NULL, # とりあえず何も描かないグラフ
log="y", # y軸だけ対数目盛
xlim=c(0,40), ylim=c(1e-5,1), # xとyの範囲
xaxs="i", yaxs="i", # x軸もy軸も "internal"(上で示した範囲通りのサイズにする)
xaxt="n", yaxt="n", # x軸もy軸も描かない(後で描く)
xlab="", ylab="") # x軸もy軸もラベルを書かない(後で書く)
mtext("Average CNR [dB]", side=1, line=1.5) # 下(side=1)のテキスト(lineは位置)
mtext("Bit Error Rate", side=2, line=2) # 左(side=2)のテキスト
axis(side=1, at=seq(0,40,10), labels=seq(0,40,10), # 下に0から40まで10刻みでラベル出力
tck=0.04, mgp=c(1,0.5,0)) # ティックの長さ,ラベル位置
axis(side=1, at=seq(0,40,5), labels=FALSE, tck=0.02) # 同じく5刻みでラベルなし,短いティック
axis(side=3, at=seq(0,40,10), labels=FALSE, tck=0.04) # 上に10刻みでラベルなし,長いティック
axis(side=3, at=seq(0,40,5), labels=FALSE, tck=0.02) # 5刻みでラベルなし,短いティック
axis(side=2, at=10^(-5:0), # 左に10^-5から10^0まで次の数式ラベルを描く
labels=c(expression(10^{-5}),expression(10^{-4}),expression(10^{-3}),expression(10^{-2}),expression(10^{-1}),1),
tck=0.04, las=1, # 長いティック,ラベルスタイル(las)は1(常に水平)
mgp=c(3.5,0.5,0)) # ラベル位置
axis(side=2, # 左に
at=sapply(-5:-1, function(x)(2:9)*10^x), # (2:9)*10^(-5) 〜 (2:9)*10^(-1)
labels=FALSE, tck=0.02) # ラベルなし,短いティック
axis(side=4, at=10^(-5:0), labels=FALSE, tck=0.04, las=1)
axis(side=4, at=sapply(-5:-1, function(x)(2:9)*10^x), labels=FALSE, tck=0.02)
f = function(x) (1-1/sqrt(1+2/(10^(x/10))))/2 # 関数を定義
curve(f(x), 0, 40, add=TRUE) # 理論曲線を上書き
x = seq(0, 40, 4) # データ点
points(x, f(x), type="o", # 点を描く。type="o"は線の上に点をoverplotする
pch=24, bg="white", # pch=24は△(中抜きの部分の色をbgで指定可能)
col="red", lty=2, xpd=NA) # lty=2は破線,xpd=NAは領域外に出た部分も描く
legend("topright", bty="n", c("Theory","Simulation"), # 右上レジェンド。bty="n"は枠なし
inset=c(0.02,0.02), # 角からのx,y距離の微調整
lty=c(1,2), # 線のタイプは1(実線),2(破線)
pch=c(NA,24), # 点の文字はNA(なし),24(△)
pt.bg="white", # △の内側は白
col=c("black","red")) # 色
legend("bottomleft", bty="n", inset=c(-0.02,0.02), # 同じく左下のレジェンド
c("QPSK","Rayleigh fading","Perfect channel estimation"))
# dev.off() # 書き出し終了