Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

作図の画質向上にチャレンジする(仮)【R, Python】

More than 1 year has passed since last update.

目次

(作成中)

結論

【大枠の結論】
画像サイズを大きくすればそれなりの画質にはなる
【課題】
Rだと一定以上きれいに描画する方法が見つからない(助けてください…)
【現状の最適解】
一方Pythonだとmatplotlibを使うと下図のようにそれなりに綺麗なプロットができる。
matplot.png

はじめに

「綺麗なプロットを作成したい!」
RやPythonを用いて解析するヒトたちに共通する望みかと思います。

plane.png

そう、この図のように曲線を描いた時でも、どこかギザギザしたものになってしまう。
今回はこのギザギザをどうしたら改善できるかに挑戦したいと思います。
用いる言語はRとPythonになります。

画像サイズの定義

上図はRでデフォルトサイズのままpngデータで出力したものになります。
単純に画像サイズを大きくすれば質の向上が望めるかと思います。そこで以下からは画像サイズを1280*720として描画していきます。

plotting in R

Rに関しては描画デバイスという考えが存在します。
私は絵を描くためのキャンバスを自身で定義できるという風に捉えております。
今回はwindows・macのデフォルトデバイスに加え、画質向上を図ったCairoパッケージと綺麗な図がかけると最近流行りのggplot2を用いました。

library(Cairo)
library(ggplot2)

#低画像サイズ
png("out2/plane.png")
plot(sin, -pi, 2*pi)
dev.off()


#高画像サイズ
png("out/plane.png", width = 1280, height = 720)
plot(sin, -pi, 2*pi)
dev.off()

#Cairoパッケージ
Cairo(file = "out/cairoR.png", width = 1280, height = 720, type = "png", dpi = "auto")
plot(sin, -pi, 2*pi)
dev.off()
help(CairoPNG)

#ggplot2
png("out/ggplot.png", width = 1280, height = 720)
x <- seq(-pi, 2*pi, 0.01)
y <- sin(x)
dat <- data.frame(x, y)
ggplot(dat, aes(x, y)) +
  stat_function(fun = sin, color = "blue")
dev.off()

デフォルト描画 〈windows〉

(まだです)

デフォルト描画 〈mac〉

plane.png

windownsよりも綺麗にかけると言われているmacで描画。
やはり綺麗になりますね。
でもどことなくギザギザ感があってまだ少し物足りない…。

Cairoデバイス

cairoR.png

mac版と同程度のものができました。
ぱっと見こちらの方が綺麗かな?くらい
元々windows版のデバイスのクオリティが低いということで開発されたパッケージとのことで、macレベルの描画クオリティにはなるんですね。

ggplot2

ggplot.png

うーん、確かに見た目は綺麗なのですが、今回の目的であるより滑らかな線を描画するという点では向上が見えないです…。
おそらくこれは、ggplot2はあくまで書式などを美しくするためのもので、デバイスはデフォルトのものに依存する(特に指定がなければ)ためと考えられます。

plotting in Python

import matplotlib.pyplot as plt
import numpy as np


plt.figure(figsize = (12.8, 7.2), dpi = 100)
x = np.arange(-np.pi, 2*np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)
#plt.plot(x, y, antialiased = False)

plt.savefig("out/matplot.png")

matplotlib

matplot.png

きれいだ…。

アンチエイリアスを無くしてみる

matplot_plane.png

matplotlib.pyplot.plotの引数ではデフォルトで"antialiased = True"となっているんですね。
上図はそれを"antialiased = False"に変更したものになります。やはりギザギザカクカクしますね。

終わりに

とりあえず画像サイズは大きめに設定するのが吉。
そもそも画像サイズにとらわれないsvg形式で出力する方針での検証も行ってみようかと思います。

とりあえず現状はPythonでmatplotlibを使うのが一番良さそうです。
Rでアンチエイリアス処理をかけられる方法があれば教えて欲しいです…。

hitsujisuke
とあるサル屋の忘備録. フィールドワーカーやってたはずがどんどん技術屋に近づいてきてるヒトです. RとかGISとかをよく使ってます. PythonやSwiftにも浮気したいお年頃.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away