トップ > サポート > ご利用での Q&A > グラフィックス編

グラフィックス編

は Windows 版固有、 は UNIX 版固有、 は Linux 版固有、 は S-PLUS 2000 版固有の問題です。

質問 一覧

グラフに日本語を出力したいができない。

UNIX 版 S-PLUS で日本語を利用する場合、いくつかの前提条件があります。以下の項目にしたがってチェックしてみてください。

  1. インストールされているのは日本語対応版のS-PLUSか?

    通常日本語対応版の S-PLUS は「V8.2J」のようにバージョン番号に J の文字があります。メディアに添付されているシールなどでお確かめください。

  2. .OS(UNIX)は日本語対応の OS がインストールされているか?

    OS 自体が日本語対応されていない場合は、S-PLUS での日本語利用は保証されません。

  3. OS(UNIX)が日本語環境で動作しているか?

    通常環境変数 LANG などで、ロケールが適切に設定されていないと日本語環境で動作しません。試しにdateなどの簡単な UNIX コマンドを利用して、日本語が出力されるかどうか試してみてください。日本語 OS の利用方法については、各 UNIX のマニュアルをご覧ください。

  4. S-PLUS 内で日本語データの扱いが出来ているか?

    S-PLUS を起動した状態で、日本語データが扱えているかどうか確認してみてください。S-PLUS のオブジェクトに日本語文字データがうまく入っていますか?

  5. 日本語出力可能なウィンドウシステムが動作しているか?

    ウインドウシステム、すなわち UNIX では X-Windows(OpenWindows や CDE、VUE などを含む)が日本語対応になっていなければ、日本語出力はできません。

Example :
% date
1998年01月02日 (金) 23時32分41秒 JST
% Splus
S-PLUS : Copyright (c) 1988, 1996 MathSoft, Inc.
Copyright (c) 1996 Mathematical Systems, Inc.
S : Copyright AT&T.
Version 3.3J Release 1 for Sun SPARC, SunOS 5.4 : 1996
> date()
[1] "1998年01月02日 (金) 23時34分24秒 JST"
> openwin() # Sunの場合
> plot(1)
> text(1,1,date())
# 座標(1,1)に文字列出力する

"X11 Toolkit Error : Can't open display:"というメッセージが出てウィンドウが開かない。

X-Window システム上では、環境変数 DISPLAY が正しく設定されていないとアプリケーションが正しく動作しません。環境変数 DISPLAY が正しく(例えば "unix:0.0" など)に設定されているかご確認ください。

(通常は、ご利用になっているワークステーションやX端末のホスト名が設定されていなければなりません。)

xtermなどの他のXアプリケーションが正常に起動されるかどうか試してみてください。

Example :
% setenv DISPLAY unix:0
% xterm &
% Splus
> motif()

画面が白黒表示なのだが、カラー表示にしたい。

グラフィックスの表示にmotifを利用している場合は、簡単にカラーに出来ます。

motif グラフィックスウインドウの左上にある「オプション(options)」をクリックし、さらに「配色(color scheme)」をクリックすると、下のようなダイアログボックスが表示されます。

ここで、配色パターンをカラーのもの、例えば「熱スペクトラムA(HeatA)」に変更してから、「適用」ボタンをクリックします。これで画面の色表示が変更されます。今後継続的にこの配色を使いたい場合は、「保存」ボタンをクリックします。

「保存」をクリックした場合、ホームディレクトリの下に ".sgraphrc" というファイルが作成されます。これが、現在の設定状態を記憶したファイルです。

S-PLUS を利用する全てのユーザに対して、カラー表示をデフォルトにしたい場合は、下記の操作を行います。

S-PLUS をインストールしているディレクトリを $SHOME とすると、

$SHOME/splus/lib/X11/app-defaults あるいは
$SHOME/splus/lib/X11/locale/ja/app-defaults (ロケールが"ja"の時)

にある、"SPlusMotif" が motif グラフィックスのデフォルト設定を定めたファイル、"SPlusAthena" が X11 グラフィックスのデフォルト設定を定めたファイルになります。

これらのファイルをエディタで編集して、デフォルト設定を変更できます。

motif の場合は、SPlusMotif の sgraphMotif*defaultColorScheme というリソースを変更すれば、デフォルトでカラー表示にすることができます。

X11 の場合は、配色に関する記述のうち、白黒のものをコメントアウトして、カラーのものをコメントを外して生かすことにより、配色を変更できます。

詳しくは X11 に関する各種参考書の「リソース設定」の項をご覧ください。

各種の確率紙とそれに対するプロットをS-PLUSで作成したい。

S-PLUS には、多種類の分布に対する確率点を求める関数が揃っており、またグラフのカスタマイズも非常に容易ですので、製造分野でよく利用される確率紙やプロットの生成を自動的に行うことが出来ます。データのソートなどの事前作業も容易です。手作業と比較して、飛躍的に生産性を向上させ、また正確で美しい出力が得られます。

以下に S-PLUS で確率紙を作成する際のヒントを挙げます。詳細は、各関数のマニュアルをご覧ください。

  1. 分布関数を利用する。

    正規分布、対数正規分布、指数分布、ガンマ分布、ワイブル分布、t分布、F分布その他、さまざまな分布に対して、確率点、下側確率、確率密度、乱数を求める関数が用意されています。例えば正規分布での 5% から 95% での 5% 刻みの点に対応する確率点を求めるには、qnorm(seq(0.05,0.95,0.05)) で求めることが出来ます。

  2. 正規確率なら、関数 qqnorm や qqplot が利用できる。

    関数 qqnorm を利用すれば、データの正規性を視覚的に確認できます。

  3. (ワイブル確率紙など)対数軸を取りたい場合は、関数 plot のオプション log を利用する。

    例えば、log="xy" と指定すると、両対数でプロットを行います。

  4. 図に格子線を入れる場合は、関数plotのオプションtckを利用する。

    plot 利用時に、tck=1 を指定すると、x,y 軸の目盛りの点を基準に格子を描きます。格子線の太さ、色、線の種類(点線など)を細かく指定したい場合は、別途に関数 abline を用いて線を書き込むことが出来ます。abline はベクトルデータを受け入れますので、一気にたくさんの線を描くことができます。

  5. 格子線を入れる場所をコントロールしたい場合は、関数 axis を利用する。

    最初にプロットする際に、plot のオプションの xaxt や axes を用いて、軸を書かないようにします。その後に関数 axis を用いて、任意の位置に軸や線、あるいはラベルを追加します。「S言語2」の axis の項をご覧ください。

  6. プロットの範囲(上限や下限)を指定したいときは、plot のオプション xlim,ylim を利用する。

    xlim や ylim を用いて、プロット範囲を限定し、見やすいグラフを作成することができます。

また、図のマージンを自由に取ることもできるので、あらかじめスペースを空けておいて注釈を書き加えることも出来ます。

以上の操作を対話的に行い、求めるプロットを作成できたら、それを関数に一括定義しておけばいつでも再利用できます。

Example :
# 正規確率紙を作成する
> probs <- c(1:9/100,1:9/10,1:19,seq(20,50,by=2))
> probs <- c(probs,rev(100-probs))/100
# 線を引きたいパーセント点を作成する
> plot(qnorm(probs),type="n",xaxt="n",yaxt="n")
# 座標系設定のためのみで、中身と軸を書かない
> abline(h=qnorm(probs))
# パーセント点に対応した線を引く
> abline(v=1:10*10)
# 縦線は必要に応じて適当に

利用しているうちに、2D・3Dプロットパレットが表示されなくなった。

いつの間にか、ツールバーの 2D・3D プロットボタンをクリックしても、プロットパレットが表示されなくなるように見える場合があります。これは、パレットが消えたのではなくて、うっかりパレットをウインドウの外に「押し出して」しまったケースが多いようです。

以下は 2D プロットパレットの場合を例にとって説明します。

コマンドラインから

guiModify("Toolbar", Name="Plots2D", Hide=F)

と入力してみてください。これで表示されなければ、

guiGetPropertyValue("Toolbar", "Plots2D", "Top")

と入力してみてください。パレットの位置が、ピクセル値で返されます。この値が画面解像度に近い値(例えば 1000 など)なら、パレットの位置がおかしなところにある可能性が大きいです。

この場合は、例えば

guiModify("Toolbar", Name="Plots2D", Top = 200)

と入力してみてください。パレットの上部位置が200に再設定されますので、見えるようになります。

なお、"Toolbar" はプロットパレットオブジェクトのクラス名、"Plots2D" はインスタンス名です。関数の詳細は、help(guiModify) などでリファレンスをご参照ください。

200 x 10 のデータがあり、各要素は高さ方向の情報である。このようなデータを3D表示するには?

行列 Xij の i 行、j 列情報を x 軸、y 軸の座標にして、z 軸はデータの各要素をその座標とします。

まず、関数 expand.grid を使って、座標を作ります。その名前を my.grid とします。

>my.grid <- expand.grid(x=1:200, y=1:10)

そうすると、この my.grid は次のような値を持つデータフレームになります。

>my.grid
   x y
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 6 1
7 7 1
8 8 1
9 9 1
10 10 1
11 11 1
12 12 1
13 13 1
14 14 1
15 15 1
16 16 1
17 17 1
18 18 1
19 19 1
20 20 1

......

次に、そこに高さのデータを与えて、データフレーム my.data にします。高さのデータが行列 my.matrix の場合と、データフレーム my.frame の場合に分けてコマンドを紹介します。

>my.data <- data.frame(my.grid, z=as.vector(my.matrix)) # 行列をベクトルに
>my.data <- data.frame(my.grid, z=unlist(my.frame)) # データ・フレームをベクトルに
注意(S-PLUS4.0 for Windows)データが Microsoft Excel からインポートされた場合は必ずデータフレームになっています。

できたデータを 3 次元表示させますが、作業方法は S-PLUS のバージョンによって、異なります。

S-PLUS3.4 以下の場合

>i<-interp(my.data$x, my.data$y, my.data$z) # データの補間
>persp(i) # 鳥瞰図

S-PLUS4.0 の場合

  1. オブジェクトブラウザの「Data Frame」から「my.data」を選んでダブルクリックして、データウィンドウをオープン
  2. x,y,z の列をこの順番でクリック
  3. 3次元プロットパレットをオープン(ツールバーの3次元グラフの絵柄のボタンをクリック)
  4. 任意のボタンをクリック

もちろん、S-PLUS4.0 の場合、上のコマンドも利用可能です。

グラフのプリンタへの出力がうまくいかない。

Windows の場合、たいがいはプリンタドライバの不調が原因のようです。以下の点をチェックしてください。

  1. 一旦プリンタのリセット、マシンのリブートなどを行ってから再度試してみてください。また、他に利用可能なプリンタがある場合は、他のプリンタで正常出力できるかどうか試してみてください。他のアプリケーションが動作中の場合は、そのアプリケーションを一旦終了させてから試してみてください。
  2. プリンタドライバは正しくインストールされいますか?他のアプリケーションから正常に出力されているか、また「プリンタの設定」からプリンタのプロパティを選び、「印字テスト」で正しく出力されているか確認してみてください。最新のプリンタドライバは、たいがいはプリンタの製造元のWWWサーバ等から取得可能になっている場合が多いですので、最新のドライバを利用してみてください。
  3. ディスク領域は十分に存在していますか?プリント出力時にはスプールと呼ばれるディスク領域を一時的に利用しますので、この領域が確保できないとうまく出力できません。
  4. あまりにも複雑なグラフィックスの場合、システムに負荷がかかりすぎてうまくいかない場合もあります。(この場合は、大概はマシンのリブート、メインメモリの追加、CPU のアップグレードなどのマシン能力の増強などで解決することが多いようです。)とりあえずシンプルなプロットで正しく印刷されることを確認してから、次のステップに進んでください。(例えば、plot(1) など。)
  5. プリンタ出力する前に、「グラフィックスのエクスポート」機能を利用して、グラフをWMF、GIF、JPG などの形式で出力して、ビューアで正しく描画されているか確認してみてください。WMFで正しく出力されていれば、GDIレイヤまでは正しく処理されていることになります。(ドライバ異常の可能性大)

以上のようなチェックを行っても不調が残る場合は、

などを添えて、splus-support@ml.msi.co.jp 宛にご連絡ください。

グラフ描画時に"Lines out of bounds ..."のようなメッセージが出すぎて邪魔だ。

特にあとからグラフに重ね書きなどをする場合、(points、linesなどで)設定された描画領域を越える範囲に対する描画命令が行われると、"Lines out of bounds ..." というようなワーニングが出力されます。

場合によっては、このワーニングが大量に出力されて、大変邪魔に感じる場合があります。このワーニングを抑制するには、

> par(err=-1)

とすると、グラフ描画時のワーニングは抑制されます。

グラフシートに複数ページを作りたい。また、任意の名前を付けたい。

関数 graphsheet を使います。この関数の中で 引数 pages=T を設定します。

>graphsheet(pages=T)        # 複数ページのグラフシートに設定
>plot(....)                            # 1つのグラフシートに必要なだけの作図を行う
>plot(....)

>graphsheet(pages=F)        # 元に戻す

関数 graphsheet を起動すると、起動した数だけのグラフシート(グラフウィンドウ)が作成されます。グラフの上書きをする場合はこの関数を使わないで、plot などを行ってください。

グラフシートに名前を付けるには

>graphsheet(Name="test")

とします。グラフシートの名前は test となります。

品質管理で利用する「パレート図」は描画可能か?

S-PLUS 自体に「パレート図」そのものを描く関数はありませんが、グラフィックスは容易に作成・カスタマイズすることが可能ですので、例えば以下のような関数により作成できます。

以下の関数はあくまでもサンプルです。細部を変更することにより、様々なグラフを作成することが可能になります。

Example :
> x<-c(60,25,15,10,5,3)
> names(x) <- c("キズ","カケ","厚み不足","汚れ","材料","その他")
# 元データの作成
> pareto<-function(){} #paretoという名前で空の関数の作成
> fix(pareto)
# エディタが開いたら、以下をコピー&ペーストする

function(x, label = names(x), ylab = "不良個数", barcol = 2) {
names(x) <- label # 引数labelでラベルを指定できる
x1 <- rev(sort(x)) # 降順でソート
x2 <- 0:length(x1)
y2 <- c(0, cumsum(x))
plot(x2, y2, xaxs = "s", xaxt = "n", yaxs = "s", type = "n", xlab = "", ylab = ylab)
# 座標系を設定し、枠を描画する。xaxsやxaxtで軸目盛を調節
axis(side = 4, at = sum(x)/5 * (0:5), labels = (0:5) * 20)
# 左側軸にパーセント目盛を書きこむ
text(length(x1) + 2 * par()$cxy[1], diff(range(par()$usr[c(2, 4)]))/2, "(%)")
# 左軸に(%)のラベルをつける。位置調節にpar()$cxyとpar()$usrを利用
for(i in 1:length(x1)) {
polygon(c(i - 1, i, i, i - 1), c(0, 0, x1[i], x1[i]), col = barcol)
text(i - 0.5, 0 - 1.5 * par()$cxy[2], names(x1[i]))
# 棒グラフとその下のラベルを描く
}
lines(x2, y2)
points(x2, y2, pch = 1)
abline(h = sum(x), lty = 2, col = 2)
# 補助線の描画
}
> pareto(x)

品質管理で利用するxbar,R,p,pn,c,uなどの管理図は描画可能か?

S-PLUS では、品質管理でよく利用するヒストグラムや累積チャート等はもちろん、各種管理図が描画可能です。これらの図のカスタマイズも容易にできます。

Example :
> qcdata <- matrix(10+rnorm(100), ncol=5) # 乱数でデータを作成
> qccobj <- qcc(qcdata, type="xbar")
> qccobj2 <- qcc(qcdata, type="R")
> par(mfrow=c(2,1))
> shewhart(qccobj)
> shewhart(qccobj2)

(図 xbar-R管理図)


> newdata <- qcdata
> newdata[15:20,] <- newdata[15:20,] + 1/2 # newdataを作成
> cusum(qccobj, newdata, chart.all=T)

カラーポストスクリプトプリンタへの出力が白黒になってしまう。

UNIX 版 S-PLUS では、画面上ではカラーでも、(デフォルトでは)PS プリンタの出力が白黒になりますが、設定によりイメージグラフィックスを含むカラー出力が可能です。(Windows では画面とプリンタとの色調整機能をシステムが持っているのですが、UNIX は手動設定が必要になります。)

手順としては

  1. グラフィックス・ウインドウを開く
  2. グラフィックス・ウインドウのカラーマップを S オブジェクトとして取出す
  3. 取出したカラーマップを ps.options.send でグラフィックス・ウインドウへ送る
  4. グラフィックス・ウインドウからプリンタに送る

となります。カラーマップを取出す際には、polygons や lines、text、background、images などの type を指定する必要があります。(それぞれ別に設定できます)

詳しくは「S-PLUS ユーザーズガイド(薄青色の本)」の317 ページおよび関連リファレンスをご覧ください。

Example :
> motif()
> my.colors <- xgetrgb(type="polygons")
> ps.options.send(colors=my.colors)
> pie(1:5)
# ここでプリンタに出力。バックグランドの指定も可能。
> my.colors2 <- xgetrgb(type="images")
> ps.options.send(image.colors=my.colors2)
> image(voice.five)

PC用のXエミュレータを利用しているが、うまくmotif()などのウィンドウが開かない。

まず、X-Windows の基本設定に問題がないか確認してみてください。

X-Windows の基本設定について

上記の基本設定に問題がない場合は、一般に motif() などで利用するフォントが X エミュレータ側に備わっていない場合が多いようです。

  1. まず、motif()でなく、X11()でウィンドウが開くかどうか試してみてください。
  2. X11()では正常に利用でき、motif()が失敗するような場合、motifのためのフォント設定が必要です。"Splus SHOME"の出力結果(S-PLUSがインストールされているディレクトリ)を$SHOMEとした場合、$SHOME/splus/lib/X11/app-defaults 以下にXの設定ファイルがあります。(日本語版Solarisの場合は$SHOME/splus/lib/X11/locale/ja/app-defaults)このうち、SPlusMotif*がmotif()用の設定ファイルです。
  3. 上記の設定ファイルをコピーした上で編集し、エミュレータに対応したフォントに変更した上で、xrdbコマンドなどでリソースデータベースに登録してからS-PLUSを起動して利用してください。
  4. Solarisの場合は、設定ファイルが多数あります。このうち、SPlusMotif.R5というファイルが、最も汎用的に利用できる設定ファイルです。(デフォルトではSunのコンソールで最も綺麗に出力される設定になっています)

詳しくは、X-Windowsシステムの入門書等をご参考にしてください。

Example :
(日本語版Solarisの場合)
% cd `Splus SHOME`
% cd splus/lib/X11/locale/ja/app-defaults
% ls
./ SPlusAthena.R5 SPlusOpenLook
../ SPlusMotif SPlusOpenLook.F3
SPlusAthena SPlusMotif.F3 SPlusOpenLook.OW2
SPlusAthena.F3 SPlusMotif.OW2 SPlusOpenLook.R5
SPlusAthena.OW2 SPlusMotif.R5 SdlgMotif
% xrdb SPlusMotif.R5

関数 plot で作図する際、カスタマイズのため引数を使いたい。ヘルプのどこを見ればよいか。

help(plot) などで関数 plot のヘルプを引くと、optional argument のところが

 ... methods may have additional arguments.

となっています。この plot という関数は総称関数といわれる関数で、与えられた引数のクラスに応じて、呼び出す関数を変えます。たとえば、関数 lm の結果を plot に与えると、plot.lm という関数が実際には呼び出されます。そのため、plot のヘルプには詳しい解説がなく、作図のためのパラメータ par のヘルプを見ると、plot で一般的に使える引数が一覧になっています。par の中でも、

Figure and Page Areas:
fig, fin, fty, mfg, mfcol, mfrow, oma, omd, omi.
Margins:
mai, mar, mex, oma, omd, omi.

という引数は割り付けパラメータといわれるもので、plot の中では使えません。

Example :
> plot(x, y, log="xy")    # グラフの軸を対数軸に
> plot(x, y, type="l")    # 線のグラフに

2次元正規分布の密度関数、累積密度関数グラフを作成したい。

多次元正規分布のための関数 MVNormal シリーズがご利用いただけます。詳しくは MVNormal のヘルプをご覧ください。

> x <- seq(-3, 3, length=10)
> y <- seq(-3, 3, length=10)

# x,y の確率点を作成

> xy <- expand.gird(x, y)

# x, y のすべての組み合わせ座標を作成

> z <- apply(xy, 1, dmvnorm)

# apply を使って、xy のすべての行(一意の組み合わせの x,y 座標)に対して、その組み合わせでの密度を求める。(apply という関数は行列の行、あるいは列すべてに、3番目の引数で指定した関数を当てはめます。当てはめる関数の1つ目の引数が必ず、当てはめ計算を行うベクトルになっているかどうか、確認してください)

> xyz <- data.frame(xy, z=z)
> names(xyz) <- c("x", "y", "z")

# x,y と 密度の z を持つデータにする

こうしてデータを作成した上で、GUI などから、3次元の鳥瞰図などを作成してください。(Windows 版の場合)UNIX 版の場合、次のようなコマンドでグラフを作ることができます。

> wireframe(z ~ x*y, data=xyz)

密度関数ではなく、累積密度関数にして作図する場合は、上記コマンドの dmvnorm を pmvnorm に変えてください。

左:2次元正規密度関数、右:2次元正規累積密度関数

plot で作成するグラフの色を変えたいのだが、オプションで色を変更してから、色番号指定をしても変わらない。

メニューバー「オプション / カラースキーム」で、「Standard」の色を変更します。

「Edit Color」ボタンをクリック、左上から順に(下へ向かって)色番号が割り当てられていますので(つまり、1番が黒、2番が紺色...)、変えたい番号の位置にある色をクリック、選択されたら、上のパレットから新しく使いたい色をクリックして、右下「色の追加」ボタンをクリックします。

ただ、この設定だけでは、実際に

> plot(...) > points(..., col=2)

などとしても、変わりません。plot(...) の前に、明示的にこのカラースキームを使うことを指定する必要があります。

> graphsheet(color.scheme="standard")
> plot(...)
> points(..., col=2)

# graphsheet はグラフ・ウィンドウを開くための関数で、通常は特に呼び出す必要がありませんが、このように、カラースキームを指定したり、既存のグラフに上書きをさせず、新しいウィンドウに出力したい時に用います。

関数 legend で凡例を表示させているが、座標を指定しないといけないので、グラフの値範囲が変わると指定しなおさなければならない?

legend は凡例を表示させる位置の座標を必ず指定する必要があります。

代わりに、関数 key を用います。key では、legend 同様、座標の指定も可能ですが、「グラフの右上」などの相対的な位置指定も可能です。次のコマンドでは、グラフの右上に凡例が表示されます。

> plot(...)
> key(text=list(c("A", "B")), lines=list(lty=1:2, col=1:2))

# 座標を指定しないと、デフォルトで右上に凡例を表示

引数 corner を指定すると、左上にすることも可能です。

> key(corner=c(0,1), 
   text=list(c("A", "B"), col=2), 
   lines=list(type=c("l", "p"), lty=c(1, -1), pch=c(-1, 1), col=1:2))

# 左上に、テキストの色を色番号2番、凡例は1つ目が線、2つ目がシンボル、線の種類とシンボルの種類をそれぞれ、lty と pch で指定、色も変えた。