12

現在、ライブラリ d3.js に取り組んでい ます。ダイナミック ライングラフを使用した折れ線グラフ があります。しかし、私の問題は、データセットにゼロの値がいくつかある可能性があり、log 0 が定義されていないため、コードでプロットできないことです。ここで私のコードでは、このようなスケールセット

y = d3.scale.log().domain([0.1, max_y _value]).range([h, 0]).nice();

そして、これはそれがどのように使用されるかです

  lineFunction = d3.svg.line()
        .y(function(d) {
          return y(d);
        });

私はそれが奇妙な質問であることを知っています.しかし、ログ0の値を処理して、単一のゼロ値がある場合、残りの値が正しくプロットされるようにする方法はありますか. はいの場合、同じステートメントで2つのドメインと範囲を(0値を処理するために)与えることはできますか?

ありがとうございました。

4

2 に答える 2

21

クランプ機能を使用して問題を解決しました。これは私がコードを変更した方法です:

y = d3.scale.log().clamp(true).domain([0.1, max_y _value]).range([h, 0]).nice();
于 2012-07-04T05:19:05.090 に答える
2

ドメイン境界の1つが0の対数スケールであるドメインがある場合は、機能しません。また、対数目盛は、目立たない数の目盛りを持つtick()関数を提供します。

私の現在の割り当ては、線形スケールの散布図に任意のドメインと範囲のデータを表示することですが、オプションで、ユーザーは対数スケールに切り替えることができます。これには、問題のある[0、n]および[n、0]ドメインが含まれます。

これらのケースを処理するために私が思いついた解決策は次のとおりです。線形スケールを使用してドメインを正の境界を持つ任意の範囲に投影する場合、この問題を回避できます。[1,10]を選択しますが、任意の正の数を取ることができます。その後、通常の対数スケールを使用できます。

d3.scale.genericLog = function() {
    return GenericLog();
};
function GenericLog() {
    var PROJECTION=[1,10];
    var linearScale, logScale;

    linearScale=d3.scale.linear();
    linearScale.range(PROJECTION);

    logScale=d3.scale.log();
    logScale.domain(PROJECTION);

    function scale(x) {
        return logScale(linearScale(x));
    }
    scale.domain = function(x) {
        if (!arguments.length) return linearScale.domain();
        linearScale.domain(x);
        return scale;
    };
    scale.range = function(x) {
        if (!arguments.length) return logScale.range();
        logScale.range(x);
        return scale;
    };
    scale.ticks = function(m) {
        return linearScale.ticks(m);
    };
    return scale;

}

使用法:

var scale1 = d3.scale.genericLog().domain([0,1]).range([500,1000]);
var scale2 = d3.scale.genericLog().domain([-10,0]).range([500,1000]);
scale1(0)   //500
scale2(-10) //500
scale2(0)   //100

range()、scale()、ticks()関数だけが必要だったので、これらだけを含めましたが、他のすべてを実装するのに5分以上かかることはありません。また、ティック数を制限する必要があったため、線形スケールのticks()値を使用していたことに注意してください。これは、線形スケールの方が簡単です。

編集: 注意 してください投影として選択するものによっては、対数スケールが歪むことになります使用する間隔を広くすると、スケールの下部がより強くなります。

于 2012-11-05T08:35:51.727 に答える