2012-03-07 84 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。然后该图将始终以相同的比例绘制。

有没有办法做到这一点?

为图中的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> 

感谢和问候, 罗德里戈Basniak

+0

如果值超出初始设置范围,您想要什么行为范围(-10至10)?如果轴保持固定(和图形裁剪)或者轴应该重新缩放以适合所有点? – Ricibob 2012-03-08 18:46:17

+0

如果数值超出初始范围,我不打扰。无论如何,我需要定义的范围保持不变。这些值不应该超出定义的范围,但是如果他们这样做了,那么图表就可以裁剪它们。 – RBasniak 2012-03-08 19:23:43

回答

2

林不知道你想要的确切行为 - 也许你可以根据需要澄清。
我需要一个固定的初始坐标轴在一个特定的值与FitToView,以便当图表增长的初始轴时自动调整轴从那时起。
为了实现这一点,我使用的FitToViewRestriction与DomainRestriction:

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

这里域矩形是初始视图端口RECT确定所述初始轴限制。设置FitToView意味着当图形超出此初始限制时,轴将进行缩放。

但是请注意,在我们使用的D3版本(0.3.4703.0)中,DomainRestriction.Apply的实现并没有给我想要的行为,所以有必要在那里修改源代码。相关文件是DynamicDataDisplay \ v0.3.4703 - Nightly src \ src \ DynamicDataDisplay \ ViewportRestrictions \ DomainRestrictions.cs。
我修改DomainRestriction.Apply到:

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

这给我描述的behviour。我想你想要类似的东西,但只适用于X轴。即,您希望y保持固定在其初始值,但您希望x随着数据与FitToView一起进行缩放。只要修改上面的方法,你应该能够得到这种行为。

+0

嗨,你的代码给了我一个如何去做的线索。我看到D3 dll上有很多限制对象。但我不知道如何应用它们。我尝试没有太多成功。我编辑了我的帖子,以更好地说明我需要什么。 – RBasniak 2012-03-08 16:47:24

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 2013-09-13 09:02:37

0

如果你想要做的日期时间相同,只是只需更改DisplayRange对象的创建,如下所示:

ViewportAxesRangeRestriction r = new ViewportAxesRangeRestriction 
{ 
    YRange = new DisplayRange(vm.MinTemp, vm.MaxTemp), 
    XRange = new DisplayRange(DateTimeAxis.ConvertToDouble(vm.StartTime), DateTimeAxis.ConvertToDouble(vm.EndDate)) 
};