「Image_Graph」を使ってy軸の数値が反転したグラフを作成する

昨日の問題を解決したので報告。

 1┼
  │
 5┼
  │
10└┼-┼-┼-┼-┼
     1  2  3  4  5


上記のようなレイアウトのグラフが作れないという問題だったが、グラフを2個重ねることによって解決できたので報告。
(ソースをいじれば1個のグラフでいけそうだったけど、面倒くさかったのでやめました)


作り方

  1. 同じ線グラフを2個作る(AとBを作る)
  2. 片方の線グラフ(B)の線を消す
  3. Aのx線を消す
  4. Bのy線を消す
  5. Aのグラフをy軸に対して反転


あとはpadding等で位置を調整してあげればOKです。

こんな感じになります。


以下ソース

<?php
include_once('Image/Graph');
// create the graph
$Graph =& Image_Graph::factory('graph', array(400, 300));

// add a TrueType font
//$Font =& $Graph->addNew('font', 'Gothic');
// set the font size to 11 pixels
//$Font->setSize(10);

//$Graph->setFont($Font);

// setup the plotarea, legend and their layout
$Graph->add(
     $Plotarea1 = Image_Graph::factory('plotarea')
);
$Graph->add(
     $Plotarea2 = Image_Graph::factory('plotarea')
);   

$Dataset1 =& Image_Graph::factory('dataset');
$Dataset1->addPoint('a', 19);
$Dataset1->addPoint('b', 12);
$Dataset1->addPoint('c', 16);
$Dataset1->addPoint('d', 7);
$Dataset1->addPoint('e', 21);

$Plot1 =& $Plotarea1->addNew('line', array(&$Dataset1));
$Plot1->setLineColor('red');                  
$Plotarea1->hideAxis('x');
$Plotarea1->setAxisPadding(20, 'left');
$Plotarea1->setAxisPadding(30, 'bottom');

$AxisY1 =& $Plotarea1->getAxis('y');
$AxisY1->setInverted(true);
$AxisY1->forceMaximum(25);

$Plot2 =& $Plotarea2->addNew('line', array(&$Dataset1));
$Plot2->hide();
$Plotarea2->hideAxis('y');
$Plotarea2->setAxisPadding(30, 'left');

// output the Graph
$Graph->done();
?>

phpでグラフを書く「Image_Graph」

インストール

pear環境がないのでサイトからダウンロードして使うことにした。

以下の3つをDL
http://download.pear.php.net/package/Image_Graph-0.7.2.tgz
http://download.pear.php.net/package/Image_Canvas-0.3.0.tgz
http://download.pear.php.net/package/Image_Color-1.0.2.tgz

phpのpathの通った場所にImageディレクトリを作成する。
上記3つを解凍し中の

Image_Graph-0.7.2/Graph.php
Image_Graph-0.7.2/Graph/*
Image_Canvas-0.3.0/Canvas.php
Image_Canvas-0.3.0/Canvas/*
Image_Color-1.0.2/Color.php

を今作ったImageディレクトリに入れればOK.
あとはソース中で

<?php
require_once('Image/Graph.php');
?>

とすれば、使えるようになります。


pearによるインストールの仕方はここを参照してください。

Side-B » Blog Archive » PHPPEARのImage_Graphライブラリをインストールしたときのメモ

http://side-b.sto.co.jp/weblog/archives/112


フォントの設定はここらへんを参照

HPのテクメモ | Image_Graphを使ってみる

http://php.atseason.com/?eid=523760


日本語はここらへんを参照

Side-B » Blog Archive » PHPPEARのImage_Graphライブラリをインストールしたときのメモ:

http://side-b.sto.co.jp/weblog/archives/category/php/pear/image_graph/


fileencodingがutf-8なら、日本語フォントを指定してあげれば、graphの出力をutf-8とかしなくて大丈夫っぽいみたいですが。

使う

こことか

PHPBuilder.com, the best resource for PHP tutorials, templates, PHP manuals, content management systems, scripts, classes and more.

http://www.phpbuilder.com/columns/ian_gilfillan20060613.php3


こことか

pear.veggerby.dk - Image_Graph Samples

http://pear.veggerby.dk/samples/


のソースをコピペしたり、値いじったりして触って行けば、大体理解できます。
あとは、自分がやりたいことの機能があるかソースを調べるとか。

流れ

大体の流れ

  1. Graphクラスのインスタンス(以下graph)を作成
    1. graphからfont(フォント)を作成
      1. fontをカスタマイズ(色、大きさ、フォントタイプ)
      2. graphにfontを登録
    2. graphにplotarea(描画領域)を登録(add)
      1. protareaからdataset(データ)を作成
        1. datasetに座標や数値を登録
        2. datasetをprotareaに登録
      2. marker作って登録等オプションの設定
      3. protoareaをカスタマイズ(色をつけたり)
      4. protoareaからaxis(軸)を取り出してカスタマイズ
  2. 描画
線グラフ作ってく中でメモ
  • add
    • 描画領域の追加
  • add***
    • オブジェクトの追加
  • 色関係
    • Color.phpに使用可能な色が書いてあるので参照
    • orange@0.1のように@のあとに数値を書くと透明度を指定できる
    • setFillColor
      • 背景色
    • setBorderColor
      • 枠色
    • setFontColor
      • 文字色
  • 軸関係(axis)
    • showArrow/hideArrow
      • 軸の矢印の表示/非表示
    • forceMinimum/forceMaximum
      • 軸の最小値/最大値を強制的に指定
    • setLabelInterval
      • 軸の表示ラベルの間隔指定
    • setInverted
      • 上下反転
悩む
 1┼
  │
 5┼
  │
10└┼-┼-┼-┼-┼
     1  2  3  4  5

こんなかんじでy軸に対して小さい数字が上に来るようなグラフを作りたいのですが、うまくいかない・・・。

<?php
$AxisY =& $Plotarea->getAxis('y');
$AxisY->setInverted(true);
?>

でy軸に対して小さい数字が上に来るようには出来るのですが、x軸が勝手に上に表示されるようになってしまうため、思い通りのグラフが作れません!
サンプルにもこの形式のグラフが載っていないので、デフォルトでは作れないようになっているのかなーと感じながらも、ソースを見たりしてうんうん頭を悩ませているところです。


回答を知っている方がいたら教えてください><

fileencodingを変更する場合に日本語の文字化けを避ける方法

例えばeuc-jpで書かれているファイルのfileencodingをutf-8に変更したい場合、

:e ++enc=utf-8

とやってutf-8で開いた後、保存をすれば良い。


ただし、当然ながら日本語は文字コードが合わず文字化けしてしまう。

  1 #include <stdio.h>
  2 
  3 int main()
  4 { 
  5     printf("僕らの隊長は最高だ!");
  6     return 0;
  7 }

これが

  1 #include <stdio.h>
  2 
  3 int main()
  4 { 
  5     printf("?&#868;?????&#313;?&#1018;&#505;??
  6     return 0;
  7 }

こうなる。

iconv等を使って変更しても良いが、vimを開いたまま文字化けを回避する方法があるので紹介。

ggVGd:w<CR>:e ++enc=utf-8<CR>p:w<CR>

これでおk。

詳細に書くと、

ggVG               "ファイル全体を選択
d                  "選択範囲(ファイル全体)をカット
:w<CR>             "保存
:e ++enc=utf-8<CR> "utf-8で開く
p                  "ペースト
:w<CR>             "再度保存

一度yankバッファに退避させておくと、変更後のencodingでペーストくれるので新規ファイルで書き始めたソースが途中でeuc-jpで書いてることに気付いたときとか便利です。

でかいファイルの場合重いので、他の方法のが良いかも。


んー、別の方法がありそうな予感!

君のなかの僕

何がしたくて何がしたくないのか、それが僕にはわからない。
突然の来訪に、君はひどく驚いていたけど、結局僕には君が必要だったのかさえもわからない。
そんなことを君に話しても、きっと君もわからない。
でも君はそんな僕を哀れみながら、そこでなにかしらの答えを示してくれる。
適当に受け答えしているだけかもしれないけれど、それで僕は何度となく救われていた。
だから僕はいつも君を思う。あの時拒絶されてしまったけれど、それも僕にとっては、掛け替えのない答えだった。
こうして想う度に、君が遠くにいこうとも。

「こいつの頭にゃ適わないよ」
「よしてくれ、照れるじゃないか」
「はは。イイじゃんかよ事実なんだしさ!それよか、否定しないんだな」
「まぁね、僕ほどの頭の持ち主はなかなか居ないからね」
「ヒュー!!言うねぇ」
「フッ…」
「自慢じゃないけど、今まで一度も負けってやつを経験したことが無いんだ」
「それが自慢だっていうんだよー!このこのー!!」
「うわっ、やめろよー!俺はそんな趣味はないんだよっ!」
「っ!俺だってねーよ!!!なんだよそんなに怒ることじゃないだろ!!!」
「………」
「………」
ドスッ!
ドン