R でグラフを描くさい、見栄えなどにこだわりだすと
気が付けばもの凄い時間が経っていたりする(w
出来上がったコードはコピペすれば色々な局面で応用が利くので
最近使っているものを(部分的に)メモしておくなり。
私の場合、スペクトルのグラフを描く機会が多い。
ライトカーブも連続測光した場合はクイックルック用にグラフを作りますが、
こちらはあまり見栄えなどはこだわっていない。
スペクトルのグラフ(気合いれた版)は T Pyx 論文で描いたような図が
最近のブームになっていて、ここ一年近く研究会の集録原稿などでも応用して使ってます。
以下は某新星の一晩分のスペクトルを作図したさいのコード。
フォントはデフォルトではなく、 Times 系を使うのがお気に入りです。
=====
setEPS() # EPS で出力
postscript("nova_hogehoge.eps", # 出力ファイル名
family="Times", # フォント
height = 6, width = 7) # グラフの大きさ
par(tcl=0.4,lwd=2,ps=11) # 目盛の長さ、枠線、文字サイズなどの指定
plot(data, type="l", axes=F, # 外枠や軸はあとでプロットするのでaxes=F
cex.lab=1.2,lab=c(7,7,8),
xlab=expression(wavelength (ring(A))), # 横軸の波長Å
ylab="log10(flux) + const.", col="red", lwd=1,xlim=c(4000,8500),ylim=c(0,2.5))
# gnuplot みたいに上下左右に目盛り線が欲しい場合は以下の通り。
axis(1, lwd.ticks=2) # 軸を描く
axis(2, lwd.ticks=2,las=1) # las=1 は縦軸の数字を横書きにする
axis(3, lwd.ticks=2,lab=F)
axis(4, lwd.ticks=2,lab=F)
box() # 外枠を描く
# 以下、スペクトル線の元素を示す場合に使う。
# text (横軸位置, 縦軸位置, "出力文字", ...) を使う。
# srt=90 は文字を90°回転させている。
text(6563,2.4,expression(paste("H",alpha)),srt=90,cex=1.2) # Balmer
text(4861,2.0,expression(paste("H",beta)),srt=90,cex=1.2)
text(4340,2.0,expression(paste("H",gamma)),srt=90,cex=1.2)
text(6300,1.5,"[O I]",srt=90,cex=1.2) # [O I]
text(7773,1.5,"O I",srt=90,cex=1.2) # O I
# 以下、スペクトル1本のときはあまり使わないけど紹介。
# あるスペクトル線を点線などで強調したい場合は abline を使っている。
# 複数のスペクトルをオフセットして並べ、ラインの変化などを見るとき便利。
abline(v=6563,lty=2,lwd=1) # H-alpha
abline(v=7773,lty=2,lwd=1) # O I
# abline(v=強調したい波長, ...)、となっている。
# つまり指定した横軸の値に対して垂線が引かれる。
# この点線は黒色で多様すると見栄えが微妙になることもある。
# 灰色など控えめの色を使うと幸せになれるかもしれない。
dev.off()
======
とまぁ、 実際プロットした例図(スペクトル)をここに UP できれば良いのですが、
ブログでは割愛します (^^;
あと T Pyx 論文では補助目盛を使っていて、
=====
xm <- seq(3800,9000,by=100)
axis(1,xm,lab=F,tcl=0.4)
axis(3,xm,lab=F,tcl=0.4)
ym <- seq(0,8,by=0.2)
axis(2,ym,lab=F,tcl=0.4)
axis(4,ym,lab=F,tcl=0.4)
=====
という感じで刻むことができる。この場合、主目盛の長さは tcl=0.6 くらいあると
良いかもしれない。このあたりは好みの問題でしょうか。
横軸を共有して二つのグラフを合体させたい場合の方法は、一度ブログで紹介しています。
T Pyx 論文では plot() の前に以下のおまじないを唱えました。
=====
# グラフのレイアウトを行列で考える(一つの図の大きさの割合)
mat <- matrix(c(1,1,1,1,2,2,2,2), # グラフのレイアウトを行列で考える(一つの図の大きさの割合)
8,1,byrow=T)
setEPS()
postscript("tpyx_spectra.eps",family="Times",
height=9,width =9)
par(mfrow=c(2,1)) # 実際のグラフ数を 2x1 として縦に並べる
layout(mat)
par(mar=c(0,4,0,4)) # 各グラフをぴったり接続するおまじない(上下マージン0)
=====
※コメント投稿者のブログIDはブログ作成者のみに通知されます