Declined
Last Updated: 11 Oct 2016 08:42 by ADMIN
Marcello
Created on: 23 Aug 2016 10:20
Category: ChartView
Type: Feature Request
2
Chart architecture
Hi,

I worked with a lot of chart components for Wpf. I think Telerik offer the best charts architecture that allow to obtain great results in every scenario.

After years of use, I think is possible to  improve more the global architecture.

1) Series Dataset

Charts now works with Points. I think that a better solution require a more abstract structure as a virtual "Dataset".
A dataset reuire a type [conform to X axis], tipically X can be a double, a datetime, a label.
Dataset return info about poits, tipically:
- Min X
- Max X
Dataset return a DataContext that allow to draw chart:
- GetCloserX to an X value [Trackball/Lables...]
- GetPoints from/to [Pan/Zoom]

This approach is really more efficent and powerfull. In example you can simply define a Dataset as a Formula:

Dataset "CosX" based on doubles.
MinX=-inf
Maxx=+inf
GetDataContext from/to -> Return allways 100 points x, cos(x).

So you can obtain:

- Ultraefficient series using GetDataContext algorithms for specific cases, in example, ordered data.
- Trend lines using "Formula" series

2) Only one series, with subtypes.

It is really annoying change series type.
I think a chart must contains a series and this series can show Line, Area, Split Line, Markers, Columns...

To write a good "option panel" that allow user to set Line Thickness, Line Split or standard, Area opacity, Area Color, Marker Type, Marker Colors, Columns Borders... require today a giant work and elaborate code that add and remove serie, reassign points, set z-index, remove and add series in legend... with an incredible useless works in points.

3) More accurate axes definition.

Now Chart and Series expose Horizontal and Vertical Axis property.
I think this is terrible properties :-).

"Horizontal" and "Vertical" is depending chart orientation. Furthermore now, first X/Y axis must be set in chart, others in series. Moving series from an axis to another is really annoying: if new axis is first you must set is null else you must set it...

I think Chart must expose XAxesCollection and YAxesCollection. This collections must contains all X and Y axes.
Series [and annotation and every object that uses axes] must expose XAxis and YAxis as the Axis object or Axis index.

4) Chart orientation

Today a simple chart rotation require a lot of code. The developer must be invert Horizontal and vertical axes, change axes in series and annotations, zoom/pan stop to work...
When this is combined with point 2) problems the result is an nightmare.

I understand this require a big work and a lot of compatibility problems [Telerik already exposes two charts versions, three is probably a little bit confused].

But if Telerik obtains this features I think it become the most unattainable charts component producer of the world.

Decline reason: Most suggestions were tried in the old RadChart and they weren't working very well.
(Total attached files size should be smaller than 20mb. Allowed extensions: .zip, .rar, .jpg, .png, .gif)
5 comments
ADMIN
Martin
Posted on: 11 Oct 2016 08:41
Hello Marcello,

We are glad to hear that you like our charting components and thank you for sharing your thoughts with us.

However, we are going to decline this feature request. The main reason behind this decision is that most of the suggestions were presented in our old charting component RadChart, but in time we saw that they do not work very well when it comes to covering a big variety of scenarios. And since the chart is used from different users with different use cases, this is quite important. Indeed, the new RadChartView is not perfect, but parts of its implementation are based on the unpleasant experience from RadChart.

As for the "blind chart" we agree that it is very fast, but its implementation is focusing explicitly on the trackball behavior. In RadChartView the trackball is only one of the features and it won't be that simple to use your idea without breaking the performance or functionality of other features.

Regards,
Martin Ivanov,
Technical Support Engineer
Marcello
Posted on: 02 Sep 2016 08:20
Bug fix & memory improvements
Attached Files:
Marcello
Posted on: 02 Sep 2016 08:19
deleted by marcellopoletti
Marcello
Posted on: 01 Sep 2016 14:52
Attached an example of my ideas.
Is a "blind chart" that not draw series but zomm/pan, track points, rotation, axis inversion, track labels are enabled.

Test chart works with 20 series with 100.000 points each with great performances (see http://feedback.telerik.com/Project/143/Feedback/Details/198264-ordered-dataset-for-ultraefficient-trackbals-engine-and-pan-zom-behavior). Look that it can work also with 50 milions of points [consuming a lot of memory] with same performances!

Look architectural differences with current telerik chart component:

- You can assign/change/move X/YAxes to a series without problems
- You can rotate chart without problems
- DataSource can be extremely efficient.
- You can define/change zomm/pan [For axis, not for chart!] without problems.
Attached Files:
Marcello
Posted on: 24 Aug 2016 12:25
A little fragment of pseudocode that shows what will be wonderfull!

Suppose that we want to create a scatter chart with three series and two Y axes, left and right.

- let S1 a data series with 10 values, on left axis
- let S2 a trend linear series, based on S1 values, on left axis
- let S3 a annotation series that simply show cos(x) foreach zoom pan, on right axis

First, we define chart and axis

var c=new Chart();
c.XAxes.Add(new DoubleAxis());
c.YAxes.Add(new DoubleAxis());
c.YAxes.Add(new DoubleAxis(){Position:Right});

Now, we define the Datasources:

//the RandomDoubleDataSources generate N points starting from start value. X values step is step value.
var d1 = new RandomDoubleDataSources(points:10, start:0, step:1)
//the TrendDataSource generate trend line points using a source datasource
var d2 = new TrendDataSource(d1){Algorithm = Linear}
//The function series can generate N values for each zoom/pan range based on a function
var d3 = new FunctionDataSource((v)=>{return Math.Cos(v)})

//So, the series
var s1 = new Series(){Description=“S1”, Datasource=d1, XAxis=0, YAxis=0}
var s2 = new Series(){Description=“S2”, Datasource=d2, XAxis=0, YAxis=0}
var s3 = new Series(){Description=“S3”, Datasource=d3, XAxis=0, YAxis=1}
c.Series.Add(s1,s2,s3);

Thats all, component can draw chart.
By default chart draw lines but we can add/change new renderers.

//Now we want to show s3 as columns:
s2.Renderers.Set(new ColumnsRenderer());

//Now we want to show markers in s1 (over the line, not instead of!)
s1.Renderers.Add(new MarkerRenderer());

//main properties and sub properties.
//now we want to set “main color” of line and marker of s1 as red:
a1.MainStroke = Brushes.Red; //!!!!

//now we want to set marker color of s1 as blue:
((MarkerRenderer )a1.Markers[1]).Stroke = Brushes.Blue; //!!!!

//now we want reduce opacity for every renderer in s1
s1.Opacity = 0.5;

//chart manipulation
//Now we want invert series y axes:
s1.YAxes=1;
s2.YAxes=1;
s3.YAxes=0;

//Now we want to rotate chart (X-Axis in left position)
c.Rotation = ChartRotation.RotateRight;

//now we want to add new x axes as ContinousDatetimeAxis and a new series:

c.XAxes.Add(new DoubleAxis(){Position:Top}); //Look that is not important that chart is now rotated!!! 
var d4 = new RandomDateTimeDataSources(points:10, start:System.Datetime.Today, step:new System.TimeSpan(day:1));
var s4 = new Series(){Description=“S4”, Datasource=d4, XAxis=1, YAxis=1}
c.Series.Add(s4):