4

折れ線グラフの Y 軸の制限を D3 から変更する方法があるかどうかは誰にもわかりませんか?

Codeplex ソースの最新バージョンを使用しています... Silverlight バージョンではなく、WPF バージョンです。

Android センサーからの読み取り値をプロットしていますが、範囲の値はかなり変化します。場合によってはゼロ付近になり、グラフは次のようになります。

-0.05 ~ +0.05 の範囲

次に、値の大きさが変化し、Y 軸が再スケーリングされてデータ全体が表示され、グラフは次のようになります。

-0.8 ~ + 0.6 の範囲

Y 値が図 1 から 2 にどのように大きく変化したかを確認してください。

私が望むのは、私が選択した固定値で Y 軸を作成することです。たとえば、-10 から +10 としましょう。次に、グラフは常に同じスケールでプロットされます。

それを行う方法はありますか?

グラフの XAML コードは次のとおりです。

    <d3:ChartPlotter
        Name="gyroGraph"
        Margin="21,5,10,0"
        Grid.ColumnSpan="2"
        Background="White"
        Grid.Row="1"
        LegendVisibility="Collapsed"
        NewLegendVisible="False"
        MainHorizontalAxisVisibility="Collapsed"
        MainVerticalAxisVisibility="Collapsed">
        <d3:VerticalAxis
            FontSize="8" />
        <d3:Header
            Content="Angular Velocity"
            FontSize="11" />
    </d3:ChartPlotter>

よろしくお願いします。 ロドリゴ・バスニアック

4

3 に答える 3

7

手遅れではないことを願っていますが、同じ問題に遭遇し、d3 のフォーラムで解決策を見つけました: http://dynamicdatadisplay.codeplex.com/discussions/281164

コードは d3 ユーザー「fromDKwithlove」によって作成されました。

これは、制限を適用する方法です。

ViewportAxesRangeRestriction restr = new ViewportAxesRangeRestriction();
restr.YRange = new DisplayRange(-5, 105);
plotter.Viewport.Restrictions.Add(restr);

そして、これはコードの背後にあるクラスです:

public class DisplayRange
{
    public double Start { get; set; }
    public double End { get; set; }

    public DisplayRange(double start, double end)
    {
        Start = start;
        End = end;
    }
}

public class ViewportAxesRangeRestriction : IViewportRestriction
{
    public DisplayRange XRange = null;
    public DisplayRange YRange = null;

    public Rect Apply(Rect oldVisible, Rect newVisible, Viewport2D viewport)
    {
        if (XRange != null)
        {
            newVisible.X = XRange.Start;
            newVisible.Width = XRange.End - XRange.Start;
        }

        if (YRange != null)
        {
            newVisible.Y = YRange.Start;
            newVisible.Height = YRange.End - YRange.Start;
        }

        return newVisible;
    }

    public event EventHandler Changed;
}
于 2013-06-11T06:26:03.800 に答える
2

必要な動作が正確にわからない場合は、必要に応じて明確にすることができます。
FitToViewを使用して特定の値に固定された初期軸が必要だったので、グラフが大きくなると、それ以降、軸のサイズが自動的に変更されました。
これを実現するために、DomainRestrictionでFitToViewRestrictionを使用しました。

<d3:ChartPlotter.FitToViewRestrictions>
    <d3:DomainRestriction Domain="0,0,10,14000"/>
</d3:ChartPlotter.FitToViewRestrictions>

ここで、ドメインrectは、初期軸制限を決定する初期ビューポートrectです。FitToViewを設定すると、グラフがこの初期制限を超えたときに軸がスケーリングされます。

ただし、使用するD3のバージョン(0.3.4703.0)では、DomainRestriction.Applyの実装では希望する動作が得られなかったため、そこでソースコードを変更する必要がありました。関連するファイルはDynamicDataDisplay\v0.3.4703-Nightly src \ src \ DynamicDataDisplay \ ViewportRestrictions\DomainRestrictions.csです。
DomainRestrictionを変更しました。適用先:

public override DataRect Apply(DataRect oldDataRect, DataRect newDataRect, Viewport2D viewport) {
    return (domain.IsEmpty) ? newDataRect : DataRect.Union(newDataRect, domain);
}

これは私が説明した振る舞いを与えます。似たようなものが必要だと思いますが、これはx軸にのみ適用されます。つまり、yを初期値に固定したままにしたいが、データがFitToViewに含まれるときにxをスケーリングしたい。上記のメソッドを変更するだけで、その動作を取得できるはずです。

于 2012-03-08T02:10:47.717 に答える
0

DateTime についても同じことを行いたい場合は、次のように DisplayRange オブジェクトの作成を変更するだけです。

ViewportAxesRangeRestriction r = new ViewportAxesRangeRestriction
{
  YRange = new DisplayRange(vm.MinTemp, vm.MaxTemp),
  XRange = new DisplayRange(DateTimeAxis.ConvertToDouble(vm.StartTime), DateTimeAxis.ConvertToDouble(vm.EndDate))
};
于 2013-10-24T14:55:18.223 に答える