2014年10月26日日曜日

ggplotを使ったfor文で項目名を順番に変えていく

ggplot2でグラフを描く時に、データに使う項目名(具体的にはcsvの列名)を変えて同じ体裁のグラフを複数いっぺんに描きたいときがあって、調べてたら出来るようになったのでメモ。
(追記)reshapeパッケージのmelt.data.frameを使うほうが簡単かも。後述します。

例としてirisを使います。

names(iris) 

とすると、当然
 
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species" 

と表示されます。
ここで、x軸をSpeciesにして、y軸用データを"Sepal.Length" "Sepal.Width" "Petal.Length"にして、それぞれの項目でボックスプロットにしたグラフを描くことを目的とします。

aes_stringを使う方法

まず、使いたい項目名をxnamに入れます(xnamは任意)。
 
xnam<-c("Sepal.Length","Sepal.Width","Petal.Length")

ggplot関数で作図したプロットを入れるリストをつくります。
plots<-list()

通常のggplot関数ですと、aes()でx軸用データ、y軸用データを設定するのですが、変数にした文字列を読み込みたいとき(つまり、Sepal.Lengthを読み込みたいためにxnam[1]と書きたいとき)に aes(x=Species,y=xnam[1]) と書くと正しく描画されません。
したがって、aes_string()を使います。ただし、ここで注意が必要なのは、
 
aes(x=Species, y=Sepal.Length) 

で良かった指定が、
aes_string(x="Species", y="Sepal.Length") 

みたいにダブルコーテーションで囲ってやらないとダメなのです。
ということで、あとは以下のようにfor文を書きます。
 
j <- 1
for (i in 1:length(xnam)) {
    plots[[j]]<-ggplot(iris, aes_string(x="Species",y=xnam[i])) + geom_boxplot()
    j <- j+1
  }

  これで3つのプロットが出来たわけですが、1枚にいっぺんに描くには次のように書きます。
 
args <- c(plots, list(ncol=3, nrow=1))
do.call(grid.arrange, args)
grid.arrangeはgridExtraパッケージの関数です。問題なく実行されると以下の様なグラフが出力されるはずです。
なおargs, do.callの書き方は以下のサイトを参考にさせていただきました。多謝!
R - 可変長引数が最初にある関数に対する do.call() のやりかた - Qiita


(追記)melt.data.frameを使う方法

reshapeパッケージの関数です。超便利。
install.packages("reshape")
library(reshape)
iris2 <- iris[,-4] #Petal.Widthを削除(上の例に合わせてます)
iris2.melt <- melt.data.frame(iris2,id.vars="Species",variable_name="Region")
実行してやると、ほらこの通り。魔法みたい。
> head(iris2.melt)
  Species       Region value
1  setosa Sepal.Length   5.1
2  setosa Sepal.Length   4.9
3  setosa Sepal.Length   4.7
4  setosa Sepal.Length   4.6
5  setosa Sepal.Length   5.0
6  setosa Sepal.Length   5.4
列名のvalueはデフォルトで決まっているようなので後で変えたいときは以下のようなのを。
names(iris2.melt) <- c("Species","Region","Length")
で、プロット。
ggplot(iris2.melt,aes(Species,Length)) + geom_boxplot() + facet_wrap(~Region, scales="free_y") 
結果はこんな感じ。
以下を参考にさせていただきました。
data.frame を ggplot2 用に加工する - joker8phoenix's diary

2015年4月16日追記:reshapeで感動していたのも束の間、時代はreshape2を通り越して、tidyr + dplyr を使おうってことになっているらしい。時代にまったくついて行けてない初心者です。
参考:http://meme.biology.tohoku.ac.jp/students/iwasaki/rstats/reshape2.html

2014年8月3日日曜日

iPhoneケースにUVプリンターでロゴを印刷してみた

iPhoneケースに僕の好きなバンド、The Album Leafのロゴを印刷したいと思い、Happy Printers Harajukuさんにて制作してきました。使用したのはUVプリンターです。

制作した物はこれ。
いい感じです。
以下が主な流れです。

1.ケースを用意

元々使っていたAir Jacketです。

パワーサポート エアージャケットセット for iPhone5S/5 PJK-71
パワーサポート (2012-10-17)
売り上げランキング: 450

2.データを作成

基本的にはHappy Printersさんのサイトの説明に従います。
http://happyprinters.jp/facilities/index.html

ケースの寸法を測ります。正確な値は調べても分からなかったので定規で測りました。Air Jacketはだいたい12.5cm x 6cmでした。
この枠をIllustrator上で作ります。
そしてその中にiPhoneの背面画像と、入れたいロゴマークの画像を配置します。
アップルマークの位置関係、けっこう考えましたが最終的にはあまり気にせず被せました。

この時に注意するのは、白色です。
白色として出したいときはCMYKで、K:1% にするか、スタッフの方にCMYKすべて0の場合の処理を相談すれば良いです。
逆に素材をそのまま露出させたいときはCMYKすべて0にして、スタッフの方にそのように伝えれば適切にやっていただけます。

3.Happy Printersへ

原宿の竹下口の近くにあります。

4.印刷準備

データをスタッフの方に渡します。
白の扱い(そのまま素材を露出させるか、白色として出すか)や、白は白でもどこまで濃くするか(薄くすると素材の肌感が出てくる)などを相談します。
なお、一番高い面に印刷をするので、へこんだ形状に印刷をするのは無理なようです。

5.いざ印刷!

まず下地を紙に印刷し、そこにケースをおきます。これでズレて置いてしまうと当然印刷がズレるので要注意。
最後に印刷面をエタノールで拭いてホコリを取り除きます。
印刷が開始したら後は待つのみ。
印刷中…青い光がUVを含むんでしょうね。

6.完成

数分で完成です。
出来上がりは、素晴らしい…!
テンション上がりました。
プリントが剥がれやすいかどうかは、印刷される素材に依存します。ピカピカのコーティングがされていたりすると、剥がれやすいそう。表面にスプレーをかければ、耐久性は上がるそうです。
装着してみたところ。
お値段は2,000円。
世界に一つだけの、好きなバンドのロゴマーク入りケースができたので大満足でした。

2014年7月15日火曜日

Macbook Air を開けて掃除した

Macbook Air (2012年購入)が最近やたら熱くなって、ファンがすぐに回るようになっていました。
いろいろ調べてSMCリセットしたんですが、改善せず。他の可能性は内部のホコリ。
ということで開けて掃除することにしましたが、皆さんご存知のように普通のドライバーでは開かないです。

秋葉原のパーツ屋で「PENGGONG ☆1.2 x 25 mm No. 8024」のドライバーを千円で購入しました(探せばもっと安いのはあるはず…)。
以下の色違いです。
http://www.aliexpress.com/item/for-opening-repairing-apple-macbook-laptop-1-2-25mm-5-star-point-pentalobe-metal-chrome-paint/1520907451.html

開けてみたのが以下の写真





それなりにホコリが付着して汚いですが、さほどでもないという印象。

エアダスターでキレイにしたのがこちら。




閉じた後、Youtube観たり、画像系アプリを使ったりして、いつもならファンがうるさいほどに回るんですが、掃除後は全然回らず快適でした。
買った時のようだ…!

2014年3月29日土曜日

Google+フォトの自動補正はステキだがたまに過剰

趣味で写真撮るんですが、最近Google+フォトを使ってバックアップをとるようにしてます。2,048x2,048ピクセルまでは無制限でアップロードできるからです。スゴイですよね。もちろんオリジナルはもっと画素数が高いし、JPEGしか保存できないので、簡易的なバックアップという感じですが。

Google+のさらに注目すべき点は、「自動補正」と「おまかせビジュアル」です。
自動補正は、その名のとおり、自動で写真を補正してくれます。おまかせビジュアルは例えば何枚かの連続写真をGIFアニメみたいにつなげてくれるんですが…ジョーク的な機能ですね。

普段iPhotoで写真管理をしている私にとって、すべての画像を一気に同じ補正をかけることができず、面倒だと思いつつ欲しい写真だけ補正をしていました(一応補正条件のコピペは出来ます)。
それに引き換え、Google+の自動補正はとても便利です。何枚でも写真をアップロードするだけで、自動的に見栄え良くしてくれるからです。自動ですべて補正してくれるのは感動的なくらい便利です。

ということで自動補正画像とオリジナルを比べてみます。ちなみに、カメラはNikon D7100、レンズはAF-S DX NIKKOR 18-105mm f/3.5-5.6G ED VRです。

Google+自動補正の特徴

(クリックすると拡大します)
この左の画像はGoogle+で自動補正がされた画像をダウウンロードして、拡大したものです。Originalのほうは同じピクセルサイズになるようにiPhotoでJPEGを書きだして、同じ拡大操作を行ったもの。
拡大すると違いがよく分かります。パッと見でGoogle+のほうが「パキっとしてる」と思いませんか?建物も、桜も、Google+の方がシャープな印象です。色味も違ってます。デジカメ画像はシャープに映っていると「綺麗だ」と感じ易いので、自動補正でシャープネスを上げているんだろうと思います。Originalの方はダルい感じします。

Google+の自動補正でパッと見で綺麗な写真にはなります。なので、とりあえずの簡易バックアップだったらこれでも良いかなと思います。自動補正を後から戻すこともできるので。
しかし、たまに気持ち悪いレベルで補正がされるので、それも比較しておきます。

自動補正が過剰なケース

(クリックすると拡大します)
Google+の方は、パッと見「綺麗」です。が、空の色が青すぎです。夏の空か?と思うくらいに青いです。実際はこんなに青くなく、春のちょっと寝ぼけた感じの空です。桜の色も変わりすぎです。輪郭もパキっとしすぎです。もちろんOriginalは補正なしでダルい感じなので、このままで良いというわけではないのですが。Google+の自動補正は場合によってこれだけ過剰になってしまいます。

Google+の写真機能は容量から言っても、自動補正から言っても、かなり良いです。無料でここまで出来るのだから文句言うなという感じです。が、まぁ使いようですね、という至極当然な結論です。