关于c#:动态数据显示图表:更改Y轴范围

Dynamic Data Display charting: change Y axis range

有人知道是否有任何方法可以从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代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <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>

谢谢和最诚挚的问候,
罗德里戈·巴斯尼亚克


希望不是太晚,但是我遇到了同样的问题,并在d3的论坛中找到了解决方案:http://dynamicdatadisplay.codeplex.com/discussions/281164

该代码是由d3用户" fromDKwithlove"创建的。

这是应如何应用限制:

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

这是代码背后的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;
}


我不确定您想要的确切行为-如有必要,可以澄清一下。
我需要使用FitToView将固定的初始轴设置为特定值,以便当图形增大初始轴时,此轴将自动调整大小。
为此,我将FitToViewRestriction与DomainRestriction结合使用:

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

此处,域矩形是确定初始轴限制的初始视口矩形。设置FitToView表示当图形超出此初始限制时,轴将缩放。

但是请注意,在我们使用的D3版本(0.3.4703.0)中,DomainRestriction.Apply的实现没有提供我想要的行为,因此有必要在此修改源代码。有关文件是DynamicDataDisplay \ v0.3.4703-每晚src \ src \ DynamicDataDisplay \ ViewportRestrictions \ DomainRestrictions.cs。
我修改了DomainRestriction。适用于:

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

给出了我所描述的行为。我认为您想要类似的东西,但仅适用于x轴。也就是说,您希望y保持固定在其初始值,但是您希望x随着随FitToView一起输入的数据而缩放。只需修改上述方法,您就应该能够获得该行为。


如果要对DateTime进行相同操作,只需更改DisplayRange对象的创建,如下所示:

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