D3jsでズーム/パンを使用して複数のy軸を追加する

NicklasPouey-ウィンガー

json入力に基づいて複数の線を表示するd3jsの水平折れ線グラフに取り組んでいます。ズームとパンがありますが、描画された各線のy軸も表示する必要があります。私の場合、3つです。

まず、これは悪い習慣ですか?3つすべてを片側に積み重ねる必要がありますか、それとも左側に2つ、右側に1つ、またはその他の組み合わせを維持する必要がありますか?

私はこのチュートリアル従ってみましたが、それは実際にはもっと混乱して混乱するコードを作成するだけでした。

誰かがy軸を追加する方法と、現在のようにズームやパンでそれらを機能させる方法を教えてくれることを望んでいました。

これが私の現在の見解です: ここに画像の説明を入力してください

そして、これが私のコードです:

 <script>

        var margin = { top: 20, right: 80, bottom: 20, left: 40 },
            width = ($("#trendcontainer").width() - 50) - margin.left - margin.right,
            height = 650 - margin.top - margin.bottom;

        var svg;

        var format = d3.time.format("%Y-%m-%dT%H:%M:%S").parse;
        var x = d3.time.scale()
            .range([0, width]);

        var y0 = d3.scale.linear()
            .range([height, 0]);

        var y1 = d3.scale.linear()
            .range([height, 0]);

        var color = d3.scale.category10();
        var xAxis = d3.svg.axis()
            .scale(x)
            .orient("bottom")
            .tickSize(-height);
        // TODO: Rename axis to instrument name (i.e 'depth')
        var yAxis0 = d3.svg.axis()
            .scale(y0)
            .orient("left")
            .tickSize(-width);

        var yAxis1 = d3.svg.axis()
            .scale(y1)
            .orient("right")
            .tickSize(-width);

        var line = d3.svg.line()
            .interpolate("basis")
            .x(function(d) {
                return x(d.date);
            })
            .y(function(d) {
                return y0(d.value);
            });

        d3.json('@Url.Action("DataBlob", "Trend", new {id = Model.Unit.UnitId, runId = Request.Params["runId"]})', function(error, tmparray) {
            var json = JSON.parse(tmparray);

            $('#processing').hide();

            color.domain(d3.keys(json[0]).filter(function(key) {
                return key !== "Time" && key !== "Id";
            }));

            json.forEach(function(d) {
                var date = format(d.Time);
                d.Time = date;
            });

            var instruments = color.domain().map(function(name) {
                return {
                    name: name,
                    values: json.map(function(d) {
                        return {
                            date: d.Time,
                            value: +d[name]
                        };
                    })
                };
            });

            x.domain(d3.extent(json, function(d) {
                return d.Time;
            }));
            y0.domain([
                d3.min(instruments, function (c) {
                    if (c.name == "Depth") {
                        return d3.min(c.values, function (v) {
                            return v.value;
                        });
                    }
                    //return d3.min(c.values, function (v) {
                    //    return v.value;
                    //});
                }),
                d3.max(instruments, function(c) {
                    return d3.max(c.values, function(v) {
                        return v.value;
                    });
                })
            ]);

            y1.domain([
                d3.min(instruments, function (c) {
                    console.log("In y1.domain c is: " + c);
                    if (c.name == "Weight") {
                        return d3.min(c.values, function (v) {
                            return v.value;
                        });
                    }
                    //return d3.min(c.values, function (v) {
                    //    return v.value;
                    //});
                }),
                d3.max(instruments, function(c) {
                    return d3.max(c.values, function(v) {
                        return v.value;
                    });
                })
            ]);

            var zoom = d3.behavior.zoom()
                .x(x)
                .y(y0)
                .scaleExtent([1, 10])
                .on("zoom", zoomed);

            svg = d3.select(".panel-body").append("svg")
                .attr("width", width + margin.left + margin.right)
                .attr("height", height + margin.top + margin.bottom)
                .append("g")
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
                .call(zoom)
                .attr("width", width + margin.left + margin.right)
                .attr("height", height + margin.top + margin.bottom);

            svg.append("rect")
                .attr("width", width)
                .attr("height", height);

            svg.append("g")
                .attr("class", "x axis")
                .attr("transform", "translate(0," + height + ")")
                .call(xAxis);

            svg.append("g")
                .attr("class", "y axis")
                .call(yAxis0);

            svg.append("g")
                .attr("class", "y axis")
                .call(yAxis1);

            var instrument = svg.selectAll(".instrument")
                .data(instruments)
                .enter().append("g")
                .attr("class", "instrument");

            instrument.append("path")
                .attr("class", "line")
                .attr("d", function(d) {
                    return line(d.values);
                })
                .style("stroke", function(d) {
                    return color(d.name);
                });

            instrument.append("text")
                .datum(function(d) {
                    return {
                        name: d.name,
                        value: d.values[d.values.length - 1]
                    };
                })
                .attr("transform", function(d) {
                    return "translate(" + x(d.value.date) + "," + y0(d.value.value) + ")";
                })
                .attr("x", 3)
                .attr("dy", ".35em")
                .text(function(d) {
                    return d.name;
                });
        });

        function zoomed() {
            svg.select(".x.axis").call(xAxis);
            svg.select(".y.axis").call(yAxis0);
            svg.select(".x.grid")
                .call(make_x_axis()
                    .tickSize(-height, 0, 0)
                    .tickFormat(""));
            svg.select(".y.grid")
                .call(make_y_axis()
                    .tickSize(-width, 0, 0)
                    .tickFormat(""));
            svg.selectAll(".line")
                .attr("d", function(d) { return line(d.values); });
        };

        var make_x_axis = function() {
            return d3.svg.axis()
                .scale(x)
                .orient("bottom")
                .ticks(5);
        };

        var make_y_axis = function() {
            return d3.svg.axis()
                .scale(y0)
                .orient("left")
                .ticks(5);
        };
</script>

最後に、これが私が達成しようとしていることです(このコンポーネントは非常に遅く、大きなデータセットをうまく処理しません): ここに画像の説明を入力してください

NicklasPouey-ウィンガー

@LarsKotthoffからの親切な支援を受けて、最終的に解決策にたどり着きました。また、この投稿に基づいて、複数軸ズームを追加しました

<script>
    /* d3 vars */
    var x;
    var y1;
    var y2;
    var y3;
    var graph;
    var m = [];
    var w;
    var h;

    /* d3 axes */
    var xAxis;
    var yAxisLeft;
    var yAxisLeftLeft;
    var yAxisRight;

    /* d3 lines */
    var line1;
    var line2;
    var line3;

    /* d3 zoom */
    var zoom;
    var zoomLeftLeft;
    var zoomRight;                           

    /* Data */
    var speed = [];
    var depth = [];
    var weight = [];
    var timestamp = [];

    var url = '@Url.Action("DataBlob", "Trend", new {id = Model.Unit.UnitId, runId = Request.Params["runId"]})';
    var data = $.getJSON(url, null, function(data) {
        var list = JSON.parse(data);
        var format = d3.time.format("%Y-%m-%dT%H:%M:%S").parse;
        list.forEach(function(d) {
            speed.push(d.Speed);
            depth.push(d.Depth);
            weight.push(d.Weight);
            var date = format(d.Time);
            d.Time = date;
            timestamp.push(d.Time);
        });

        m = [10, 80, 30, 100]; // margins: top, right, bottom, left
        w = $("#trendcontainer").width() - m[1] - m[3]; // width
        h = 550 - m[0] - m[2]; // height

        x = d3.time.scale().domain(d3.extent(timestamp, function (d) {
            return d;
        })).range([0, w]);

        y1 = d3.scale.linear().domain([0, d3.max(speed)]).range([h, 0]);
        y2 = d3.scale.linear().domain([0, d3.max(depth)]).range([h, 0]);
        y3 = d3.scale.linear().domain([0, d3.max(weight)]).range([h, 0]);

        line1 = d3.svg.line()
            .interpolate("basis")
            .x(function (d, i) {
                return x(timestamp[i]);
            })
            .y(function (d) {
                return y1(d);
            });

        line2 = d3.svg.line()
            .interpolate("basis")
            .x(function (d, i) {
                return x(timestamp[i]);
            })
            .y(function (d) {
                return y2(d);
            });

        line3 = d3.svg.line()
            .interpolate("basis")
            .x(function (d, i) {
                return x(timestamp[i]);
            })
            .y(function (d) {
                return y3(d);
            });

        zoom = d3.behavior.zoom()
            .x(x)
            .y(y1)
            .scaleExtent([1, 10])
            .on("zoom", zoomed);

        zoomLeftLeft = d3.behavior.zoom()
            .x(x)
            .y(y3)
            .scaleExtent([1, 10]);

        zoomRight = d3.behavior.zoom()
            .x(x)
            .y(y2)
            .scaleExtent([1, 10]);

        // Add an SVG element with the desired dimensions and margin.
        graph = d3.select(".panel-body").append("svg:svg")
            .attr("width", w + m[1] + m[3])
            .attr("height", h + m[0] + m[2])
            .call(zoom)
            .append("svg:g")
            .attr("transform", "translate(" + m[3] + "," + m[0] + ")");

        // create xAxis
        xAxis = d3.svg.axis().scale(x).tickSize(-h).tickSubdivide(false);
        // Add the x-axis.
        graph.append("svg:g")
            .attr("class", "x axis")
            .attr("transform", "translate(0," + h + ")")
            .call(xAxis);

        // create left yAxis
        yAxisLeft = d3.svg.axis().scale(y1).ticks(10).orient("left");
        // Add the y-axis to the left
        graph.append("svg:g")
            .attr("class", "y axis axisLeft")
            .attr("transform", "translate(-15,0)")
            .call(yAxisLeft);

        // create leftleft yAxis
        yAxisLeftLeft = d3.svg.axis().scale(y3).ticks(10).orient("left");
        // Add the y-axis to the left
        graph.append("svg:g")
            .attr("class", "y axis axisLeftLeft")
            .attr("transform", "translate(-50,0)")
            .call(yAxisLeftLeft);

        // create right yAxis
        yAxisRight = d3.svg.axis().scale(y2).ticks(10).orient("right");
        // Add the y-axis to the right
        graph.append("svg:g")
            .attr("class", "y axis axisRight")
            .attr("transform", "translate(" + (w + 15) + ",0)")
            .call(yAxisRight);

        // add lines
        // do this AFTER the axes above so that the line is above the tick-lines
        graph.append("svg:path").attr("d", line1(speed)).attr("class", "y1");
        graph.append("svg:path").attr("d", line2(depth)).attr("class", "y2");
        graph.append("svg:path").attr("d", line3(weight)).attr("class", "y3");
    });

    function zoomed() {
        zoomRight.scale(zoom.scale()).translate(zoom.translate());
        zoomLeftLeft.scale(zoom.scale()).translate(zoom.translate());

        graph.select(".x.axis").call(xAxis);
        graph.select(".y.axisLeft").call(yAxisLeft);
        graph.select(".y.axisLeftLeft").call(yAxisLeftLeft);
        graph.select(".y.axisRight").call(yAxisRight);
        graph.select(".x.grid")
            .call(make_x_axis()
            .tickFormat(""));
        graph.select(".y.axis")
            .call(make_y_axis()
                .tickSize(5, 0, 0));
        graph.selectAll(".y1")
            .attr("d", line1(speed));
        graph.selectAll(".y2")
            .attr("d", line2(depth));
        graph.selectAll(".y3")
            .attr("d", line3(weight));
    };

    var make_x_axis = function () {
        return d3.svg.axis()
            .scale(x)
            .orient("bottom")
            .ticks(5);
    };

    var make_y_axis = function () {
        return d3.svg.axis()
            .scale(y1)
            .orient("left")
            .ticks(5);
    };
</script>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

d3jsでx軸に沿ってスクロール可能な軸/パンを作成する方法

分類Dev

d3jsでx軸に沿ってスクロール可能な軸/パンを作成する方法

分類Dev

d3jsで複数のパスを選択する

分類Dev

D3.jsブラシとズームで、ズーム範囲の値によってY軸を再スケーリングします

分類Dev

d3jsのユーザー入力を使用して、ドロップダウンで複数のグラフを作成します

分類Dev

d3js:if条件を使用して、変数に基づいて各バーに複数の色を追加します

分類Dev

d3js:2つのy軸がある場合のズーム

分類Dev

D3:1つの軸をズーム+パンし、もう1つの軸のみをパンすることはできますか?

分類Dev

d3jsでy軸の目盛り線を移動する

分類Dev

d3jsを使用してブラシズームから元のグラフに戻す

分類Dev

d3jsを使用して、力有向グラフの特定のノードに子要素を追加する

分類Dev

d3jsでの移行中に軸のパス/ラインを削除する方法

分類Dev

D3.jsのズームとパン-y軸でロック

分類Dev

forループを使用してパンダに複数のデータフレームを追加する

分類Dev

d3jsを使用してIDで要素を選択する際の問題

分類Dev

matplotlibを使用してパンダの対数スケールでx軸とy軸の両方をプロットする

分類Dev

D3jsを使用して複数の折れ線グラフで欠落値を表示しない方法

分類Dev

ループを使用して複数のy軸をプロットで定義する

分類Dev

d3jsを使用してファントでjsonデータをプロットする

分類Dev

c3 jsを使用して、ズームインしたときにさらに多くのx軸値を表示する方法はありますか?

分類Dev

D3.jsを使用して各データメンバーにネストされていない複数の要素を追加する

分類Dev

d3-ブラシ/パンズーム-上部のx軸のパンを無効にします

分類Dev

c3 jsの棒グラフのy軸をカスタマイズして、カスタムのパーセンテージティックを表示する方法

分類Dev

D3:ズームインすると、複数の折れ線グラフが軸と比較してわずかにずれています

分類Dev

積み上げ棒グラフで複数のカラースケールを使用して、y軸スケールをカウントに変更する

分類Dev

プログラムズーム後にマウスを使用すると、d3.jsのパンとズームがジャンプします

分類Dev

plotinumを使用して、対数スケールのy軸で図を描画する

分類Dev

d3を使用して複数の国のズームと中央揃え

分類Dev

d3.jsなどのツールを使用して複数のキーで平均を計算する方法

Related 関連記事

  1. 1

    d3jsでx軸に沿ってスクロール可能な軸/パンを作成する方法

  2. 2

    d3jsでx軸に沿ってスクロール可能な軸/パンを作成する方法

  3. 3

    d3jsで複数のパスを選択する

  4. 4

    D3.jsブラシとズームで、ズーム範囲の値によってY軸を再スケーリングします

  5. 5

    d3jsのユーザー入力を使用して、ドロップダウンで複数のグラフを作成します

  6. 6

    d3js:if条件を使用して、変数に基づいて各バーに複数の色を追加します

  7. 7

    d3js:2つのy軸がある場合のズーム

  8. 8

    D3:1つの軸をズーム+パンし、もう1つの軸のみをパンすることはできますか?

  9. 9

    d3jsでy軸の目盛り線を移動する

  10. 10

    d3jsを使用してブラシズームから元のグラフに戻す

  11. 11

    d3jsを使用して、力有向グラフの特定のノードに子要素を追加する

  12. 12

    d3jsでの移行中に軸のパス/ラインを削除する方法

  13. 13

    D3.jsのズームとパン-y軸でロック

  14. 14

    forループを使用してパンダに複数のデータフレームを追加する

  15. 15

    d3jsを使用してIDで要素を選択する際の問題

  16. 16

    matplotlibを使用してパンダの対数スケールでx軸とy軸の両方をプロットする

  17. 17

    D3jsを使用して複数の折れ線グラフで欠落値を表示しない方法

  18. 18

    ループを使用して複数のy軸をプロットで定義する

  19. 19

    d3jsを使用してファントでjsonデータをプロットする

  20. 20

    c3 jsを使用して、ズームインしたときにさらに多くのx軸値を表示する方法はありますか?

  21. 21

    D3.jsを使用して各データメンバーにネストされていない複数の要素を追加する

  22. 22

    d3-ブラシ/パンズーム-上部のx軸のパンを無効にします

  23. 23

    c3 jsの棒グラフのy軸をカスタマイズして、カスタムのパーセンテージティックを表示する方法

  24. 24

    D3:ズームインすると、複数の折れ線グラフが軸と比較してわずかにずれています

  25. 25

    積み上げ棒グラフで複数のカラースケールを使用して、y軸スケールをカウントに変更する

  26. 26

    プログラムズーム後にマウスを使用すると、d3.jsのパンとズームがジャンプします

  27. 27

    plotinumを使用して、対数スケールのy軸で図を描画する

  28. 28

    d3を使用して複数の国のズームと中央揃え

  29. 29

    d3.jsなどのツールを使用して複数のキーで平均を計算する方法

ホットタグ

アーカイブ