KuboWeb top

更新: 2012-09-24 21:50:27

生態学のデータ解析 - R 作図の日本語表示

  • R 作図の日本語表示について (2009-06-21 時点のもの)
    • 本/R Graphics 日本語版 の「訳者あとがき」に掲載できなかったハナシ
    • ちなみに掲載したハナシは以下のようなかんぢで ……
      • pdf() などで日本語を表示したければ family = "Japan1" と指定せよ
      • UTF-8 文字コードも使える
      • 半透過 (semi-transparent) 色指定はいろいろな device で使えるようになってる
      • その他
    • なかまさんからいろいろと教えていただき,内容に関しては久保が勝手にまとめてしまいました
      • なかまさんの御承諾をえてはいますが


とくに重要?! 

  • R-2.7.0 以降では
    • family="symbol" は指定できない
    • GraphicDeviceの I/F 上は UTF-8のやりとりをサポートしました (基本的には)
  • fontfaceはたぶん歴史的位置に居ます. 今後はfamilyが主体になるはずです.
    • family(1=標準, 2=太字, 3=斜体, 4=斜体太字) 5 は Symbolで予約.

X11() デヴァイスでの挙動 

  • Xlib な X11() なら斜体はでる
    • 今どきのlibfreetypeはTTCapが使えるので, TTCapの機能で RHL系のディストリビューションはTrueTypeフォントを元に斜体や太字をXLFDに展開して使えます.
    • type="cairo" では斜体がでない?
      • と思ったらこれは久保の Cairo が古い (1.2.4) ためでした
    • MacOSXの X11 は古典的な日本語フォントしか無く, ひらぎのはOpenTypeで提供(中台韓はTrueType...)されており, 標準ではどうやっても斜体,太字が出せません.
  • Cairo なデヴァイスではうまくいかない場合もある
    • fontconfig に依存するので, Cairoの設定が旨く行ってないのかも. CairoやPangoはまだ発展途上ですし.

pdf() デヴァイスでの挙動 

  • PDFだと, 以下のような国際色豊かな作図も可能です.
pdf(family="Japan1")
title("hoge",family="Helvetica")

tcltk() なデヴァイス 

  • たぶん, tcltkを触るのでは無く, Rcmdr や affylmGUI 経由で...
  • MacはAquaのTkもあるのですが, イベントを旨く処理できません.

フォント名について 

  • Japan1 の意味は?
    • Adobe-Japan1の1です. AdobeのEncodingの名前です.aj14は Adobe-Japan1-4です.(4とか6はバージョン) 本来なら, Adobe-Japan1-6-GoticBBB とか長いので, Adobeやらはしょって, Japan1GothicBBBとかにしました. かつては Adobe-Japan2(いわゆる補助漢字)もありましたが, 1-6以降無くなりました, CNS1,GB1, Korea1は元から1しかありません.
    • 仕様書は http://partners.adobe.com/public/developer/en/font/5078.Adobe-Japan1-6.pdf

Hershey な EUC 

  • Hershey のEUCは, JISの第一水準のみしか扱えません.
    • ?Japanese 参照

文字コード「自動」認識について 

(久保が質問,なかまさんから回答いただいた)

ところで,もうひとつ質問があるのですが,R-2.7.0 からは UTF-8 が作図など に使えるといったご指摘について考えたのですが,そもそも処理系ごとに異な るデフォルトの日本語文字コードについて,ユーザーの立場からすると,あた かも R が自動認識して処理しているように見えます.このような文字コードに 対処する動作に関しては「R が自動的に認識している」といったたぐいの表現 を使用して問題ないでしょうか.

?Encoding をしていただくと分かると思うのですが, native,latin1,utf-8の

\# native => unknown

状態を保持出来るようになっています. iconvでnative,utf-8変換するので, 自動認識と言う意味ではその通りですが, まだ開発途中と言った方が適切 かと思います. 将来的には, m17nになる予定です. ですので

「R側で可能ならば自動的に認識している」

と言う感じかと思います.

RCurl等では,

data<-iconv(getURL("http://www.ism.ac.jp",.encoding=1),"cp932","")

http://www.ism.ac.jp はsjisで書いてありますから, iso8859-1(.encoding=1)で取り込んで, iconvにはそれを, "cp932"だと偽って処理させてる訳です.

# 要するに場あたり的に各方面で...

これがナイスアイデアかどうかは微妙ですが, 他の言語が歩んだ方式も 副作用もRもまた歩むと言う事です.

wineなんかも, LANG=C で Rを起動すればちゃんと動きますよね. wineの中はANSIしか動きませんので, Unicodeに完全に対応しても マズイ面もあります.

まあ, そんな難しい物では無いのですが, 作業が膨大と言うのは 間違いないでしょう.

(あまりにも面白かったので次のメイルも勝手ながら引用)

そして,どのプログラミング言語もここで苦しむことになるようですね.

通常の言語では, パース, 文字列関数, グラフィック関係が別担当者ですが,

        「Ripley特攻隊」

とも表現すべき努力が払われます. これら戦略上重要な事ではありますが, 現地徴用兵として竹槍でゲリラ参戦している身とすれば,

        「最近老眼が辛い!」

のでもっと助けが欲しいですね. やっぱり.

  • (久保感想) なかまさんの尽力もたいへんなものですが,ソフトウェア開発とは本来はあまり関係なさそうな Ripley 御大 (高名な統計学者) の「特攻」ぶりはたいへんなもので,おかげで我々は R のようなソフトウェアを研究に使えているわけで……
    • Ripley さんに限らず,昨年末に日本にちょっと来られた R 開発コアメンバーのひとたちとか,R 日本語ドキュメントをまとめられた間瀬さんとか,じつに多くの人々の献身のうえに R というソフトウェアの開発は驀進しているんだなぁ,ということで.

なかまさんの .Rprofile 

  • 2009-06-21 時点のもの
setHook(packageEvent("grDevices", "onLoad"),
	function(...){
        if(.Platform$OS.type == "windows")
            grDevices::windowsFonts(sans ="MS Gothic",
                                    serif="MS Mincho",
                                    mono ="FixedFont")
        if(capabilities("aqua"))
            grDevices::quartzFonts(
              sans =grDevices::quartzFont(
                c("Hiragino Kaku Gothic Pro W3",
                  "Hiragino Kaku Gothic Pro W6",
                  "Hiragino Kaku Gothic Pro W3",
                  "Hiragino Kaku Gothic Pro W6")),
              serif=grDevices::quartzFont(
                c("Hiragino Mincho Pro W3",
                  "Hiragino Mincho Pro W6",
                  "Hiragino Mincho Pro W3",
                  "Hiragino Mincho Pro W6")))
        if(capabilities("X11"))
            grDevices::X11.options(
                fonts=c("-kochi-gothic-%s-%s-*-*-%d-*-*-*-*-*-*-*",
                        "-adobe-symbol-medium-r-*-*-%d-*-*-*-*-*-*-*"))
        grDevices::pdf.options(family="Japan1GothicBBB")
        grDevices::ps.options(family="Japan1GothicBBB")
        }
)

attach(NULL, name = "JapanEnv")
assign("familyset_hook",
       function() {
            winfontdevs=c("windows","win.metafile",
                          "png","bmp","jpeg","tiff")
            macfontdevs=c("quartz","quartz_off_screen")
            devname=strsplit(names(dev.cur()),":")[[1L]][1]
            if ((.Platform$OS.type == "windows") &&
                (devname %in% winfontdevs))
                    par(family="sans")
            if (capabilities("aqua") &&
                devname %in% macfontdevs)
                    par(family="sans")
       },
       pos="JapanEnv")
setHook("plot.new", get("familyset_hook", pos="JapanEnv"))
setHook("persp", get("familyset_hook", pos="JapanEnv"))

# Winでは Rdevga を触ると, fontfaceに影響するので, より正しくは上記の
# 方法が現在理想とされる設定かもしれません.

# このシステムの開発が終わる事は無いでしょう.