3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【R】 滑らかなcurveを描こう

Last updated at Posted at 2020-02-08

1. 趣旨

発端はこの記事を書いたこと。
【R】 正規分布のスペクトルを描く

この記事を書いてグラフを画像に出力したときに、ふと思った。



平滑化したい!!!!!

curve()を使って滑らかなカーブをplotしたい!!!!! と。



ということで、頑張って画質向上を目指しましょう。

2. 比較

2-1. before

nd.png

カクカクすぎて見るに耐えない。
このままSVG出力しても拡大に耐えられません。

2-2. after

Rplot08.png

芸術品と見紛うほどの美しさ。

3. 手順

3-1. 「点の数」を増やす

ざっくり言ってしまえば、Rで曲線グラフを描写しようとすると「沢山の点と点を直線で結ぶ」ことで曲線を表現しようとしてしまいます。なのでカクカクしてても仕方がない・・・いや待てよ。じゃあ点の数を増やせばいいんじゃないか・・・?

君のような勘のいいガキは嫌いだよ —  ショウ・タッカー


この点のことをノードと言いますが、デフォルトでは101個となっています。 ですが実は引数で無限に増やせます。パソコンの処理能力が追い付く限りは。

ということで、増やしましょう。好きなだけ
nという引数に、ノード数を設定してください。

参考までに、僕のおんぼろPC環境(6年目のオンボロPC)でも一曲線当たり3万点とかでも全然余裕です。

# before (ノード数 = 101)
> curve(dnorm(x, 0, 1), -4, 4, add = F, lwd = 2)

# after (ノード数 = 30,000)
> curve(dnorm(x, 0, 1), -4, 4, add = F, lwd = 2, n = 30000)

3-2. ベクター画像として保存する

点の数を増やしたら、これを一旦ベクター画像として保存しましょう。
RStudioの場合、Plot図の上のほうにあるExport > Save as Imageを選択します。

サイズは調整してもしなくても良いですが、Image Formatからベクター画像形式のものを選択しましょう。
基本的にはSVGファイルです。
Metafileでもいいですが、点の数を増やしすぎると正常に保存できないことがあります。

3-3. お好きなエディタでPNGとして保存する

必要であれば、保存したSVGファイルをInkscapeなど、SVGファイルが扱えるソフトで開いて、そのままPNGとしてエクスポートしましょう。
画像の大きさは、ここで調整できます。少し大きめに保存しておくのがオススメ。
よっぽど大きくしない限りはカクカクしないはずですが、もしカクカクが気になったら3-1. に戻って点の数を増やしてください。

4. ちなみに

  • 実はSVGとして出力することで、曲線部分だけでなく軸やラベル文字までも綺麗に描写できるようになります。
  • 紹介した方法は、curve()だけでなくplot()にも使えることを確認しました。他にも何かあったら教えてください。
> FUN <- function(x) {x^3-x^2-25*x+1}

# before (ノード数 = 5)
> plot(FUN, -7, 7, n = 5)

# after (ノード数 = 100,000)
> plot(FUN, -7, 7, n = 100000)

5. おわりに

やっぱりグラフは滑らかなのが一番!

Enjoy!

おしまい。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?