5.属性

5.1 はじめに

線や記号、文字列や領域の塗りつぶしといったプリミティブの "見た目" は、属性(primitive attributes)を変更することで変わる。この属性の変更のために、PGPLOT では以下のようなルーチンを使うことができる。

カラーインデックス:
PGSCI.
色の表現:
PGSCR, PGSCRN, and PGSHLS.
線の種類:
PGSLS.
線の幅(太さ):
PGSLW.
文字の高さ:
PGSCH.
文字のフォント:
PGSCF.
文字列の背景色:
PGSTBG.
塗りつぶしのスタイル:
PGSFS, PGSHS.

これらの属性変更ルーチンは、第4章までで説明した描画ルーチン(プリミティブ)と自由に混合することが出来る。基本的には 属性を設定し、それに従って描画するという順序で作図が進められる。いったん、ある属性が該当するルーチンによって指定されると、それが改めて指定されるまでは効力が持続する。

上のリストを見ても明らかな通り、属性を指定する PGPLOT のルーチンの名前は PGSxx のように統一されている。これに対して、現在の属性を問い合わせるルーチンもあって、それらは PGQxx のような名前をしている。

5.2 カラーインデックス

この属性は、すべてのプリミティブに影響する。すなわち、線の色も、記号の色も、文字列の色も、塗りつぶしに使われる色も、すべて共通のカラーインデックスで操作される。このカラーインデックスを指定するルーチンは PGSCI である。

色は、カラーインデックス(color index)(本文書では"色指定子"とも呼ぶ)という整数のパラメータを使って選択する。色指定子 "1" が既定色を表し、色指定子 "0" は背景色を表す。

既定色と背景色はデバイスによって異なる。例えば、大半の印刷用デバイス(紙など)では白が背景色で黒が既定色になっているが、画面ではその逆である。また、利用できる色指定子の数(=色の数)もデバイスによって異なる。多くの白黒デバイスでは "0" と "1" という2種類の色指定子しか使えないが、カラーの CRT デバイスでは 0〜255 の色指定子が使える。また、白黒デバイスの中にも、明るさ(強度)を選択する目的で比較的多数のカラーインデックスを利用できるものがある。

また、色指定子 "0" (背景色)は、そこまでに描いた作図要素に重ね書きすると、見かけ上それらを「消す」のにも使える。ただし、すべてのデバイスでこの消去機能が使える訳ではない(プロッタなど)。

新しい色指定子を指定するには、PGSCI を使う。たとえば、

     CALL PGSCI(2)
     CALL PGLINE(100, XP, YP)
     CALL PGSCI(3)
     CALL PGPT(15, XP, YP, 17)

と書くと、色指定子 "2" に割り当てられている色(既定値では赤;Fig.5.1を参照)で線を引き、次に色指定個 "3" に割り当てられている色(既定値では緑;Fig.5.1を参照)で記号を描くことになる。

Appendix D には、種々のデバイスにおける色の表現能力がまとめられている。すべてのデバイスについて、既定色は "1" である。また、多くのデバイスでは背景色もしくは消去を表す色指定子として "0" を受け付ける。さらに、幾つかのデバイスでは "15" あるいはそれ以上までの色指定子を利用できる。色指定子の最大値は一度に表示することができる色の数である。

また、デバイスによっては、色と色指定子の割り当て(色テーブル)を変更できる。その場合は、PGSCR を使う(次節参照)。選択したデバイス上で利用できる色指定子の範囲は、PGQCOL を使って調べることが出来る。

5.3 色の表現

PGPLOT では、各々の色を HLS 系(Hue, Lightness, Saturation)か RGB 系(Red, Green, Blue)のどちらかで表現する。(R,G,B) は、赤、緑、青の3原色の強さを各々 0.〜1. (1. が最大)の間で表し、R=G=B の時はグレースケール(白〜灰〜黒)になる。HLS 系では、Hue が 0.〜360. の間の角度で表現される巡回値(色彩を与える)で、L と S の値は 0.〜1. の間で指定される。

次の表と Figure 5.1 は、PGPLOT の既定色の一覧である。多くのデバイスでは、PGPLOT が開始されるとこの色テーブルが設定される。ただし、前にも述べたように、背景色と既定色はデバイスによって異なる場合がある。特に、あるデバイス(紙出力系)では白地の背景に黒の既定色(色指定子 "0" = 白, 色指定子 "1" = 黒)であるのに対して、別のデバイス(画面系)では黒地の背景に白が既定色(色指定子 "0" = 黒、色指定子 "1" = 白)である点には注意が必要である。

以上のように、0〜15 の色指定子には前もって色が割り付けられているが、PGSCRPGSCRN、あるいは PGSHLS のルーチンを使うとこれらを変更することが出来る。

Table 5.1. 既定値の色テーブル

色指定子 (H, L, S) (R, G, B)
0 黒 (背景色)0., 0.00, 0.000.00, 0.00, 0.00
1白 (既定色)0., 1.00, 0.001.00, 1.00, 1.00
2120., 0.50, 1.001.00, 0.00, 0.00
3240., 0.50, 1.000.00, 1.00, 0.00
40., 0.50, 1.000.00, 0.00, 1.00
5シアン (緑+青)300., 0.50, 1.000.00, 1.00, 1.00
6マゼンダ (赤+青)60., 0.50, 1.001.00, 0.00, 1.00
7黄 (赤+緑)180., 0.50, 1.001.00, 1.00, 0.00
8オレンジ (赤+黄)150., 0.50, 1.001.00, 0.50, 0.00
9黄緑210., 0.50, 1.000.50, 1.00, 0.00
10緑+シアン270., 0.50, 1.000.00, 1.00, 0.50
11青+シアン330., 0.50, 1.000.00, 0.50, 1.00
12青+マゼンダ30., 0.50, 1.000.50, 0.00, 1.00
13赤+マゼンダ90., 0.50, 1.001.00, 0.00, 0.50
14濃灰色0., 0.33, 0.000.33, 0.33, 0.33
15淡灰色0., 0.66, 0.000.66, 0.66, 0.66
16-255未定義  

すべてではないが幾つかのデバイスでは、色と色指定子の割付けを変更することができる。PGSCR を用いれば (R,G,B) の3成分を使って色を指定することができる。また、PGSHLS を使えば (H,L,S) の3成分を使って色を設定することが出来る。さらに、PGSCRN を使えば名前で色を特定することも出来る。ちなみに、このルーチンを使うと背景色を再定義することもできる。

色の表現を変更することによる効果は、デバイスによって異なる。多くのデバイスは概ね次の3種類に分類される:静的色(変更不可)、疑似カラー(色のルックアップテーブルを持つ)、そして直接色である。静的色表現によるデバイス(例えば、pen plotters, Printronix printer, Tektronix terminal)では、色の表現を変えようとしても無視される。疑似カラー系のデバイス(例えば、多くの X Window devices)では、色の表現を変えると、それに対応する色指定子のルックアップテーブルが変更される。色表現の変更前にその色指定子に割り付けられていた色で描かれた部分も、このテーブルの書き換えによって、新しい色で描き直される。最後に直接色系のデバイス(例えば、PostScript color printers, some X Window devices)では、色表現を変えると、その後にその色指定子で描かれた部分だけが、色の変更の影響を受ける。

白黒でも、その濃淡を表現できるデバイスでは、指定された (R,G,B) から強度 I が計算される。この時の計算式は、

     I = 0.30 R + 0.59 G + 0.11 B

で与えられる。これは米国のカラーTVで採用されている NTSC エンコーディングと同じ仕組みである。

RGB 系で色表現を設定する

PGSCR を用いると、赤、緑、青の3色の強さを 0.0(暗い)〜1.0(最も強い)の範囲で指定して色を調合できる。次の例では、色指定子 "2" を暗い青色に変更することができる:

     CALL PGSCR(2, 0.0, 0.0, 0.3)


HLS 系で色表現を設定する

PGSCR の代わりに PGSHLS を用いると、Hue(色彩), Lightness(明るさ), Saturation(飽和度)の3成分で色を定義することが出来る。Hue は色彩を 0.〜360. の角度で表すパラメータで、赤が 120. に、緑が 240. に、そして青が 0.(あるいは 360.)に対応する。比喩的には、虹の色合いを 0.〜360. の角度に割り振ったようなイメージになる。Lightness(明るさ)は 0.〜1. の間で指定され、0. にすると黒、1. にすると白になる。「どれだけ暗く、あるいは白っぽくするか」を決めるパラメータである。最後に、Saturation(飽和度)は、やはり 0.〜1. の間で定義され、0. にすると灰色、1. にすると Hue で指定した純粋な色となる。飽和度を 0. にすると、Hue は意味がなくなる。

H L S R G B
任意 0.0 0.0 0.0 0.0 0.0
任意 1.0 0.0 1.0 1.0 1.0
中位の灰色 任意 0.5 0.0 0.5 0.5 0.5
120. 0.5 1.0 1.0 0.0 0.0
180. 0.5 1.0 1.0 1.0 0.0
ピンク 120. 0.7 0.8 0.94 0.46 0.46

名前で色表現を指定する

PGSCRN を使うと、名前で色を特定することができるらしい。しかし筆者には仕組みが理解できなかった。詳しくは英語版マニュアルの該当部分を参照のこと。

実行時に背景色と Foreground colors を設定する

これについても省略。詳しくは英語版マニュアルの該当部分を参照のこと。

5.4 線の種類

PGPLOT で使用できる線種は、実線、破線、点線、一点鎖線、三点鎖線の5つである。ユーザは、これらの中から PGSLS ルーチンを使って好みのものを選択できる。既定値は実線である。呼び方は

     CALL PGSLS ( itype )

であり、引数(整数)が以下のように線種に対応する:

  1. full line,
  2. long dashes,
  3. dash-dot-dash-dot,
  4. dotted,
  5. dash-dot-dot-dot.

例えば、ある620点を結ぶ破線を描きたい時は、

      CALL PGSLS(2)
      CALL PGLINE(620, X, Y)

のようにすれば良い。この属性の変更によって影響を受けるのは『線』だけである。

5.5 線の幅(太さ)

「線の幅」の変更は、線、記号(グラフマーカ)、文字列に影響する。PGSLW ルーチンを用いて

     CALL PGSLW ( 5 )

のように指定する。引数は、線の太さに対応する整数で、0.005インチ(0.13 mm) が "1" に対応し、その整数倍(ただし、1〜201 倍まで)で指定する。上の例では、0.65mm の太さの線を指定したことになる。

実際の線幅の見た目は、デバイスの分解能にも依存するので、必ずしも指定通りにはならない。しかし PGPLOT では、できるだけそれに近づくように設定される。

5.6 文字の高さ

『文字の高さ』の変更は、記号(グラフマーカ)と文字列に影響する。PGSCH ルーチンを使い、既定の文字の高さの実数倍で指定する。PGPLOT における文字の高さの既定値は、ビューポートの高さか幅のどちらか小さい方の 1/40 倍に決められている。

次の例は Figure 4.2を描くために使ったプログラムの一部である。参考にされたし。

      CALL PGSCH(1.5)
      CALL PGSLW(3)
      CALL PGTEXT(0.05,10.0,'Bigger (1.5)')
      CALL PGSCH(0.5)
      CALL PGSLW(1)
      CALL PGTEXT(0.5,10.0,'Smaller (0.5)')
      CALL PGSCH(1.0)


5.7 文字の書体(フォント)

『文字の書体(フォント)』の変更は、文字列だけに影響する。PGPLOT で使えるフォントは以下の4種類である。

  1. normal (simple) font (既定値),
  2. roman font,
  3. italic font,
  4. script font.

書体を変えるには PGSCF ルーチンを使う。例えば、"SPQR" という文字列を指定した場所にローマ字書体で書きたい場合は、

     INTEGER ROMAN
     PARAMETER (ROMAN=2)
     ...
     CALL PGSCF(ROMAN)
     CALL PGTEXT(X, Y, 'SPQR')

のように CALL する。

5.8 文字列の背景色

この属性の変更は、文字列の見た目に影響する。既定値では文字は『透明』であり、文字列と他の作図要素が重なった場合には文字と文字の間からその作図要素が見えるようになっている。これを設定により『不透明』にも出来、その場合は文字列を書く前に指定色で周辺(ちょうど文字列を囲うくらいの矩形領域)が塗りつぶされる。この属性の変更は、PGSTBG ルーチンを使って行う。

-1 透明な文字列(既定値)
0〜255 不透明な文字列。引数が背景色を表す色指定子。"0" にすると、文字と重なるグラフィックスが消去される。

PGSTBG で指定した色指定子が PGSCI で指定した物と同じ場合は、文字が背景色と同じ色で書かれることになるため、その文字列は読めなくなる。

次の例では、青い背景の上に黄色の文字列が描かれる:

     INTEGER YELLOW, BLUE
     PARAMETER (BLUE=4, YELLOW=7)
     ...
     CALL PGSCI(YELLOW)
     CALL PGSTBG(BLUE)
     CALL PGTEXT(X, Y, 'SPQR')


5.9 塗りつぶしのスタイル

PGPLOT では、solid (現在の色で領域を塗りつぶす)、outline (領域の輪郭だけが描かれる)、hatched (斜線で影を付ける)、cross-hatched (クロス斜線で影を付ける) の4種類の中から塗りつぶしのパターンを選んで使うことが出来る。

この属性を変更するには、PGSFS ルーチンを使って

     CALL PGSFS ( ISTYLE )

のように指定する。前述の各パターンが各々

のように 1〜4 の整数に対応しており、これを PGSFS の引数として指定すれば良い。Figure 5.2 に、これらの塗りつぶしの例を示しておく。

この属性の変更は、多角形 (PGPOLY)、円 (PGCIRC)、そして矩形 (PGRECT) の描画に影響する。

次の例では、輪郭とベタ塗りの両方を使っている。具体的には、まず矩形領域を消去し(正確には、色指定子 "0"(=背景色)を使ってベタ塗りし)、それから矩形の外枠を描いている(正確には、色指定子 "1" を使って輪郭を描いている):

     CALL PGSCI(0)
     CALL PGSFS(1)
     CALL PGRECT(0.31, 0.69, 0.85, 0.97)
     CALL PGSCI(1)
     CALL PGSFS(2)
     CALL PGRECT(0.31, 0.69, 0.85, 0.97)

塗りつぶしのパターンをハッチング(斜線)にした場合の斜線の間隔や傾きは、PGSHS で変更することが出来る。

5.10 問い合わせ用のルーチン群

属性を変更する際に、既定値(あるいは変更前の値)を何処かへ保存しておいて、一時的に変更し、また元に戻したい場合があり得る。このような時のために、現在の属性値を問い合わせるためのルーチンが用意されている。たとえば、文字の高さを設定するルーチンは PGSCH であったが、PGQCH を使うと現在の文字の高さを知ることができる。

この機能を使い、例えば

       INTEGER LW, CI
     *  save the current attributes
       CALL PGQLW(LW)
       CALL PGQCI(CI)
     *  change the attributes and draw something
       CALL PGSLW(2)
       CALL PGSCI(11)
       CALL PGLINE(7, X, Y)
     *  restore the attributes
       CALL PGSLW(LW)
       CALL PGSCI(CI)

のようにすると、中程で線を引く時だけ線の太さと色を変更し、その後で元の設定に戻すことが出来る。

同じような問い合わせのためのルーチン群が、種々の属性について用意されている。例えば、PGQWIN を使うと現在のウィンドウ設定を知ることが出来、PGQVP を使うと現在のビューポート設定を知ることも出来る。

5.11 属性の保存と復元

図のある一部分を描くときだけ属性を変更し、あとで元の属性に戻せると便利な場合がある。これは、PGSAVE ルーチンと PGUNSA ルーチンを組み合わせることにより実現できる。

PGSAVE を CALL すると現在の PGPLOT の諸属性がある場所に保存され、PGUNSA を CALL した時に復元される。これらによって保存・復旧される属性は、文字の書体(フォント)、文字の高さ、色指定子、塗りつぶしのスタイル、線種、線の太さ、ペンの現在位置、矢印の頭の形、ハッチングのスタイル(斜線の間隔と傾き)である。ただし、色の表現(カラーテーブル)は保存されない。

PGSAVEPGUNSA とは常にペアで使われるべきものである。過去 20 回の PGSAVE の保存分まで、PGUNSA で復元することができる。この場合は、PGSAVE で最後に保存した結果が最初の PGUNSA で復元される。複数のデバイスを同時使用している場合は、どのデバイスについて保存したものであれ、最後の PGSAVE で保存された属性が PGUNSA で復元される(デバイス毎の属性保存は出来ない、という意味らしい)。

これらのルーチンを使うと、前節で示した例は、次のように簡単化される:

    *  save the current attributes
      CALL PGSAVE
    *  change the attributes and draw something
      CALL PGSLW(2)
      CALL PGSCI(11)
      CALL PGLINE(7, X, Y)
    *  restore the attributes
      CALL PGUNSA

Previous: 第4章  Next: Chapter 6  目次