4

有谁知道是否有任何方法可以从 D3 更改折线图上的 Y 轴限制?

我正在使用 Codeplex 源代码的最后一个版本... WPF 版本,而不是 Silverlight 版本。

我正在绘制来自 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>

这里的域矩形是确定初始轴限制的初始视口矩形。设置 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 的数据进入而缩放。只需修改上述方法,您应该能够获得该行为。

于 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 回答