このパートでは, ここまでで紹介した基本機能の応用で, さまざまな R パッケージやその他の外部プログラムの出力を埋め込む方法を紹介する
tikz
を使うr rmdja::texlogo("latex")
で使われる tikzdevice
を利用して, 直接 tikz
の記述による画像を埋め込むことができる. チャンクのエンジンを tikz
とすることで使用でき, 相互参照やキャプション, 画像サイズの指定といったチャンクオプションも使える. 図 \@ref(fig:tikz-venn) は tikz
で生成した図である. これはHTMLでも表示できる. TODO: しかし現状ではpdflatex以外のエンジンに変更できないため, 日本語表示が難しい.
```{tikz tikz-venn, fig.cap="tikzを利用した図の表示"} \def\firstcenter{(135:1.75cm)} \def\secondcenter{(45:1.75cm)} \def\firstcircle{\firstcenter circle (2.0cm)} \def\secondcircle{\secondcenter circle (2.0cm)} \def\wholerect{(-4.0, -1.1) rectangle(4.0, 3.35)} \begin{tabular}{cc} % A cap B \begin{tikzpicture} \begin{scope} \clip \secondcircle; \fill[cyan] \firstcircle; \end{scope} \draw \wholerect; \draw \firstcircle; \draw \secondcircle; \begin{scope}[font=\small] \draw(90:.5cm) node[text=black, below]{\texttt{A INNER JOIN B}}; \end{scope} \end{tikzpicture} & % A u B \begin{tikzpicture} \begin{scope} \draw \wholerect; \fill[cyan]\firstcircle; \fill[cyan]\secondcircle; \end{scope} \begin{scope}[font=\small] \draw(90:.5cm) node[text=white, below]{\texttt{A OUTER JOIN B}}; \end{scope} \end{tikzpicture} \ % A LEFT B \begin{tikzpicture} \draw \wholerect; \draw \firstcircle; \draw \secondcircle; \begin{scope} \fill[cyan]\firstcircle; \draw\firstcenter; \draw\secondcenter; \end{scope} \begin{scope}[font=\small] \draw\firstcenter node[text=black, below]{\texttt{A LEFT JOIN B}}; \end{scope} \end{tikzpicture} & % A RIGHT B \begin{tikzpicture} \draw \wholerect; \draw \firstcircle; \draw \secondcircle; \begin{scope} \fill[cyan]\secondcircle; \draw\firstcenter; \draw\secondcenter; \end{scope} \begin{scope}[font=\small] \draw\secondcenter node[text=black, below]{\texttt{A RIGHT JOIN B}}; \end{scope} \end{tikzpicture} \ \end{tabular}
## Asymptote を使う 同様に, Asymptote のプログラムを埋め込むこともできる. 私は Asymptote が分からないので RCB [Ch. 15.9 Create graphics with Asymptote](https://bookdown.org/yihui/rmarkdown-cookbook/eng-asy.html) と同様のプログラムを書いておく. (図 \@ref(fig:asymptote-graph)). ```{asy asymptote-graph, out.height="50%", fig.cap="Asymptote による画像"} import graph3; import grid3; import palette; settings.prc = false; currentprojection=orthographic(0.8,1,2); size(500,400,IgnoreAspect); real f(pair z) {return cos(2*pi*z.x)*sin(2*pi*z.y);} surface s=surface(f,(-1/2,-1/2),(1/2,1/2),50,Spline); surface S=planeproject(unitsquare3)*s; S.colors(palette(s.map(zpart),Rainbow())); draw(S,nolight); draw(s,lightgray+opacity(0.7)); grid3(XYZgrid);
D3.js なども使える
graphviz などで使用される DOT 言語を使用してグラフィカルモデルを描画することもできる. この場合, チャンクのエンジンを dot
にするのではなく, エンジンは r
のままで, engine="dot"
を指定すると, コードブロックが DOT 言語として評価される. 図\@ref(fig:dot-example) がその結果である.
digraph test { graph [layout = dot, rankdir = TB]; node [shape = rectangle]; rec1 [label = "Step 1. 起床する"]; rec2 [label = "Step 2. コードを書く"]; rec3 [label = "Step 3. ???", color=blue, style=filled]; rec4 [label = "Step 4. 給料をもらう", fontsize=20, fontcolor=red]; rec1 -> rec2 -> rec3 -> rec4; }
なお, RCB, Ch. 4.15 でも紹介されているように DOT 言語は DiagrammeR
パッケージを経由して使うこともできる[^dot-lang-syntax]が, grViz()
関数の出力は HTML を前提としているため, PDF での出力時のサイズや解像度の調整がうまくいかないことが多い.
一方で, ggdag
パッケージはggplot2
ベースのパッケージなので, 一般的な R グラフィックスと同じ扱いでグラフィカルモデルを描画できる (つまり名前に反して DAG 以外のネットワーク図も記述可能である). ggplot2
風の構文で記述できるので習熟も容易である.
[^dot-lang-syntax]: 私も詳しいことは知らないが, DiagrammeR::grViz()
の構文は本来の DOT と少し異なるようだ, 本来はステートメントごとにセミコロンで区切ることが必要であり, 文字列もダブルクオーテーションで囲まなければならないが, grViz()
ではそのような制約がない.
kableExtra
による表のスタイルのカスタマイズinclude_graphics(if(is_latex_output()) "img/kableExtra.pdf" else "img/kableExtra.svg")
kableExtra
パッケージは knitr::kable
の拡張であり, 様々なスタイルの表を出力できる. そしてそれは HTML でも PDF でも有効である.
まず, knitrExtra::kbl()
は既に紹介した kable()
のラッパであり, 内部で呼び出すのは kable()
のため booktabs
といった従来の引数が使える上に, オプション設定の構文がより分かりやすくなっている. さらに kableExtra
の独自機能として, 表 \@ref(tab:kableextra-color) にみられるように条件書式のような装飾が可能である[^mtcars-term].
``{block kableextra-official, type="memo"}
kableExtra` パッケージはヘルプドキュメントはもちろん, 公式の解説や用例も充実している.
https://haozhu233.github.io/kableExtra/
https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html
(ref:kableextra-color-cap) `kabeExtra` パッケージを利用した表の作成, 公式ドキュメントの用例より ```r colnames_mtcars_ja <- c( "ガロン毎マイル", "シリンダ", "排気量", "総馬力", "ギア比", "重量", "加速性能", "トランスミッション", "ギア数", "キャブレター数") that_cell <- c(rep(F, 7), T) mtcars[1:8, 1:8] %>% kbl(booktabs = T, linesep = "", format = if(knitr::is_latex_output()) "latex" else "html", caption = "(ref:kableextra-color-cap)", col.names = colnames_mtcars_ja[1:8] ) %>% kable_paper(full_width = F) %>% kable_styling(latex_options = "scale_down") %>% column_spec(2, color = spec_color(mtcars$mpg[1:8]), link = "https://haozhu233.github.io/kableExtra") %>% column_spec(6, color = "white", background = spec_color(mtcars$drat[1:8], end = 0.7), popover = paste("am:", mtcars$am[1:8])) %>% column_spec(9, strikeout = that_cell, bold = that_cell, color = c(rep("black", 7), "red"))
上記の例で使われている, kableExtra
の便利な機能をいくつか挙げる.
kbl(col.names = )
で列ラベルを指定できる (これは kable()
でも使える). 列名の変更ではないので以降も同じ名前で変数を参照できるが, 表示されるのは列ラベルである. 現状, 日本語 (マルチバイト文字) を変数名に与えることを想定していないパッケージはまだ多く, またデータフレームの仕様として列名に ()
などを使えないためこの機能が役に立つ.kable_styling()
の latex_options = "scale_down"
や full_width = T
である. 前者は本文領域に収まるように自動で表を縮小するもので, 後者は表内での改行を許容することで超過した表の幅を本文の幅に合わせるオプションである. もしより細かい調整が必要なら, column_spec()
で列ごとに幅を指定することもできる.グラフのインライン挿入も可能である (表 \@ref(tab:kableextra-plot)). しかしこのような細かいグラフの羅列は可読性に欠けることに注意する.
(ref:kableextra-plot-cap) kabeExtra
パッケージによる表内グラフ, 公式ドキュメントの用例より
mpg_list <- split(mtcars$mpg, mtcars$cyl) disp_list <- split(mtcars$disp, mtcars$cyl) inline_plot <- data.frame(cyl = c(4, 6, 8), mpg_box = "", mpg_hist = "", mpg_line1 = "", mpg_line2 = "", mpg_points1 = "", mpg_points2 = "", mpg_poly = "") inline_plot %>% kbl(booktabs = T, format = if(knitr::is_latex_output()) "latex" else "html", caption = "(ref:kableextra-plot-cap)", col.names = c("シリンダ数", "ガロン毎マイル", "", "", "", "", "", "") ) %>% kable_paper(full_width = FALSE) %>% kable_styling(latex_options = "scale_down") %>% column_spec(2, image = spec_boxplot(mpg_list)) %>% column_spec(3, image = spec_hist(mpg_list)) %>% column_spec(4, image = spec_plot(mpg_list, same_lim = TRUE)) %>% column_spec(5, image = spec_plot(mpg_list, same_lim = FALSE)) %>% column_spec(6, image = spec_plot(mpg_list, type = "p")) %>% column_spec(7, image = spec_plot(mpg_list, disp_list, type = "p")) %>% column_spec(8, image = spec_plot(mpg_list, polymin = 5))
その他細かい使用上の注意をいくつか挙げる.
kableExtra::
で参照するのではなく, 最初にパッケージをロードしたほうが不具合が起きにくい.r rmdja::texlogo("LaTeX")
パッケージのロードが必要だが, rmdja
のPDFフォーマットはいずれもテンプレートに組み込んでいるため手動設定は必要ない.knitr::kable()
または kableExtra::kbl()
の format
でHTML/texの出力を決める. 現在は判定が自動化されたとのことだが, まれに不具合があるという報告もみられる. よって, どちらも出力したい場合は上記のように format = knitr::is_latex_output()
で条件分岐させるのが1つの手である.kbl()
/kable()
の caption
引数に指定するescape = F
を指定する.kable_styling(latex_options = "scale_down")
を追加することで自動縮小してくれる.その他, テキストの回り込み, 画像の挿入など様々なことが可能である. 詳細は公式の解説である "Create Awesome HTML Table with knitr::kable and kableExtra" および PDF版 が役に立つ.
[^mtcars-term]: ところで私は自動車の性能を表す用語に詳しくない. これは mtcars
データセットの列名を日本語訳したのだが, した表記に誤りがあれば指摘してほしい.
formattable
パッケージとの併用formattable
パッケージは以前からある表を装飾するパッケージである. kableExtra
との併用も可能だが, r rmdja::texlogo("LaTeX")
に対応しておらず, HTMLタグをtexファイルに吐き出してしまうため動作しない. PDF にも同様に表示するには StackOverflowで提案されているように, webshot
使うなど工夫が必要である. そこまでしてこの装飾にこだわるメリットは薄いと私は考えるので現在この問題に対応する予定はない. kableExtra
か後述する huxtable
を使うべきだと考える.
huxtable
パッケージによる作表huxtable::hux_logo(latex = is_latex_output(), html = is_html_output()) %>% huxtable::set_caption("`huxtable` のロゴはランダムに生成される.")
huxtable
は HTML と r rmdja::texlogo("LaTeX")
に対応した作表パッケージであり, 公式ドキュメントによると他の類似パッケージと比較して多機能であることを強調している. 全体的に tidyverse
を意識した構文が用意され, kableExtra
のようにパイプラインを使った記述が捗る. さらに「1行ごとに背景色を変更」「stargazer
風の表」などよく使われるスタイルを簡単に設定できるようになっていたり, はては tidyr
のような表のロング・ワイド変形機能まで備えている. 例えば公式用例集を参考に, 条件書式を付けた表 \@ref(tab:huxtable-example) を作成する.
(ref:huxtable-example-cap) huxtable
パッケージによる作表
require(huxtable) head(mtcars[1:5]) %>% set_names(colnames_mtcars_ja[1:5]) %>% as_huxtable(add_rownames = "Model") %>% set_caption("(ref:huxtable-example-cap)") %>% set_bold(1, everywhere, T) %>% theme_article() %>% map_text_color( everywhere, "ガロン毎マイル", by_colorspace("navy", "red", "yellow")) %>% map_background_color( everywhere, "総馬力", by_quantiles(0.8, c("white", "yellow"))) %>% map_italic(everywhere, "Model", by_regex("Merc.*" = T)) %>% set_number_format(col = "ギア比", value = fmt_percent(digits = 2))
huxtable
パッケージの関数の多くには set_
という接頭辞がついているものとそうでないものがある. ついているものは上記のようにパイプラインでつなげて使うために用意された関数群で, ついていないものは R 組み込みの colnames()
のように1行ごとに処理を書くスタイルに向いている. そのままでは罫線の設定が set_top_border()
, set_bottom_border()
, などしかなく, 複雑な条件を指定するのが大変だが, ggplot2
のテーマ関数のようにスタイルのプリセットが theme_*()
の名前でいくつか用意されている. 例えば上記では theme_article()
という学術論文風テーマを適用し, 表の上下とヘッダにだけ罫線を引いている. 条件書式は map_*()
関数群で実行できる. また, フォーマットは set_number_format()
に値を変換するフォーマット関数を与える形で適用できる. こちらはパーセンテージなども正しく表示できる.
options(huxtable.knit_print_df_theme = theme_article)
.なお, 動作させるにあたっていくつか注意が必要である.
huxtable
は使用しているフォーマットを自動判別して相互参照用のラベルを生成しているが, rmdja
で HTML を出力する際に正しく認識されないようである. options(huxtable.bookdown = T)
Rmd の冒頭で実行して, bookdown
としての処理を強制することで解決できる[^huxtable-bookdown]. huxtable
は EPUB 形式に対応していない. 警告が表示されるだけのこともあれば, knit処理がハングアップしてしまうこともある.[^huxtable-bookdown]: おそらくはこの辺の処理の問題だが, 未解決 https://github.com/hughjonesd/huxtable/blob/3eb96b62a5fde1000924daba39078f2e72839383/R/knitr.R
また, huxreg()
は名前の通り回帰分析の結果を表にするなど stargazer
パッケージに似た機能を提供する. これも同じクラスなので同様にスタイル設定が可能である (表 \@ref(tab:huxreg-example)).
(ref:huxreg-example-cap) huxtable::huxreg()
による出力
lm1 <- lm(mpg ~ cyl, mtcars) lm2 <- lm(mpg ~ cyl + hp, mtcars) glm1 <- glm(I(mpg > 20) ~ cyl, mtcars, family = binomial) huxreg(lm1, lm2, glm1, stars = NULL, error_pos = "below", note = "括弧内は標準誤差") %>% set_caption("(ref:huxreg-example-cap)") %>% set_text_color(everywhere, "model1", "green") %>% set_text_color(everywhere, "model2", "blue")
その他の作例は CRANの 公式 vignettes を参考にせよ.
stargazer
や pander
のように表を出力するための HTML や r rmdja::texlogo("LaTeX")
や Markdown のソースコードを出力してくれるパッケージがある. これらは results='asis'
のチャンクオプションを指定することで関数の出力するテキストをそのまま埋め込むことができる. よって, あとは HTMLか\LaTeX
{=latex}LaTeX
{=html} かといった出力形式の違いに気をつければ表示できる. stargazer
はオプションが豊富で, 例えば表 \@ref(tab:stargazer-table)では, align = T
を指定することで, dcolumn.sty
を使って 数字のアラインメントを小数点で揃えることができる. その他, 複数の回帰モデルの結果を並べて表示したり, その際の表示スタイルも比較的かんたんに調整できる. stargazer
の詳しい使い方はむかし私が書いた『R での分析結果を LaTeX 形式で出力するパッケージ比較 (後編)』を参考に.
(ref:stargazer-title) stargazer
による要約統計量の出力
require(stargazer) stargazer(mtcars, header = F, align = T, type = if(knitr::is_latex_output()) 'latex' else 'html', title = "(ref:stargazer-title)", label = knitr::opts_current$get("label") )
ただし stargazer
はここ数年更新されておらず, R Markdown に対応した機能追加なども行われていないため, 相互参照に対応していない. bookdown
リポジトリの issue #175 にあるように, PDFに限れば簡易的な方法で対処できるが, HTMLでも相互参照するには stargazer_bookdown
のインストールが必要になる.
その他, Hmisc::latex()
, stats::xtable()
という古典的な関数がある. 後者は名前の通り r rmdja::texlogo("LaTeX")
のソースをかなりの自由度で出力できるが, ここまでやるならもう最初から全部 r rmdja::texlogo("LaTeX")
で書いたほうがいいのでは, という気もする. r rmdja::texlogo("LaTeX")
に詳しくない場合, かえって難しいかも知れない. 既に紹介した kableExtra
, huxtable
などでできる範囲でやったほうが簡単だろう.
そのほか有名なパッケージとして, DT
, flextable
, gt
などがある. DT
はインタラクティブな表ウィジェットを作成し, flextable
は Word へのエクスポート機能をフィーチャーしているが, PDF に対しては画像として出力するなどくせがある. gt
は RStudio 社が開発しているパッケージで, huxtable
のように tidyverse
的なシンプルな構文が用意されている一方で, まだ R Markdown の相互参照機能に対応していない[^gt-crossref]. 以上からすでに紹介した kableExtra
や huxtable
がより rmdja
の対応する出力媒体に適したパッケージであり, それ以外のパッケージの詳しい紹介は避ける.
RCB 10.3 Other packages for creating tables も参考にせよ.
[^gt-crossref]: Issue #115 にあるように, 機能を追加したいという声はある. しかし現時点では gt
の R Markdown 対応作業の優先度は高くないようである.
(u)p\BibTeX
{=latex}(u)pBibTeX
{=html} を使う``{block2 upbibtex-customize, type="caution"}
このセクションの説明の理解には多少の
\LaTeX{=latex}
LaTeX{=html} の知識を要する. Ver. 0.4.3 以降では BibLaTeX 用の日本語スタイルとして最低限のクオリティだけは保った
jauthoryear` を用意しているため, どうしても文献リストのスタイルにこだわりたい以外はここで紹介される方法は使わないほうが良い.
`.bst` ファイルのスタイルを使いたい場合, (u)`r rmdja::texlogo("pBibTeX")` が必要であり, そのためには現在の R Markdown および `rmdja` の仕様では, YAMLフロントマターとグローバルオプションを変更する必要がある. 例えば `jecon.bst` を使いたい参考文献リストを出力したい場合, YAMLフロントマターは以下のような記述となる. ```yaml output: rmdja::pdf_book_ja: citation_package: natbib citation_options: numbers biblio-style: jecon bibliogpraphy: citations.bib
r rmdja::texlogo("BibLaTeX")
では citation_options
にスタイルまで指定していたが, natbib
を選択した場合 biblio-style
に .bst
ファイルを指定し, フォーマット関数の citation_options
引数は natbib.sty
に対するオプションを指定する項目となる (トップレベルの natbiboptions
でも可). 上記の例では numbers
を指定しているため本文中の参照トークンは [1]
, [2, 3]
のような番号形式となる. デフォルトは authoryear
, つまり「著者 - 出版年」形式である.
次に, 最初のチャンク, またはコンソールでグローバルオプションを変更する.
options(tinytex.latexmk.emulation = F)
この状態で knit または build すれば .bst
ファイルのスタイルが適用される.
このような操作が必要な理由を説明する. rmarkdown
は tinytex
というパッケージでインストールされたスタンドアローンな r rmdja::texlogo("LaTeX")
処理系で PDF を生成している. しかしこれは (u)r rmdja::texlogo("pBibTeX")
の使用が想定されていない. (u)r rmdja::texlogo("pBibTeX")
は日本語コミュニティで開発されたマルチバイト文字対応版 r rmdja::texlogo("BibTeX")
だから, rmarkdown
開発メンバーたちがこれらの存在に詳しくないのも仕方ないことだ (YiHui 氏は中国出身だが, 中国語圏では BibLaTeX を使うことが多いようだ). 冒頭のチャンクで options(tinytex.latexmk.emulation = F)
を指定することで, 自分のマシンにインストールされた, おそらくあなたが普段使っているであろう r rmdja::texlogo("LaTeX")
処理系に処理させることができる. この方法では latexmk
コマンドを使用してPDFの生成が行われる, その場合TeX Wikiに記載のあるように, 日本語出力のため .latexmkrc
ファイルが必要となっている. rmdja
では natbib
を指定した場合に自動でカレントディレクトリに .latexmkrc
をコピーするようにしている. しかしログが残らないなどデバッグしづらいところがあるため, このやり方はやや使いづらく r rmdja::texlogo("LaTeX")
に対するそれなりの知識を要する. たとえばこの説明を読んで初めて latexmk
の存在を知った, そもそも r rmdja::texlogo("LaTeX")
をどうインストールしたか記憶がない, といった人は慣れるまで大変かもしれない.
pandoc-citeproc
と CSL についてTODO: せめて日本語文献の姓名表示をなんとかしたスタイルを用意する
r rmdja::texlogo("BibLaTeX")
についてr rmdja::texlogo("BibLaTeX")
の全てのオプションに対応しているわけではないので詳しいことは r rmdja::texlogo("BibLaTeX")
のドキュメントを読んでいただきたい. 残念ながら, 日本語の情報は非常に乏しい. ここではよく使う style
のことだけ言及する.
citation_packages
/biblatexoptions
で指定できるのは, インクルード時の style=
に指定できるものに対応する(表 \@ref(tab:biblatex-styles)). つまり, 引用文献の見出しや, 表示順といった設定である. これは引用リストと本文中の引用子のスタイル両方に影響する.
tibble( item = c("`numeric`", "`alphabetic`", "`authoryear`", "`authortitle`", "`verbose`", "`reading`", "`draft`", "`debug`"), description = c("'[1]' のような番号", "著者名の略称+出版年2桁", "著者-出版年形式, natbib の標準と同じ", "著者名のみ, リストでは出版年は後置され, 引用子では脚注になる", "authortitle と同じだが, 引用子にリスト同様の内容を出力する", "個人的なリーディングリスト向け. ファイルやメモ欄も出力する", ".bib ファイルのIDで表示. 名前通り下書き", "`.bib` の全フィールドを表示") ) %>% kable( booktabs = T, caption = "biblatex の `bilio-style` で指定できるもの一覧", col.names = c("名称", "概要"))
その他 apa
, ieee
など特定の学会が使用するスタイルも用意されているが, これらは基本欧文しか想定していないし, アカデミックの事情に詳しい人しかこれらの使用にこだわらないだろうから詳しくは解説しない. これらを含めたそれぞれの出力例は https://www.overleaf.com/learn/latex/biblatex_bibliography_styles に一覧があるのでそちらを参考に. なお, 引用リストのスタイルと引用子のスタイルを個別にすることはできる (bibstyle
/citestyle
)
現時点では各分野の学会で日本語文献に対応した r rmdja::texlogo("BibLaTeX")
フォーマットを配布しているという情報は見つけられなかった. 参考として私のブログで対応のヒントについて書いた^biblatex-note.
TODO: その他の非ラテン文字, キリル文字, アラビア文字 ヘブライ文字等は?
なお, 普段文献管理ソフトを使っていないが, 数本程度の文献を引用リストに載せたい利用者は, biblatex
の構文を利用して書くのがよいかもしれない.
``{block py-warning, type="caution"}
現時点では
reticulateによる Python 実行はグラフィック関係や環境設定でまだまだバギーなところが多い. つまり, エラーが発生した場合には原因が Python 側にあるのか RStudio や
reticulate` パッケージ側にあるのか判断しなければならない. よってあなたがどちらかに習熟していなかったり, まだエラーメッセージを注意深く読む習慣がついていない初心者である場合, 作業が非効率になることが予想される.
Python スクリプトを埋め込むこともできる. 方法は2通りあり, 都度システムコマンドから呼び出す方法と, `reticulate` パッケージを使うものがある. `reticulate` 登場以前はチャンクごとに呼び出していたため複数のチャンクに分割して記述するのが難しかったが, 現在は `reticulate` パッケージを利用することでRと同じような感覚で, あるいは Jupyter のコードセルと同じような感覚で書ける. `pyenv` を使用する場合, 共有ライブラリのインストールが必要なことに注意[^pyenv-lib]. [^pyenv-lib]: 詳しくはこちらを参考に https://ill-identified.hatenablog.com/entry/2019/11/15/010746 初めて使う場合は先に `reticulate` 単体でPythonが実行できるか検証してからの方が良い. ```r require(reticulate) # Python エンジンを認識しているか確認 py_discover_config() repl_python() # 以下, Python コマンド実行, `exit` で抜ける
現在 (knitr
1.18以降) は R Markdown はデフォルトで reticulate
を使う. システムコマンド経由にしたい場合はチャンクオプション python.reticulate=F
を設定する, あるいは reticulate::eng_python
に変わるエンジンを自作する[^reticulate-knitr].
[^reticulate-knitr]: 参考: https://rstudio.github.io/reticulate/articles/r_markdown.html
あとはチャンクのエンジンに r
ではなく python
を指定することでPythonコードを埋め込める.
matplotlib
エンジンで描いたグラフに日本語フォントを埋め込む場合, matplotlib-japreset
を使えば必要な設定を一括で行う.
``{block type="warning"}
matplotlib-japreset` は現在, Linux 以外での動作保証をしていない
```sh pip install -U git+https://github.com/Gedevan-Aleksizde/matplotlib-japreset.git@master
```{python py-settings, echo=T} from matplotlib_japreset import mplj_cairo from matplotlib import rcParams from plotnine import * from plotnine.data import mtcars rcParams['font.family']
`matplotlib-japreset` によって主要OSで標準インストールされている日本語フォントが自動的に選ばれる. 気に入らない場合は `rcParams['font.family']` に好きなフォント名を上書きする. (ref:py-plotnine-cap) Python の `plotnine` によるグラフ表示例 ```{python py-plotnine-cap, echo=T, results='hide', warning=F, fig.width=7, message=F, fig.cap="(ref:py-plotnine-cap)"} ggplot(mtcars, aes('wt', 'mpg', color='factor(gear)') ) + geom_point() + stat_smooth(method='lm') + facet_wrap('~gear')
現状ではmatplotlibの標準出力や警告も表示されてしまうため, チャンクオプション results='hide', warning=F, message=F
で隠すと良い.
matplotlib
ベースのグラフィックを出力したい場合, いくつかの制約がある.
matplotlib
> 3.2 では R がクラッシュするため, 3.2 を使用する必要axes
を使用した場合 (subplot
などが依存), matplotlib.pyplot.show
の呼び出しと, 次に別のグラフを呼び出す前の matplotlib.pyplot.close()
が必要seaborn.FacetGrid
を Cairo デバイスで保存できない ( = フォントのサブセット化処理が複雑になる)よって, 現状では matplotlib
エンジンでグラフィックを描くときはなるべく plotnine
を使ったほうがトラブルが少ない.
また plotly
, bokeh
などの matplotlib
に依存しないモジュールはPDFには対応していないため直接表示できない. 一旦画像を保存して, あらためて画像ファイルを埋め込む必要がある.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.