広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

RStudioからLaTeXを使ってPDFやHTMLでプレゼンテーション資料として出力したい時の設定について

以前、「RStudioからLaTeXを使ってPDFで出力したい時の日本語設定について」というエントリーを書いた時は、RStudioではSweaveが便利だと言いました。

yyhhyy.hatenablog.com

ところが最近はエラーが多く、RMarkdownを使うようになったので、その場合の設定についてメモします。

RMarikdownを使う場合

新規ファイル作成

New FileからRMarkdownでbeamerプレゼンテーションを選びます

f:id:yyhhyy:20161029180617j:plain

プリアンブルを丸っと入れ替える

注意点が幾つかあります

  • Beamerは変なサイズをしているので"\usepackage[size=a4,scale=3.5]{beamerposter}"でA4サイズになるようにする
  • 日本語のフォントを指定する"\usepackage{zxjatype}"," \setjamainfont{Noto Sans CJK JP}"
  • latexのエンジンをデフォルトから変更する。私の場合はxelatexが日本語との相性が良いと思いますので、"latex_engine: xelatex"を追記。 この際にインデントをするのも重要です。
---
title: "年齢別インターネットの利用機器状況"
author: "yhy"
date: "2016/10/29"
header-includes:
   - \usepackage[size=a4,scale=3.5]{beamerposter}
   - \usepackage{zxjatype}
   - \setjamainfont{Noto Sans CJK JP}
   - \usetheme{boxes}
   - \usecolortheme{seagull}
output:
  beamer_presentation:
    latex_engine: xelatex
---

ggplotの中でフォントを指定する

ggplotの中でもRが認識できる日本語フォントを使用する必要があります

riyoukiki_nenrei_g <- riyoukiki_nenrei_g + theme_bw(base_family="Japan1GothicBBB")

表はxtableの方が便利

表は、kableと xtableがありますが、xtableの方が便利だと感じました。主な注意点は以下です

  • xtableをprintする時にscaleboxでサイズを調整する
  • xtableをprintする時にlatexと明示する
  • xtableをprintする時にcommentをFALSEにしておく
  • 個別のセルのサイズを「p{~cm}」で固定すると横幅が入りきる

チャンクの中のコードは以下のようになります

{r echo=FALSE,warning=FALSE,error=FALSE,message=FALSE,results="asis"}
library("xtable", lib.loc="C:/hogehoge/r/R-3.2.3/library")
riyoukiki_nenrei_tb <- xtable(riyoukiki_nenrei,caption="%")
align(riyoukiki_nenrei_tb) <- "|l|l|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|"
print(riyoukiki_nenrei_tb,type="latex",comment = FALSE,scalebox=0.7)

※xtableの設定について

https://cran.r-project.org/web/packages/xtable/vignettes/xtableGallery.pdf

出力結果イメージ

f:id:yyhhyy:20161029182839j:plain

f:id:yyhhyy:20161029183503j:plain

コード全体

今回は総務省のデータを加工して使用しました

統計表一覧 政府統計の総合窓口 GL08020103

※コードの前後は、チャンク「```」で囲んでいます

---
title: "年齢別インターネットの利用機器状況"
author: "yhy"
date: "2016/10/29"
header-includes:
   - \usepackage[size=a4,scale=3.5]{beamerposter}
   - \usepackage{zxjatype}
   - \setjamainfont{Noto Sans CJK JP}
   - \usetheme{boxes}
   - \usecolortheme{seagull}
output:
  beamer_presentation:
    latex_engine: xelatex
---

## 日本語の入ったグラフ

総務省「平成27年通信利用動向調査」補問 インターネットの利用機器(加工2)

{r echo=FALSE,warning=FALSE,error=FALSE,message=FALSE}
library("dplyr", lib.loc="C:/hogehoge/R-3.2.3/library")
library("reshape2", lib.loc="C:/hogehoge/R-3.2.3/library")
library("ggplot2", lib.loc="C:/hogehoge/R-3.2.3/library")
library("RColorBrewer", lib.loc="C:/hogehoge/R-3.2.3/library")
riyoukiki_nenrei <- read.csv("kosein15_2_1.csv",header = TRUE)
riyoukiki_nenrei_m <- melt(riyoukiki_nenrei,id.vars = c("Age"))
riyoukiki_nenrei_g <- ggplot(data=riyoukiki_nenrei_m,
                             aes(x=variable,y=value,fill=variable,color=variable))
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + geom_bar(stat="identity",position="dodge")
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + theme_bw(base_family="Japan1GothicBBB")
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + ggtitle("インターネットの利用機")
riyoukiki_nenrei_g <- riyoukiki_nenrei_g  + ylab("%")
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + xlab("")
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + geom_text(aes(x=variable,y=value,label=value),vjust=-0.5,color="black",size=4)
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + scale_fill_brewer(palette = "Spectral")
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + scale_color_brewer(palette = "Spectral")
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + facet_wrap(~Age,scales = "fixed")
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + theme(axis.text.x=element_blank())
riyoukiki_nenrei_g <- riyoukiki_nenrei_g + scale_y_continuous(breaks=seq(0,100,by=10),limits = c(0,100))
plot(riyoukiki_nenrei_g)

## 日本語の入った表

総務省「平成27年通信利用動向調査」補問 インターネットの利用機器(加工2)

{r echo=FALSE,warning=FALSE,error=FALSE,message=FALSE,results="asis"}
library("xtable", lib.loc="C:/hogehoge/R-3.2.3/library")
riyoukiki_nenrei_tb <- xtable(riyoukiki_nenrei,caption="%")
align(riyoukiki_nenrei_tb) <- "|l|l|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|"
print(riyoukiki_nenrei_tb,type="latex",comment = FALSE,scalebox=0.7)

「reveal.js」でも出力できます

最近流行りのHTMLでのプレゼンテーションに出力することもRMarkdownなら簡単です

プリアンブルの変更

最初に「revealjs」パッケージをインストールしておきます。 アウトプットの出力をrevealjsに変更して、テーマを選べば終わりです。

---
title: "年齢別インターネットの利用機器状況"
author: "yhy"
date: "2016/10/29"
output:
  revealjs::revealjs_presentation:
    theme: default
    center: true
    fig_height: 5
    reveal_options:
      slideNumber: true
---

諸々の設定についてはこちら

Presentations with reveal.js

出力例

f:id:yyhhyy:20161029185246j:plain

表について

プリアンブルの下にCSSの指定を入れるとカスタマイズできて、文字色や背景色は変更できるのですが、表のサイズを上手く変更できませんでした。 こちらは、詳しい人にお願いします!!

広告代理店の営業マンは何を売っているのか?

大手広告代理店の電通で新卒社員が過労自殺をしました。

その事件を受けて色々な人が”広告代理店が何故長時間労働しているのか?”について情報発信しています。 実態としてその通りな面はあると思いつつ、若干のミスリードもあると思っているので、自分なりの意見をまとめました。

広告代理店の実態を書いたブログエントリー

どちらも既に業界には居ない人ですが、レガシィな代理店はその頃から変化はなく、大枠の実態としてはその通りです

jnakagawa.blog.jp

monthly-shota.hatenablog.com

上記のエントリーはどちらも実態を把握しているものと感じます。

しかし、現場が日々目指している”ちゃんとした営業マンの営業スタイル”は必ずしもこのような世界ではありません。

特に、クライアントの言う通りに何もかもを調整して対応することは、クライアント・代理店そして発注先の媒体社や制作会社、全てに対して負の連鎖しか生みません。

人は一緒に乗り越えた苦労は覚えているがピンチを助けてくれたことは忘れがち

先輩であり上司である人に教えて貰った教訓です。

「あの時はピンチでしたね~」と苦労を共有して乗り越えた案件というのは、クライアントと広告代理店の絆を強くします。

一方で、値引きをしたり、今回だけ特別対応ですよ?と短納期で納入したり、と一方的に広告代理店及びその先の媒体社・制作会社側だけが苦労して対応した案件というのは、その瞬間は凄く感謝されますが、時間が経つと不思議と忘れられてしまいます。

それどころか

  • 「前回は、このスケジュールで何とかなったじゃないですか?なので今回も!」
  • 「前回のあの金額が残ってしまっていて、なかなか値上げをするには追加メリットがないと。。。」

などと最初から短納期が設定されたり、最初から低収益でスタートしてしまいかねないのです。

そもそも”値引き”も”短納期対応”も”とても失礼”である。

”値引き”は自社の利益を削って対応するのですから、自社が決断すれば誰にも迷惑をかけないと思いがちですが、

  • 定価で購入した別のクライアント
  • 商品価値を維持したい媒体社・制作会社

に対して失礼です。

もし同じ案件に対して、A社には値引きして売っていたのに、B社には値引きせずに利益確保していたことが、 何年も経った後でB社に情報が逆流したら、B社の宣伝部担当者はどう思うでしょうか?B社担当の営業マンはどう対処すればいいでしょうか?

”短納期対応”は、もっと失礼です。

広告代理店は自社で作業を解決することはできません。

”明日までに修正お願い!”と言われて、企画書の文言修正であれば広告代理店内で済む話ですが、グラフィック案の修正であれば外部のデザイナーが広告代理店のクリエイターのディレクションの後に徹夜で作業をしているのです。

広告代理店が売っているのは、”媒体・コンテンツ”と”人”である

広告代理店のビジネスは大きく2つに分かれています。

  • 広告媒体・タレント・キャラクター・イベントなど値段の決まっている媒体やコンテンツの代理販売
  • 社内のスタッフ・外部スタッフなど”人”

1つ目の説明は不要でしょう。2つ目について説明します。

ちゃんと商品が売れるような広告表現が出来る優秀なクリエイターの人生は限られています。彼等の貴重な仕事時間を色んなクライアントに切り売りするのが、営業マンのしていることです。

一般的商品に例えると

  • 仕事の出来るスタッフに効率的にアウトプットして貰う = 生産効率を上げる
  • 1回辺りのスタッフの仕事をできるだけ高く請求する = 商品単価を上げる

の2つを意識して会社に利益を残すことが営業マンの役割です。

日々どういう意識を持っているのか?

  • ほんとにその作業は今、依頼する必要があるのか?
  • この案件はスタッフの経歴として誇らしいものになっただろうか?
  • スタッフのした仕事をちゃんとクライアントに説明して評価して貰えたろうか?
  • このプロジェクトはちゃんと利益が確保できて、次回も継続できるだろうか?

などを考える必要があります。

利益を確保することはクライアントの為である

スタッフを効率的に回して利益確保することが会社のミッションであると理解している管理職は、利益の出ていないプロジェクトからスタッフを外し、時に担当の営業マンの数も減らします。

値引きに値引きを重ねてスタッフを安売りしてしまったプロジェクトは、人員不足になり最終的に崩壊し、その取引は終わります。

その時に広告代理店の営業マンは困りません。何故ならまた別のクライアントの仕事があるからです。

一方でクライアント側は、優秀なスタッフが抜けることでアウトプットのクオリティが下がりますし、最終的に広告代理店に請負うだけの人員が確保されない場合は取引を別の会社にゼロから委託せざるを得なくなります。

クライアントの伝書鳩な人は自分が可愛いだけ

人は誰かに頼られたり感謝されたりすることに快感を覚えるものです。 「今回はありがとう!」「お願いなんですけど。。。」と言われると、”頑張ろう!”という気持ちになります。

しかし動き出す前に、 その無理なスケジュールや予算を請けることが、”会社として正しいことか?”、”長期的にクライアントの為になっているか?”と一歩考えてから踏み出さないと何もかもが崩壊します。

電通で自殺者が出てしまった遠因を作ったのが、現場の誰かなのか?組織の構造的欠陥だったのか?いずれにしても、正常な営業スタイルは維持できていなかったということでしょう。

見どころが違うアニメ_『百日紅』_『花とアリス殺人事件』_『あしたのジョー2』_『君の名は。』_『ガールズ&パンツァー 劇場版』

ここ最近見たアニメで”夫々見どころが違って面白い”と思ったのでその感想です。 どれもいい作品だと想いますので気に入ったらいつか見て欲しいものばかりです。

ジャパニーズアニーションという感じがする『百日紅


『百日紅~MissHOKUSAI~』新予告60秒

”目に見えないモノ”の描き方が素晴らしい

予告編で良いシーンが既に幾つか抜粋されていますが、半透明の”妖怪”の動きや屏風の中の鬼の動きがリアルです。 また、龍・魂など”目に見えないモノ”を風の動きで表現するのもとても上手いです。 直接的表現を避けた方が味わい深く心にグッとくる時があります。

絵師の心構えが伝わる

”目に見えないモノ”の描写に力が入っているため、”目に見えないモノ”を描く絵師の物語が凄く印象に残るようになっていました。 ”龍は降りて来ないと描けない”という話や、絵の力で妖怪や病を抑えつけるといった話を全く信じていなくても、”いや、ひょっとしたらそういうことがあってもいいのではないか?”という気持ちになりました。 それ程、アニーションに説得力がありました。

原恵一監督の良さが一つ理解できたように思いました。

中学生の頃が思い出される『花とアリス殺人事件』


映画『花とアリス殺人事件』予告編

実写のようなカメラワーク

具体的にどう説明していいのかがわからないのですが、選ぶカットがどれも実写感があって、なるほどこういうアニメーションの使い方もあるんだな、という新鮮さがあります。

役者の演技のことを考えると演技のできる子どもを集めるのは大変なので、こういうアニメーションの活かし方もあるんだ!と思いました。

中学生ってこうだったよねの満載

学校の迷心を信じたり、ちょっと親の行動が恥ずかしいと思ったり、他にもっと良い解決があるのに自分達で遠くまで確かめに行こう!と盛り上がったり、”中学生ってこうだったよね”というシーンが盛り沢山です。

主人公は転校生なのですが、昔の顔見知り、よくわからない男子、変なきっかけで会話するようになった子、お隣さんetc色々な人と出会いつつ、誰かひとりと急に仲良くなるわけでもなくちょっとずつ距離を近付けて行くのが本当に中学生の頃のリアリティがあります。

とても懐かしい気分になったと共に、毎日が変化だったあの頃を忘れないようにしたいと思いました。

あしたのジョー2

あしたのジョー2 OP」で検索して下さい。そして第1シーズンのOPを見て下さい。

www.google.co.jp

衝撃的なカッコよさのOP

楽曲のイントロの渋さもたまらないのですが、この影絵のようなOPの一つ一つの動きをよく見て頂きたいのです。 殴られて顎が上がって元に戻る頭蓋骨と首の動きのリアリティ、影絵のランニングの動きのリアルさ、影絵であるだけに如何に動きが”本物っぽい”かがわかると思います。

ロシア・アヴァンギャルドドイツ表現主義が好きなのですが、この影絵・色使い・タイポグラフィの入り方、どれもかっこいいです。

ジョーを応援したくなる

暴力的なシーンは苦手なのですが、出崎統の描くボクシングのシーンは何故か熱い。動きの緩急にリアリティがあるのでしょうか。

力石を自分のパンチで殺してしまったトラウマをひきずって本気で殴れなくなったジョー、それを自覚し悔しがるシーンがシンプルに力強く描かれています。 余計なお涙頂戴シーンではなく、本気の一発、殴られて今にも死にそうな相手、その姿をみての嗚咽、”ジョー!頑張れ!”と思わず叫んでしまう。 80年代のお茶の間で流れていたんだなというTVシリーズならではのドラマ感。

よく考えると毎週30分、小難しい話もなく、プロボクサーの話だけで引っ張るって凄いことだと思いませんか?

CGかのような滑らかな動き『君の名は。


「君の名は。」予告

OPからテンションがあがる動き

背景が動いているのに人物も動いていて、アニメの絵が動いているのではなく、アニメーションの世界の中でカメラが動いているような滑らかな動き。 それだけで興奮してしまいますし、OPでその山場があることで、”いや、これはもう傑作でしょ!”と期待値がグッと上がりました。

音と映像のタイミングがあっている

タイアップアーティストの歌唱が大きい、というレビューもありましたが、この映像と音のタイミングの快感は最高だと思います。 監督の過去作品『秒速5センチメートル』でも桜と山崎まさよしの歌がよくあっていましたが、今回も最高のシーンでした。

”音響”が素晴らしい『ガールズ&パンツァー 劇場版』


ガールズ&パンツァー 劇場本予告

音がズッシリ来る

音響監督がよくツイートしていますが、ガルパンはとても音に拘っています。 爆発音がガンと響いて来ます。映画は、音・映像・脚本etcと色々な要素に分解できますが、”音”の良さも味わって欲しいです。

爆音上映をやっている間にいつか立川に行きたいですね。 (いつも満席ですが)

友情と勝利

ジャンプの努力・友情・勝利ほど上手く物語のポイントを掴んだ言葉はないでしょう。 本作も、仲間と共にピンチを協力して乗り越える、熱い友情の連続でした。

戦車を退避させなければならないシーンがあるのですが、そこでの協力プレーが涙モノです。 どうせ美少女ものなんでしょう?と思っていたら損をするスポ根アニメです。


君の名は。』の関連商品のオススメ

Walkerや公式ガイドブックなど色々ありますが、本作の映像的な秘密を知りたい人は、

CGWORLD (シージーワールド) 2016年 10月号 [雑誌]

CGWORLD (シージーワールド) 2016年 10月号 [雑誌]

を買うと良いと思います。

あのCGなのか?というシーンでは実は一度3dCGでカメラワークを作って吐き出した絵をベースに美術発注しているのです。 とてつもない作業だと思いますが、結果、拘るのであれば最初からそうする方が早いのだとか。。。 その他、なるほどね!という話が一杯だったので、書店でもKindleでもこれは買いです。


紹介作品一覧

アニメの楽しみ方、受け取り方は人それぞれ。 もっと色々な楽しみ方を勉強して理解の幅を広げたいです。

【備忘録】Markdownとreveal.jsでプレゼン資料を作ってみる

先般Markdownが如何に便利かというエントリーを書きました。

yyhhyy.hatenablog.com

これだけも充分なのですが、最近流行りのHTML形式へのプレゼンも簡単にできることを知ったので、メモ。

reveal.jsを導入する

色々なサイトを参考にしましたが、素人にはどれも難しく、、、このサイトをとても参考にさせて頂きました。

qiita.com

先ずはこちらで「Basic setup」の方をダウンロードし解凍します。

github.com

導入は以上です。

HTMLを直接編集する

これが最初わからなかったのですが、HTMLファイルでプレゼンするのですからHTMLファイルを直接編集すればいいのです。

リンクで参照するので解凍したフォルダ内から移動させずに作業します。

「index.html」を好きなファイル名に変更し、それをテキストエディタで編集します。

markdown用の記述

「div class="slides"」の後ろ変更します。Markdownだよ、ということや、ページ区切りの文字は「(改行)---(改行)」にするよ!といったことを記述します。

コピペ時の注意事項はこちらを参考にしました。

qiita.com

<div class="reveal">
    <div class="slides">
        <section data-markdown
                data-separator="^\n---\n$"
                data-separator-vertical=">>>$"
                data-vertical="^\n--\n">
            <script type="text/template">
  ~ここに本文~
            </script>
    </div>
</div>

本文のところに丸っとMarkdown記法で書いた本文をコピペします。

注意

Markdownファイルを呼びこむこともできますが、それにはサーバーの設定が必要なので、とても面倒そうでした。そこまでするなら、コピペでも良いかなと想います。

デフォルトでのプレゼン

ブラウザでHTMLファイルを開くとプレゼンテーションになります。

デフォルトのテーマで作るとこのような感じです。「→」のキーでページをめくれます。

f:id:yyhhyy:20160911203002j:plainf:id:yyhhyy:20160911203009j:plainf:id:yyhhyy:20160911203015j:plain

好き嫌いあるかもしれませんが、個人的には好きなテイスト。きっといじればフォントサイズも調整できるのでしょう。

縦方向のスライド

HTMLファイルでのプレゼンの醍醐味は縦方向にもいスライドすることなのですが、何故か私、上手くいきませんでした。。。 *1 こちらのサイト yoghurt1131.hatenablog.com の通り

data-separator-vertical=">>>$"

とすれば下方向へスライドできます

PDFにする

PDFにすることも簡単です。

HTMLをブラウザで開き、URLの所を書き換えます

f:id:yyhhyy:20160911203158j:plain

f:id:yyhhyy:20160911203520j:plain

「#」の前に「?print-pdf」を入れます。

この段階ではレイアウトが崩れますが、Google ChromeのPDF保存機能でPDFにすれば、綺麗なPDFになります。

PDFからPowerPointにする

これは前回 MarkdownのWordにもPowerPointにもなる汎用性の高さに感動 - 広告/統計/アニメ/映画 等に関するブログ と手法は同じです。

無事、PPTにできるので、誰とでも共有できるわけですが、残念ながら微妙に使いづらいところは使いづらいです。

f:id:yyhhyy:20160911204006j:plain

その他

もっとReveal.js自体の勉強をしたら面白いプレゼンが出来そうです。

そもそもPowerPointでプレゼンする必要性などないのですから。

yoghurt1131.hatenablog.com

*1:2016/9/22更新。

【備忘録】Rで矢印のグラフを描く

グラフにこんな矢印を入れたい時ってありますよね? f:id:yyhhyy:20160827192859p:plain これは、因子分析をした時のプロットをイメージしています。

色々と調べた結果をデータの準備からプロットまで手順を追ってメモをしておきます。

データの準備

それっぽいデータを乱数で用意

取り敢えず正規分布の乱数を作成。

平均を0、分散を0.5として7つずつ

set.seed(123)
mr1 <- rnorm(7,mean = 0,sd=0.5)
mr2 <- rnorm(7,mean = 0,sd=0.5)

それっぽいイメージ項目の文字列を作成

names <- c("美しい","賢い","派手な","高貴な","個性的な","明るい","温かい")

データフレームを用意してdplyrのbind_colsを使ってデータフレームを作ります (別にcbindでも同じことです)

res <- NULL
res <- as.data.frame(res)
library("dplyr", lib.loc="C:/hogehoge/R-3.2.3/library")
res <- bind_cols(as.data.frame(mr1),as.data.frame(mr2))
res$names <- names

結果、このようなデータを用意しました

mr1         mr2    names
1 -0.28023782 -0.63253062   美しい
2 -0.11508874 -0.34342643     賢い
3  0.77935416 -0.22283099   派手な
4  0.03525420  0.61204090   高貴な
5  0.06464387  0.17990691 個性的な
6  0.85753249  0.20038573   明るい
7  0.23045810  0.05534136   温かい

矢印をひく為のデータを用意

このサイトを参考にしました。

5 functions to do Principal Components Analysis in R · Gaston Sanchez

矢印には出発点とゴール地点とがあります。その値を持ったデータフレームを別途用意すれば良いのです。

arrowsという名称でデータフレームを用意します。

x1,x2が出発点なので"0"。今回のデータのレコード数をnrowで確認して、必要な数だけの0を並べます。 y1,y2はゴール地点なので描画するデータの値と同じです

arrows <- NULL
arrows <- as.data.frame(arrows)
x1 <- rep(0,nrow(res))
y1 <- rep(0,nrow(res))
arrows <- bind_cols(as.data.frame(x1),as.data.frame(y1))
x2 <- res$mr1
y2 <- res$mr2
arrows$x2 <- x2
arrows$y2 <- y2

こんなデータになります

x1 y1          x2          y2
1  0  0 -0.28023782 -0.63253062
2  0  0 -0.11508874 -0.34342643
3  0  0  0.77935416 -0.22283099

ggplotで描く

ggplotの描画範囲を大きくする

グラフの端で文字が消えないよう、x軸 y軸の最大値・最小値を少し大きめに取ります。

有効数字3桁として、0.1だけ絶対値を大きくとりました。

a <- round(max(res$mr1,res$mr2),3) + 0.1
b <- round(min(res$mr1,res$mr2),3) - 0.1

ベースの値をプロット

先ずはデータの値(今回は因子分析の因子負荷量をイメージしています。)をgeom_pointで、質問項目名をgeom_textで、先ほど決めたグラフの軸の値でxlim,ylimで指定します

g <- ggplot(data=res,aes(x=res$mr1,y=res$mr2))
g <- g + geom_point()
g <- g + geom_text(aes(x=res$mr1,y=res$mr2),label=res$names,vjust=-1)
g <- g + xlim(b,a)
g <- g + ylim(b,a)
plot(g)

するとこんなグラフになりますが、ちょっと見辛いです。

f:id:yyhhyy:20160827194219p:plain

縦横の比率を同じにする

グラフの描画エリアが正方形であって欲しい場合があります。今回は、縦も横も因子負荷量ですから、同じスケールでないと正確にイメージできない可視化となってしまいます。

こちらのサイトを参考にしました。

ggplot2: きれいなグラフを簡単に合理的に - Watal M. Iwasaki

g <- g + coord_fixed(ratio=1)

を加えます。

また、負の値を取りますので、0の場所にx軸、y軸の軸がありません。 そこで、0の水平線と垂線を引いて見やすくします。色もブルーにしてみました。

g <- g + geom_hline(yintercept = 0,color="blue")
g <- g + geom_vline(xintercept = 0,color="blue")

これでかなり見やすくなりました。

f:id:yyhhyy:20160827194835p:plain

いよいよ矢印を引きます

こちらのサイトを参考にしました。

ggplot2 Quick Reference: geom_segment | Software and Programmer Efficiency Research Group

geom_segmentという関数を使って、先ほど作った矢印用のデータフレームarrowsを対象データとして使います。arrow=arrow()で直線が矢印に変わります。

今回は太さを1にし、色をグレーにしてみました。

g <- g + geom_segment(data=arrows,aes(x=x1,y=y1,xend=x2,yend=y2),colour="gray65",arrow=arrow(),size=1)

f:id:yyhhyy:20160827195149p:plain

細かいこだわり

よくみると矢印が青い線の上に乗っかって青線が消えています。ggplotはグラフのデータにどんどんレイヤーを上乗せしていくので、上のレイヤーにしたデータは後で加えないと行けません。 ですので、geom_vlineとgeom_hlineは後ろに順番を入れ替えるべきです。

また、x軸、y軸の目盛りも黒文字の方が読み易いでしょう。

その結果のグラフが最初のグラフのです

f:id:yyhhyy:20160827192859p:plain

全てのコード

set.seed(123)
mr1 <- rnorm(7,mean = 0,sd=0.5)
mr2 <- rnorm(7,mean = 0,sd=0.5)
res <- NULL
res <- as.data.frame(res)
library("dplyr", lib.loc="C:/hogehoge/R-3.2.3/library")
res <- bind_cols(as.data.frame(mr1),as.data.frame(mr2))
res$names <- c("美しい","賢い","派手な","高貴な","個性的な","明るい","温かい")
arrows <- NULL
arrows <- as.data.frame(arrows)
x1 <- rep(0,nrow(res))
y1 <- rep(0,nrow(res))
arrows <- bind_cols(as.data.frame(x1),as.data.frame(y1))
x2 <- res$mr1
y2 <- res$mr2
arrows$x2 <- x2
arrows$y2 <- y2
library("ggplot2", lib.loc="C:/hogehoge/R-3.2.3/library")
a <- round(max(res$mr1,res$mr2),3) + 0.1
b <- round(min(res$mr1,res$mr2),3) - 0.1
g <- ggplot(data=res,aes(x=res$mr1,y=res$mr2))
g <- g + geom_point()
g <- g + geom_text(aes(x=res$mr1,y=res$mr2),label=res$names,vjust=-1)
g <- g + xlim(b,a)
g <- g + ylim(b,a)
g <- g + coord_fixed(ratio=1)
g <- g + geom_segment(data=arrows,aes(x=x1,y=y1,xend=x2,yend=y2),colour="gray65",arrow=arrow(),size=1)
g <- g + geom_hline(yintercept = 0,color="blue")
g <- g + geom_vline(xintercept = 0,color="blue")
g <- g + theme(axis.text.x=element_text(angle=0,colour="black",size=12,hjust=1))
g <- g + theme(axis.text.y=element_text(angle=0,colour="black",size=12))
plot(g)
ggsave(plot=g,file="20160830.png",dpi=300,width=4,height=1.5,scale=3)

【備忘録】交互作用プロットをggplot2で描く

今読んでいる本に「交互作用プロット」というものが出てきました。

マーケティング・データ分析の基礎 (シリーズ Useful R 3)

標準で入っている関数を使っていたので、せっかくならggplot2で描いてみようと思いました。

今回は、そのメモになります。

交互作用プロットとは?

交互作用プロットの例

2つの因子が存在した時に、片方の因子をx軸で、もう片方の因子をグラフの種類(色分け、点線/棒線等)で分けるというものです。

y軸は、平均値をプロットするそうです。

f:id:yyhhyy:20160821153620p:plain

今回始めてみましたが、慣れないとちょっと見辛いですね。

交互作用について

見方や説明の詳細はこちらを参考にして下さい。

7.3 交互作用とは?

statsbeginner.hatenablog.com

  • 折れ線が並行かどうか ⇒ グラフの種類で分けた因子に効果がないか?あるか?
  • 左右で上下があるかどうか ⇒ x軸で分けた因子に効果があるかないか?

ということになります。

標準のグラフで描く

データの準備

このグラフはRのデータセットの中の「ギニアピッグの歯の成長に対するビタミン C の効果」のデータを使っています

len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5

「ビタミン C の投与量」(dose)は、(0.5mg,1mg, 2mg)の3種類ありますので、今回の作図の都合により1mgだけ除きました

library("dplyr", lib.loc="C:/hogehoge/soft/r/R-3.2.3/library")
df <- ToothGrowth %>% filter(dose==c(0.5,2))

また、「ビタミン C の投与量」(dose)は数値データなので因子(factor)に変換しておきます

df$dose <- as.factor(df$dose)
str(df)
'data.frame':  20 obs. of  3 variables:
 $ len : num  4.2 7.3 6.4 11.2 5.2 18.5 25.5 32.5 21.5 29.5 ...
 $ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ...
 $ dose: Factor w/ 2 levels "0.5","2": 1 1 1 1 1 2 2 2 2 2 ...

標準の関数で描く

先ほどの本で紹介されていたinteraction.plot関数を使うと、先ほどのグラフになります。

interaction.plot(df$dose,df$supp,df$len,xlab="ビタミン C の投与量",trace.label="摂取法",ylab="造歯細胞(歯)の成長量")

ggplot2でやってみる

せっかくなら美しいggplot2で描いてみたいものですね。

データの準備

ggplot2の場合は、まずデータの集計が必要です。平均値をプロットするのですから、dplyr/reshape2で集計は簡単です。

先ずはデータを一度分解し、

library("reshape2", lib.loc="C:/hogehoge/r/R-3.2.3/library")
df_m <- melt(df,id.vars = c("supp","dose"))
head(df_m)
supp dose variable value
1   VC  0.5      len   4.2
2   VC  0.5      len   7.3
3   VC  0.5      len   6.4

平均値に集計しなおします。dcastの際にmeanを使います。

df2 <- dcast(df_m,supp+dose~variable,mean)
(df2)
supp dose   len
1   OJ  0.5 14.40
2   OJ    2 26.42
3   VC  0.5  6.86
4   VC    2 25.50

確かにこの表だけではちょっとイメージがつきにくいのかもしれません

ggplot2で描く

なお、ggplot2は非常に優秀なので、連続データでもないものを棒グラフで結ぶことを良しとしません。 そのためそのままgeom_lineと書くだけではエラーになってしまいます。

geom_path: Each group consists of only one observation. Do you need to adjust the group
aesthetic?

なので、無理矢理「supp」(摂取法)をグループだと認識させます。

g <- ggplot(df2,aes(x=dose,y=len,color=supp,group=supp))
g <- g + geom_line(size=2)
g <- g + theme(axis.text.x=element_text(angle=0,colour="black",size=12,hjust=1))
g <- g + theme(axis.text.y=element_text(angle=0,colour="black",size=16))
plot(g)
ggsave(plot=g,file="20160821_2.png",dpi=300,width=4,height=3,scale=2)

するとこのようなグラフになりました。

f:id:yyhhyy:20160821155541p:plain

標準の関数はもっと長体がかかっているようなので、印象を併せる為にもう少し横長にしてみました。

ggsave(plot=g,file="20160821_3.png",dpi=300,width=4,height=1.5,scale=2)

f:id:yyhhyy:20160821155854p:plain

分散分析もしておく

先ほどのデータで交互作用の有無を分散分析で確認しておきます

res <- aov(len~supp+dose+supp:dose,data=df)
summary(res)
Df Sum Sq Mean Sq F value   Pr(>F)    
supp         1   89.5    89.5   5.748   0.0291 *  
dose         1 1175.0  1175.0  75.493 1.87e-07 ***
supp:dose    1   54.8    54.8   3.519   0.0790 .  
Residuals   16  249.0    15.6                     
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

supp=摂取法 及び  dose=ビタミンCの投下量 については、5%の有意水準で”同じである=効果がない”という帰無仮説は棄却されます。

しかし、supp:dose=摂取法と投下量の交互作用 については、5%以上なので、”同じである=効果がない”ということは、”滅多にないことではない”ので、 交互作用があるとは言い難いようです。

データセットについて

余談ですが、こういう練習用のデータについてなかなか手元にドンピシャなものがないものです。

d.hatena.ne.jp

こういうまとめは本当に助かります

箱ひげ図とバイオリンプロットの印象の違い

データの可視化に於いて重宝されるグラフの一つに「箱ひげ図」というものがあります。

箱ひげ図 - Wikipedia

データの四分位点、中央値、最大値、最小値を記載するのでデータの分布が一覧できるというものです。

しかし箱ひげ図には重大な問題があります。

先ずはプロットしてみる

Rがあれば誰でも持っているアヤメのデータを使います。 ”がく”の長さを取り出して箱ひげ図にしてみます。

f:id:yyhhyy:20160820201652p:plain

当然、最大値と四分位点、最小値と四分位点の間にもデータはあるのですが、箱が四分位点で終わってしまっているため、あたかもそこにはデータが無いような印象ではないでしょうか?

そこでバイオリンプロット

そんな箱ひげ図よりも便利な図としてバイオリンプロットというものが存在します。

f:id:yyhhyy:20160820202436p:plain

ヒストグラムを縦にしたようなもので、これであればデータの凡その分布もわかります

箱ひげ図と比較してみる

こちらのサイトを参考にさせて頂きました。

バイオリンプロットの中にボックスプロットを入れると、より情報量が増えますね。

sugioka.wiki.fc2.com

f:id:yyhhyy:20160820202041p:plain

今回のコード

データの集計まで

ggplotで描けるようにreshapeパッケージでデータを変更

library("reshape2", lib.loc="C:/hogehoge/r/R-3.2.3/library")
iris_m <- melt(iris,id.vars = c("Species"))

こんな感じになります

Species     variable 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

そのうち”がく”(=Sepal)のデータだけをdplyrのfilter関数で抜き出します

library("dplyr", lib.loc="C:/hogehoge/r/R-3.2.3/library")
iris_m_sl <- iris_m %>% filter(variable==c("Sepal.Length"))

tailで後半のデータを確認するとSepal.Lengthだけになっているのがわかります

Species     variable value
145 virginica Sepal.Length   6.7
146 virginica Sepal.Length   6.7
147 virginica Sepal.Length   6.3
148 virginica Sepal.Length   6.5
149 virginica Sepal.Length   6.2
150 virginica Sepal.Length   5.9

ボックスプロット

ggplot2のgeom_boxplotを使います。 また先ほどのサイトを参考にして、平均値もサークルでプロットしておきます。

library("ggplot2", lib.loc="C:/hogehoge/r/R-3.2.3/library")
iris_m_sl_g2 <- ggplot(iris_m_sl,aes(x=Species,y=value,color=Species,fill=Species))
iris_m_sl_g2 <- iris_m_sl_g2 + geom_boxplot(color="black")
iris_m_sl_g2 <- iris_m_sl_g2 + stat_summary(fun.y=mean,geom = "point", fill="white",shape=21,size=3) 
iris_m_sl_g2 <- iris_m_sl_g2 + theme(axis.text.x=element_text(angle=0,colour="black",size=12,hjust=1))
iris_m_sl_g2 <- iris_m_sl_g2 + theme(axis.text.y=element_text(angle=0,colour="black",size=16))
plot(iris_m_sl_g2)
ggsave(plot=iris_m_sl_g2,file="iris_m_sl_g_1.png",dpi=300,width=4,height=3,scale=2)

バイオリンプロット

バイオリンプロットはgeom_violinです。

デフォルトでは横幅が調整されてしまうので、データ量も比較したい場合は、scale="count"としておくと良いようです。

library("ggplot2", lib.loc="C:/hogehoge/r/R-3.2.3/library")
iris_m_sl_g <- ggplot(iris_m_sl,aes(x=Species,y=value,color=Species,fill=Species))
iris_m_sl_g <- iris_m_sl_g + geom_violin(scale="count")
iris_m_sl_g <- iris_m_sl_g + theme(axis.text.x=element_text(angle=0,colour="black",size=12,hjust=1))
iris_m_sl_g <- iris_m_sl_g + theme(axis.text.y=element_text(angle=0,colour="black",size=16))
plot(iris_m_sl_g)
ggsave(plot=iris_m_sl_g,file="iris_m_sl_g_2.png",dpi=300,width=4,height=3,scale=2)

みんなのR

バイオリンプロットの方が情報量が多いよ!という話は、

で指摘されていました。

箱ひげ図が先に広がってしまったためにバイオリンプロットは余りメジャーではないようですが(見た目も少し気持ち悪いですし) 誤った印象を与えないという意味ではもっと使って欲しいと思います。