IEのfilter、matrixを使って折れ線グラフを作成

別にグラフを使うような高度な用事はないし、これからも必要ない気がするけど
単なる興味本位だけで、挑戦してみました。
結構やっている人もいて珍しくないだろうけど。




最初、差分が間隔で均等に傾くように
線の1pxずつ、1pxの大きさのタグを作成して
差分を間隔で割ったものを掛けて位置を決めて
とやって出来はしたけど、当たり前のように画面が重くなるので
違う方法を考えた。

canvas?とやらで出来るみたいだけど
自分のIEでは使えないので、filterのmatrixを使うことにした。
1pxが1ということで。
作成したFunctionオブジェクトに、配列にした値を渡すと折れ線グラフに。

createGraph([30, 89, 50, 200]);


function createGraph(arr_data) {

    var num_top        = 300;    //最初のTopの値
    var num_left       = 100;    //最初のLeftの値
    var num_s          = 0;      //最初の値
    var num_w          = 100;    //間隔(px)
    var str_line_color = '#000'; //線の色

    var obj_frag = document.createDocumentFragment();
    var num_top_next = num_top;
    for(var i in arr_data) {

        //ラインを作成
        var elm      = document.createElement('div');
        var num_deff = num_s - arr_data[i];
        var num_m21  = num_deff / num_w;
        with(elm.style) {
            position  = 'absolute';
            top       = (num_deff < 0) ? num_top_next + num_deff: num_top_next;
            left      = num_left;
            fontSize  = 0;
            width     = num_w;
            height    = parseInt(num_deff.toString().replace(/-/, ''));
            borderTop = '1 solid ' + str_line_color;
            filter    = 'progid:dximagetransform.microsoft.matrix(m21='
                    + String(num_m21)+ ' sizingmethod="auto expand")';
        };
        obj_frag.appendChild(elm);

        //点を作成
        var elm_ten = document.createElement('a');
        elm_ten.innerText = '●';
        with(elm_ten.style) {
            fontSize = '6px';
            position = 'absolute';
            top      = num_top - arr_data[i] - 3;
            left     = num_left + num_w - 3;
        };
        obj_frag.appendChild(elm_ten);

        //表示する数値を作成
        var elm_num = document.createElement('span');
        elm_num.innerHTML = arr_data[i];
        with(elm_num.style) {
            fontSize = '15px';
            position = 'absolute';
            top      = num_top - arr_data[i] - ((num_deff > 0) ? - 5: 20);
            left     = num_left + num_w - (5 * arr_data[i].toString().length - 1);
        };
        obj_frag.appendChild(elm_num);

        num_top_next = num_top - arr_data[i];
        num_left    += num_w;
        num_s        = arr_data[i];
    };
    document.body.appendChild(obj_frag);
};

filterのm21という値が、四角形の左右の辺のトップの位置を動かすものらしく
差分を、作成するエレメントの高さにして、それを一定の割合のm21を変えればいい
と思っていたけど、点と点の間隔によっては、うまく繋がらなかった。
そのm21の値は

差分 / (点と点の間隔(px);

これでいけた。

修正

×差分 * 0.1 / (点と点の間隔(px) / 10);
○差分 / (点と点の間隔(px);

これでOKだった。
両方10で割ってたw