写点什么

Arction 高性能图表控件 LightningChart 将条形图与自定义刻度对齐问题解答

用户头像
Geek_bacee5
关注
发布于: 2021 年 04 月 22 日
Arction高性能图表控件LightningChart将条形图与自定义刻度对齐问题解答

LightningChart.NET完全由 GPU 加速,并且性能经过优化,可用于实时显示海量数据-超过 10 亿个数据点。LightningChart 包括广泛的 2D,高级 3D,Polar,Smith,3D 饼/甜甜圈,地理地图和 GIS 图表以及适用于科学,工程,医学,航空,贸易,能源和其他领域的体绘制功能。


问:我目前正在制作带有自定义刻度线的条形图。我在将条形图与自定义刻度线对齐时遇到问题。我正在使用以下功能来查找 x 轴宽度。已经使用 setRange()函数将 x 轴的最小值设置为 0,最大值设置为 1000。private GetXAixsWidth(LightningChartUltimate _chart){var min = _chart.ViewXY.XAxes [0] .ValueToCoordD(_chart.ViewXY.XAxes [0] .Minimum);var max = _chart.ViewXY.XAxes [0] .ValueToCoordD(_chart.ViewXY.XAxes [0] .Maximum);return max - min;}


我正在使用以下功能来设置条形系列中条形的宽度。


private void SetBarsWidth(List<double> xValues){List<double> xValues = new List<double> xValues{0,150,300,400,500,700,850,900,1000};var xAxisWidth = GetXAixsWidth(_chart);var denom = (double)(xValues.Last() - xValues.First());var propWidth = xAxisWidth / denom;for (int index = 0; index < _chart.ViewXY.BarSeries.Count; index++){double cVal = xValues[index + 1] - xValues[index];var bWid = (double)(cVal * propWidth);_chart.ViewXY.BarSeries[index].BarThickness = (int)Math.Ceiling(bWid);}}


在上面的代码中,我试图通过将 XValues 中的最后一个第一个值减去 XValues 中的最后一个值来找到 X 轴的总宽度并找到值的范围。将总宽度除以范围后,我们得到的是比例宽度,将其与 XValues 中相邻值之间的差异相乘,以基于相邻值中的差异找到合适的钢筋宽度。请找到以下示例,以了解用于固定条形宽度的方法。示例:XAxisWidth =1200denom =1000propWidth = 1200/1000= 1.2


First Bar Width = ((150-100)*1.2) = 60Second Bar Width = ((300-150)*1.2) = 180


通过上述方法,在条形图与自定义刻度线的对齐方面几乎没有偏差,这在附加的图像文件中使用红色框突出显示。BarSeries 中的 BarThickness 期望以像素为单位的宽度(整数值),而 ValueToCoordD 返回坐标值(浮动值)。在将浮点值转换为整数时,我们得到的值略有变化,这使得条形图的对齐稍稍在自定义刻度线之前或之后。如何获取自定义刻度的确切像素值,或者如果有其他方法可以解决此问题。


回复:将条形图与自定义 ti 对齐的条形图问题 BarViewOptions(尤其是分组)的设置是什么?您可以将整个项目发送到 Arction 的支持帐户进行测试吗?我在应用程序中未使用任何 BarViewOptions。按照建议 1.将示例应用程序发送到 arction 的支持帐户(support@arction.com)。2.随附示例应用程序的屏幕截图。


问题:由于 BarThickness 期望以像素为单位的值,所以我想知道是否可以找到以像素为单位的 x 轴宽度(附件中从 0 到 1000)?回复:如果要将 Bar 放置在特定的 XAxis 值,则应设置 lightningchart.ViewXY.BarViewOptions.Grouping = BarsGrouping.ByLocation; 默认选项“ ByIndex ”和另一个选项“ ByIndexFitWidth ”将不依赖 XAxis。取而代之的是,条形图绘制在图表的中心,而没有绑定到 XAxis。请注意,您可以将 Xaxis 平移(拖动)到任何方向,并且条形图将保持在同一位置。因此,您需要将“分组”设置为“按位置”,然后才比较 CustomTick 和 Bar 的位置。


单独使用该选项基本上可以解决您的问题。但是,我想提及您的应用程序中的几个问题。首先,您使用 WindowsFormsHost 在 WPF 中放置 Arction Windows 窗体控件。允许这样做,但是这样做有其优点和缺点。您可以在我们的用户手册中阅读有关内容。无论如何,仅提醒您,我们有 3 个 WPF 版本,在大多数情况下,它们比通过 WindowsFormsHost 使用 WinForm 版本更好。其次,您应该使用 axisX.ValueToCoordD(value,FALSE)。请注意,第二个参数设置为 false,因此您可以将输出作为屏幕像素而不是 DIP 单位。在 WinForms 中,这并不重要,但是对于 WPF,在缩放比例大于 100%的系统中将是一个问题。第三,您的 lightningchart.SizeChanged 处理程序事件未使用 BeginUpdate-EndUpdate 调用。当您有成百上千的酒吧系列时,这将是一个问题。只是提醒您,每个属性更改(此处为 BarThickness)都将导致图表呈现。要批量更改属性,请使用 BeginUpdate-EndUpdate 调用。第四,控件 Resize 事件在 Chart 实际呈现之前发生。并且在未呈现图表之前,某些属性尚未更新。这可能会导致一些意外的结果。我建议在 SizeChanged 事件处理程序中订阅_chart.AfterRendering 事件。并且仅在 AfterRendering 事件处理程序中更新条的粗细(请从 AfterRendering 退订)第一的)。例如,lightningchart.SizeChanged += (sender, val) =>{lightningchart.AfterRendering += Lightningchart_AfterRendering;};


    private void Lightningchart_AfterRendering(object sender, AfterRenderingEventArgs e)    {        lightningchart.AfterRendering -= Lightningchart_AfterRendering;        UpdateBarThickness();    }
复制代码


第五,虽然没有错,但是可以很好地替换 GetXAixsWidth 方法的是 axisX.GetActiveAxisArea().Width


如果对此有任何疑问,请联系Arction客服以获取更多信息。

 

关于 LightningChart

LightningChart是一家坐落于北欧芬兰的控件开发商Arction Ltd 的产品,是微软公司认证的合作伙伴。高性能图标控件 LightningChart 高效渲染效率很受.NET 开发者青睐。Arction 在重塑图表控件领域中做出极大成绩: 2009 年,Arction 成为业界第一家 WinForms图表控件领域中引入 DirectX 2D 渲染的制造商; 2013 年,以第一家针对 WPF 制图行业中使用 DirectX 引入真正硬件加速的制造商而闻名;近年来,Arction专注于开发最高性能和最先进的数据可视化工具,设定行业最高标准。

用户头像

Geek_bacee5

关注

还未添加个人签名 2021.04.15 加入

还未添加个人简介

评论

发布
暂无评论
Arction高性能图表控件LightningChart将条形图与自定义刻度对齐问题解答