有没有人知道是否有办法改变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>
谢谢和最诚挚的问候, Rodrigo Basniak
答案 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))
};