Google Visualization API―データをフォーマットする


フォーマッター

フォーマッターはDataTableの指定された列の値をフォーマットするために使われる。

フォーマッターの適用によって影響を受けるのはセルの「表示用のフォーマットされた値(f)」だけで、「値(v)」そのものは変更されない。

DataViewに対してはフォーマッターを使う事はできないが、DataTableの列にフォーマッタを適用してそのDataTableからDataViewを作成すれば同様の効果が得られる。

フォーマッターを使用して列1の日付のフォーマットタイプをlongに指定する例を以下に示す。

var data = new google.visualization.DataTable();
data.addColumn('string', 'Employee Name');
data.addColumn('date', 'Start Date');
data.addRows(3);
data.setCell(0, 0, 'Mike');
data.setCell(0, 1, new Date(2008, 1, 28));
data.setCell(1, 0, 'Bob');
data.setCell(1, 1, new Date(2007, 5, 1));
data.setCell(2, 0, 'Alice');
data.setCell(2, 1, new Date(2006, 7, 16));

var table = new google.visualization.Table(document.getElementById('table_div'));
table.draw(data, {
    showRowNumber: true
});

// Formatters適用前の値を確認    
alert(data.getFormattedValue(0,1));   // Feb 28, 2008
alert(data.getValue(0,1));      // Thu Feb 28 2008 00:00:00 GMT+0900

// formatTypeにlongを指定して日付のFormattersオブジェクトを作成
var formatter = new google.visualization.DateFormat({
    formatType: 'long'
});

// FormattersオブジェクトをDataTableの列1に適用
formatter.format(data, 1);

// Draw our data
var table = new google.visualization.Table(document.getElementById('dateformat_div'));
table.draw(data, {
    showRowNumber: true
});

// Formatters適用後の値を確認    
alert(data.getFormattedValue(0,1));   // February 28, 2008
alert(data.getValue(0,1));      // Thu Feb 28 2008 00:00:00 GMT+0900

フォーマッター適用前

フォーマッター適用後

変換後のvalueの値に変更は無いが、FormattedValueの値がlongフォーマットに変換されているのがわかる。

フォーマッターには以下のものが用意されている。

  • ArrowFormat
    セルの値が特定の値以上か以下かを示すアップ,ダウンの矢印を追加する。
  • BarFormat
    セルの値が特定の値以上か以下かを示すカラーバーを追加する。
  • ColorFormat
    セルが特定の値の範囲内にある場合の表示色を指定する。
  • DateFormat
    日付のフォーマットを指定する。
  • NumberFormat
    数値のフォーマットを指定する。
  • PatternFormat
    同じ行のセルの値を任意のテキストとともに連結し、指定されたセルに代入する

ArrowFormat

ArrowFormatのサンプルを以下に示す。

var data = new google.visualization.DataTable();
data.addColumn('string', 'Department');
data.addColumn('number', 'Revenues Change');
data.addRows([
    ['Shoes', {v:12, f:'12.0%'}],
    ['Sports', {v:-7.3, f:'-7.3%'}],
    ['Toys', {v:0, f:'0%'}],
    ['Electronics', {v:-2.1, f:'-2.1%'}],
    ['Food', {v:22, f:'22.0%'}]
]);

var table = new google.visualization.Table(document.getElementById('arrowformat_div'));

var formatter = new google.visualization.ArrowFormat();
formatter.format(data, 1); // Apply formatter to second column

table.draw(data, {allowHtml: true});

alert(data.getFormattedValue(0,1));   // 12.0%

列1が0より大きいか小さいかで矢印が表示されているのがわかる。

この基準の値0はArrowFormatオブジェクトを作成する時にbaseオプションで指定する事で変更する事ができる。

以下の例はbaseオプションに-2.1を指定した例です。

var formatter = new google.visualization.ArrowFormat({
    base: -2.1
});

ArrowFormatの適用によってFormattedValueの値が変化するのかなと思って行0列1のFormattedValueの値を表示させて見たが「12%」で変化していない。

フォーマッターの適用に対して何が変化しているかを調べるために、以下のようにDataTableのJSONデータを表示させてみた。

alert(data.toJSON()); // DataTableのJSONデータを表示

ArrowFormat

DataTableの項では触れなかったが列(c)にはpatternプロパティがあり、列1のこのプロパティにフォーマット情報が格納されているのかなと思ったがそうではない。

どうやらセルのプロパティ(p)の「className」プロパティにArrowFormatのcss情報が格納されているようである。

また、フォーマッターがHTMLタグを使う可能性があるため、チャートオブジェクトにallowHtmlプロパティがある場合は、例のようにdowメソッドのオプションとしてallowHtmlプロパティをtrueに指定する。

BarFormat

BarFormatのサンプルを以下に示す。

var data = new google.visualization.DataTable();
data.addColumn('string', 'Department');
data.addColumn('number', 'Revenues');
data.addRows([
    ['Shoes', 10700],
    ['Sports', -15400],
    ['Toys', 12500],
    ['Electronics', -2100],
    ['Food', 22600],
    ['Art', 1100]
]);

var formatter = new google.visualization.BarFormat({width: 120});
formatter.format(data, 1); // Apply formatter to second column

var table = new google.visualization.Table(document.getElementById('barformat_div'));
table.draw(data, {allowHtml: true});

// formatterによってFormattedValueとPropertyが変化する。
alert(data.getFormattedValue(0,1));
//alert(data.toJSON());
var cellroperties = data.getProperties(0, 1);
var msg = "";
for (var cellProperty in cellroperties) {
    msg += cellProperty + ":" + cellroperties[cellProperty] + "\n";
}
alert(msg);

FormattedValueの値はArrowFormatと異なり、変化して以下のようなHTML文字列が格納されている。

BarFormat1

また、セルのプロパティには以下のようにbar_format_old_valueプロパティにフォーマッター適用前のFormattedValueの値が格納されている。

BarFormat1

BarFormatのオプションには以下のものが指定できる。

  • base
    バーの基準値を指定する。
  • colorNegative
    値が負の場合の表示色を'red', 'green', 'blue'のいずれかで指定。
  • colorPositive
    値が正の場合の表示色を'red', 'green', 'blue'のいずれかで指定。
  • drawZeroLine
    trueを指定すると0の位置の黒い線を描画する。
  • max
    バーの表示範囲の最大値を指定。
    デフォルトはDataTableの列値の最大値となる。
  • min
    バーの表示範囲の最少値を指定。
    デフォルトはDataTableの列値の最少値となる。
  • showValue
    falseを指定するとバーの横の数値を表示しなくなる。
  • width
    バーの幅をピクセル単位で指定。デフォルトは100ピクセル

ColorFormat

ColorFormat はセルの値に応じてセルの文字色と背景色を割り当てる。

ColorFormatのサンプルを以下に示す。

var data = new google.visualization.DataTable();
data.addColumn('string', 'Department');
data.addColumn('number', 'Revenues');
data.addRows([
    ['Shoes', 10700],
    ['Sports', -15400],
    ['Toys', 12500],
    ['Electronics', -2100],
    ['Food', 22600],
    ['Art', 1100]
]);

var formatter = new google.visualization.ColorFormat();
formatter.addRange(-20000, 0, 'white', 'orange');
formatter.addRange(20000, null, 'red', '#33ff33');
formatter.format(data, 1);

var table = new google.visualization.Table(document.getElementById('colorformat_div'));
table.draw(data, {allowHtml: true});

// formatterによってPropertyが変化する。
alert(data.getFormattedValue(1,1));   // -15400を表示
//alert(data.toJSON());
var cellroperties = data.getProperties(1, 1);
var msg = "";
for (var cellProperty in cellroperties) {
    msg += cellProperty + ":" + cellroperties[cellProperty] + "\n";
}
alert(msg);   // style:color:white;background-color:orange;を表示

このフォーマッターは他のフォーマッターと異なりコンストラクタに指定するオプションが無い。

代わりにaddRangeメソッドかaddGradientRangeを使って色づけする値の範囲を指定する。 色色の指定は"black"や"#000000"や"#000"等のいろいろなHTML形式で指定できる。

次の例はaddRangeメソッドをaddGradientRangeメソッドに変更して、値に応じてGradientの色を変化させた例である。

formatter.addGradientRange(-span class="num">20000, 0, 'white', '00f', 'ff0');
formatter.addGradientRange(20000, null, 'red', 'f00', '0ff');

DateFormat

DDateFormatの例についてはこのページの初めに、formatTypeに'long'を指定した例を示した。

DateFormatのコンストラクタにはpatternとtimeZoneを指定する事ができる。

以下は、a href="#formatters_first">前に示した例のDateFormatのコンストラクタを変更してpatternオプションに、日付と時刻を表示するように修正した場合の例である。

var formatter = new google.visualization.DateFormat({
    pattern: 'yy/M/d HH:mm:ss'
});

formatTypeとpatternの両方を指定する事はできない。

formatTypeは'short'と'medium'と'long'のいずれかを指定する。

patternに指定できる文字列についてはgooleのドキュメントを参照していただきたい。

timeZoneはGMT(グリニッジ標準時)からの時間差を数値で指定する。

NumberFormat

NumberFormatは名前のとおり数字の書式化のために使われる。

NumberFormatの例を以下に示す。

var data = new google.visualization.DataTable();
data.addColumn('string', 'Department');
data.addColumn('number', 'Revenues');
data.addRows([
    ['Shoes', 10700.555],
    ['Sports', -15400],
    ['Toys', 12500],
    ['Electronics', -2100],
    ['Food', 22600],
    ['Art', 1100]
]);

var formatter = new google.visualization.NumberFormat({
    decimalSymbol: '.',         // default
    fractionDigits: 2,      // default
    negativeColor: 'red',
    groupingSymbol: ',',        // default
    negativeParens: true,  // default
    prefix: '¥',
    suffix: ' 円'
});
formatter.format(data, 1);
var table = new google.visualization.Table(document.getElementById('numberformat_div'));
table.draw(data, {
    allowHtml: true,
    showRowNumber: true
});

// 変化した値を表示
alert(data.getFormattedValue(1,1));      // (¥15,400.00 円)
alert(data.getProperty(1,1,"style")); // color:red;

上記の例に示すとおり、セルのFormattedValueの値が変化しPropertysにstyleプロパティが追加されている。

フォーマッタのオプションとして指定できるのは以下の項目になる。

  • decimalSymbol
    小数点を示す文字を指定
  • fractionDigits
    小数点以下何桁まで表示するかを指定
  • groupingSymbol
    3桁ごとの区切り文字を指定
  • negativeColor
    値が負の時の表示色を指定
  • negativeParens
    値が負の時に丸括弧で値を囲むかどうかをtrueまたはfalseで指定
  • prefix
    先頭に追加する文字列を指定
  • suffix
    最後に追加する文字列を指定

PatternFormat

指定された文字列パターンの指示に従って 同じ行の指定された列の値を連結し、指定された列に代入する。

フォーマッタのコンストラクタには通常、オプションを示すオブジェクトを引数にとるが、PatternFormatの場合はパターン文字列が引数となる。

PatternFormatの例を以下に示す。

var data = new google.visualization.DataTable();
data.addColumn('string', 'Name');
data.addColumn('string', 'Email');
data.addRows([
    ['John Lennon', 'john@beatles.co.uk'],
    ['Paul McCartney', 'paul@beatles.co.uk'],
    ['George Harrison', 'george@beatles.co.uk'],
    ['Ringo Starr', 'ringo@beatles.co.uk']
]);

var formatter = new google.visualization.PatternFormat('<a href="mailto:{1}">{0}</a>');
formatter.format(data, [0, 1]);

var view = new google.visualization.DataView(data);
view.setColumns([0]);

var table = new google.visualization.Table(document.getElementById('patternformat_div'));
table.draw(view, {
    allowHtml: true,
    showRowNumber: true
});

// <a href="mailto:john@beatles.co.uk">John Lennon</a>
alert(data.getFormattedValue(0,0));

列0と列1の値をフォーマットパターンに従って加工し、列0のFormattedValueの値として保存した後、新たに列0のみをDataViewにセットして表示している。

PatternFormatのformatメソッドの第1引数は他のフォーマッタと同様にDataTableであるが、第2引数はパターン文字列に埋め込まれる列番号を配列で指定する。

formatメソッドの第3引数には、パターン文字列に従ってフォーマットされた文字列の格納先となる列を指定する。
この引数は省略可能で、省略した場合は第2引数で指定した列番号の配列の最初の要素が使われる。

パターン文字列に「{」または「]」を含める場合は「\{」または「\}」を指定する。
「\」そのものを含めたい場合は「\\」を指定する。

次に「First Name」列と「Last Name」列を連結して「Full Name」列に出力する例を示す。

var data = new google.visualization.DataTable();
data.addColumn('string', 'First Name');
data.addColumn('string', 'Last Name');
data.addColumn('string', 'Full Name');
data.addRows([
    ['John', 'Lennon', ''],
    ['Paul', 'McCartney', ''],
    ['George', 'Harrison', ''],
    ['Ringo', 'Starr', '']
]);

var formatter = new google.visualization.PatternFormat('\{{0}-{1}\}');
formatter.format(data, [0, 1], 2);

var table = new google.visualization.Table(document.getElementById('patternformat2_div'));
table.draw(data, {
    allowHtml: true
});

 

ページのトップへ戻る