【问题标题】:Dynamic Data Display charting: change Y axis range动态数据显示图表:改变 Y 轴范围
【发布时间】:2012-03-07 10:51:56
【问题描述】:

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

我正在使用 Codeplex 来源的最新版本... WPF 版本,而不是 Silverlight 版本。

我正在绘制来自 Android 传感器的读数,并且范围值发生了很大变化。有时它大约为零,图表如下所示:

然后值的大小发生变化,Y 轴重新缩放以显示整个数据,图表现在如下所示:

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

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

【问题讨论】:

  • 如果值超出初始设置范围(-10 到 10),您想要什么行为?轴应该保持固定(并且图形裁剪)还是应该重新调整轴以适应所有点?
  • 如果值超出初始范围,我不会打扰。无论如何,我都需要定义的范围保持不变。这些值不应超过定义的范围,但如果超过了,图形裁剪它们就可以了。

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


【解决方案1】:

希望还不算太晚,不过我也遇到了同样的问题,在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;
}

【讨论】:

  • 您知道如何应用此代码来设置日期时间轴的范围吗?
【解决方案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 的数据进入而缩放。只需修改上述方法,您应该能够获得该行为。

【讨论】:

  • 嗨,你的代码给了我一个线索,告诉我怎么做。我看到D3 dll上有很多限制对象。但我不知道如何应用它们。我试过了,但没有成功。我编辑了我的帖子以更好地阐明我的需求。
【解决方案3】:

如果您想对 DateTime 做同样的事情,只需像这样更改 DisplayRange 对象的创建:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2014-07-17
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多