2012-03-07 54 views
4

D3から折れ線グラフ上のY軸の制限を変更する方法はありますか?ダイナミックデータ表示チャート:Y軸範囲を変更する

Codeplexソースの最新バージョンを使用しています... WPFはSilverlightバージョンではありません。

私はAndroidセンサーからの読みをプロットしており、範囲の値はかなり変化しています。時にはそれが周りにゼロだとグラフは次のようになります。

Ranging from -0.05 to +0.05

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

Ranging from -0.8 to + 0.6

は、Yの値は、私が欲しい写真1から

2に多くのことをどのように変化するかを参照してください。私が選ん固定値とY軸を作ることです、-10〜を言うことができます+10。グラフは常に同じスケールでプロットされます。

これを行う方法はありますか? - 必要であれば、おそらくあなたは明確にすることができます

<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> 

おかげで、よろしく、 ロドリゴBasniak

+0

値が初期セットの外に出る場合、どのような動作が必要ですか範囲(-10〜10)?軸を固定したままにするか(グラフの作物)、軸がすべての点に合うように再スケールする必要がありますか? – Ricibob

+0

値が初期範囲を超える場合は気にしません。私は何があっても同じ範囲にとどまるためには定義された範囲が必要です。値は定義された範囲を超えてはいけませんが、もしそうであれば、グラフがそれらをトリミングしても問題ありません。 – RBasniak

答えて

2

イムないあなたが望む正確な動作の確認:

グラフのXAMLコードは、このです。
FitToViewで特定の値に固定初期軸が必要であったため、グラフ出力が初期軸を伸ばしたときに自動的に軸のサイズが変更されました。この私がDomainRestrictionとFitToViewRestrictionを使用達成するために

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

をここでドメインRECTは、最初の軸の範囲を決定し、最初のビューポート四角形です。 FitToViewを設定すると、グラフがこの初期限界を超えたときに軸がスケーリングされます。

しかし、私たちが使用しているバージョン(0.3.4703.0)では、DomainRestriction.Applyの実装が私に必要な振る舞いを与えていないので、そこでソースコードを変更する必要がありました。関連するファイルはDynamicDataDisplay \ v0.3.4703 - Nightly src \ src \ DynamicDataDisplay \ ViewportRestrictions \ DomainRestrictions.csです。私が説明したbehviourを与える

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


は私がにDomainRestriction.Applyを修正しました。私はあなたが似たようなものを望んでいると思うが、それはx軸だけに当てはまる。私はyがその初期値に固定されたままにしたいが、FitToViewでデータが入ってくるにつれてxを拡大することを望む。上記の方法を変更するだけで、その動作を取得できるはずです。

+0

こんにちは、あなたのコードは私にそれを行う方法の手がかりを与えました。私は、D3 dllに多くの制限オブジェクトがあるのを見ました。しかし、私はそれらをどのように適用するかについての手掛かりがありません。私はあまり成功しなかった。私は必要なものをより明確にするために投稿を編集しました。 – RBasniak

5

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

コードは、D3のユーザーによって作成された「fromDKwithlove」。

この

は、あなたが制限適用すべきかです:

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

をそして、これはコードビハインドクラス(ES)である:

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; 
} 
+0

DateTime Axisの範囲を設定するためにこのコードを適用するにはどうすればよいですか? – virious

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)) 
}; 
関連する問題