动态数据显示图表:更改Y轴范围

时间:2012-03-07 10:51:57

标签: c# wpf charts dynamic-data-display

有没有人知道是否有办法改变D3线图上的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>

谢谢和最诚挚的问候, Rodrigo Basniak

3 个答案:

答案 0 :(得分:6)

希望现在还为时不晚,但我遇到了同样的问题并在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;
}

答案 1 :(得分:2)

我不确定你想要的确切行为 - 也许你可以在必要时澄清 我需要一个固定的初始轴在FitToView的特定值,这样当图形向外增长时,轴从那时开始自动调整大小。
为了达到这个目的,我使用了FitToViewRestriction和DomainRestriction:

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

这里Domain rect是初始视图端口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);
}

这给了我描述的行为。我想你想要类似但只适用于x轴的东西。即,您希望y保持固定在其初始值,但是您希望x随着FitToView的数据进行扩展。只需修改上述方法,您就应该能够获得该行为。

答案 2 :(得分: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))
};