High density Silverlight charting control - silverlight

I've been looking into Silverlight charting controls to display a large number of samples, (~10,000 data points in five separate series - ~50k points all up).
I have found the existing options produced by Dundas, Visifire, Microsoft etc to be extremely poor performers when displaying more than a few hundred data points.
I believe the performance issues with existing chart controls is caused by the heavy use of vector graphics.
Ergo one solution would be a client-side chart control that uses the WritableBitmap class to generate a raster chart.
Before I fall too far down the wheel re-invention rabbit hole - has anyone found a third party or OSS control that will manage large numbers of data points on a sparkline?

Check out Visiblox ( http://www.visiblox.com/ ) Charts. I'm working on a telemetry application at the minute which uses three of their charts in the same Silverlight component, plotting about 36,000 points in total, and there is very little slowdown in terms of performance, if any at all.
They have a high performance example on their website here - http://www.visiblox.com/examples/LargeDataSets. I chose to use Visiblox after loooking at the following blog post:
New performance comparison: http://www.visifire.com/blog/2011/12/02/fast-silverlight-charts/
Old performance comparison: http://www.scottlogic.co.uk/blog/colin/2010/12/visiblox-visifire-dynamicdatadisplay-charting-performance-comparison/
My telemetry example is now part of a CodeProject article that I have created, if you want to take a look!

Based on the recommendations here, I have just trialled Visiblox and Infragistics.
Visiblox has a good developer experience, clean APIs, no bloat. While the performance is OK for a few thousand datapoints, performance breaks down as you go into the 100k range. Here's the Visiblox sample with a few thousand points (you can download the sample and just tweak the number of datapoints).
Now, the common argument here is that you should not bind that much data to a chart anyway, but should do some trimming beforehand. I do agree with that, but ideally, I want a chart control that does take care of that for me. Getting Zooming, Panning and all that right are non-trivial tasks and I'd be happy to shell out a few 100$ to get that functionality. It's plain economic common sense to not reinvent the wheel here.
Infragistics certainly gets that right. I can bind a million odatapoints and get smooth peformance. Here's the Infragistics sample.
However, Infragistics installs a lot of junk (a local IIS web app with the samples you can also see online) and besides the (excellent) samples and the code-level documentation, I do miss some high-level introduction to each component and it's individual modules.
Since a lot of people on SO recommend Telerik controls for their clean APIs, Documentation and Developer Support, I did also take a look at their chart control. However, I must admit I find it rather slow (Zooming takes roughly 500-1000ms, which is too long to feel smooth).
Here's the Telerik sample.

Visifire is the fastest chart now. Check out the blog link below.
http://www.visifire.com/blog/2011/12/02/fast-silverlight-charts/
The Chart image says Visifire is 3 to 4x faster than Visiblox..!

Before you start playing around with WritableBitmap on your own take a look at WriteableBitmapEx from René Schulte, he blogs about it here. Awesome stuff.

I don't know of any OSS or 3rd party controls that'll do what you need.
The one case where I've had the need for 100K+ of datapoints, we made it work by keeping it simple. The biggest perf killer was the number of elements within each datapoint. By keeping the element a simple ellipse with a static brush fill the app was rather snappy.

Infragistics claims to be able to handle massive amounts of data in their recently released xamDataChart.
http://www.infragistics.com/dotnet/netadvantage/silverlight/data-visualization/xam-web-data-chart.aspx#Overview

I believe the Telerik sample you are looking for can be found here. It shows large amounts of data that you can actually zoom in/out of. They also have a Server Load "Performance" Demo as well. Here is an example of the Scatter Chart with hundreds of data points.

Have you looked at the Telerik charting controls? Here is a link to one of their demos where they are using 100.000 data points:
http://demos.telerik.com/silverlight/#Chart/Sampling
I should also mention that I have not used the charting controls myself, so I cannot vouch for them. But the demos look good to me.
EDIT:
The link above has gone stale. Here is a link to the latest incarnation of the Telerik charting control They call it ChartView now:
http://demos.telerik.com/silverlight/#ChartView/FirstLook

Related

Silverlight 4 - Tournament style view (knockout, tree)

I'm trying to create a view in Silverlight that can display rounds in a tournament. At the moment I have a set of grid views side by side and each one shows all the people still in that round of the knockout.
What I am trying to achieve is a view that shows clearly who played who and when their next games. Something similar to the below. I'm just wanting some pointers in the direction of what control I could manipulate enough to achieve this as I am very much new to Silverlight.
If you're looking for components you can tweak to work this way, I would strongly recommend investigating some of the third-party components designed for creating diagrams and/or org charts. Some cost money, but in my experience, the cost of a third-party control is less than the cost of my time to reproduce it myself. Here are some links to investigate:
Free: (Most of these are vertical, but you could tweak them to meet your horizontal layout):
http://www.codeproject.com/KB/cs/Org_Chart_Generator.aspx
http://omourad.blogspot.com/2009/08/silverlight-organization-chart.html
http://www.sharpdevel.com/2009/12/organization-chart-free-control-in.html
Money:
http://nwoods.com/components/silverlight-wpf/goxam-overview.htm (<-- my personal preference)
http://www.mindfusion.eu/diagramlite.html
http://www.syncfusion.com/products/user-interface-edition/silverlight/diagram
Good luck!

WPF Charting + Grid help

We I'm looking for good WPF toolkit (ones that cost money) that can provide both powerful grid and charting. I'm not that up-to-date whats out there, so i was hoping anyone can assist me with where i should look for. some of the most needed features we need:
Grid:
Hierarchical tree grid
Charting:
panning and Zooming
3D charts
Empty Data point display
Line chart / Scatter Plot
any suggestion would be highly appreciated.
You might want to read this: https://stackoverflow.com/questions/1152016/best-charting-tool-for-silverlight-and-wpf
We're currently using two toolkits for WPF development:
Telerik
Infragistics
They both features charts and a powerful grid, plus a bunch of other things. There isn't much between them to be honest. Telerik seems to look a bit slicker. On the other hand the technical support you get from Infragistics is first class and well worth paying for. You can get a chat session with an actual developer within a couple of minutes and they usually have a solution for whatever problem you are facing.
I would happily recommend either of these.

Telerik vs. Infragistics for Silverlight

Yes, this is certainly a duplicate question, but I wanted to get some fresh takes.
My impression is that Telerik is a much more complete suite, but I'm really really turned off by the responsiveness of their controls. It just seems "clunky" in terms of responsiveness (I have a very fast computer and video card). Scrolling in a grid and transitions chunk, even in their latest demos where they claim to have good performance. I do like that their WPF suite matches their SL one in terms of API.
Infragistics has fewer controls and less theming possibilities, but their controls are very responsive. Scrolling in a grid is fluid, as are their combo menus and all the other controls.
I checked out ComponentOne and their controls seem analogous to Telerik's in terms of the points mentioned above but are a little less "pretty".
Any thoughts from other users of these suites? Basically, what I'm looking for is a suite that will be highly performant and responsive, relatively customizable from a theming standpoint, and have enough functionality to develop a LOB SL application without having to use multiple suites to satisfy the majority of common requirements.
Telerik by far has the slowest (clunky) controls. We've downloaded datagrids from many of the control companies (Infragistics, ComponentOne, Telerik, etc) and found Telerik's to be the slowest as far as loading and refreshing hundreds of thousands to a million rows. I can't speak much for the rest of the controls tho. Testing speed and memory consumption, we found the C1Flexgrid was fastest, followed by Infragistics xamGrid, then Microsofts grid, C1Datagrid and last was Telerik's radGridView.
If you think about this, would you really ever want to load 100's of thousands to 1 million records in a grid or any control for that matter? Well unless you're trying to come up with some marketing fodder?
I don't know of a monitor that could load that many at once to look at. Even if it could, maybe I'm just slow but I can only process them a couple at a time.
What can an average user look at and process. 10 records, maybe 20.
I could see maybe wanting to load a 100 or so and not have to page to get new recors, but thousands or millions? Personally I'm going to require filter capabilities and paging and if I have a developer trying to load 1 million records into a grid, we're going to have to have a sit down because the performance of a grid or any other control is not the issue.
Let's look at a multi billion $ company who has a site and it's sole purpose is to return data to a users. I'm referring to Google. Do a search and you get back around 10 records. I just did a search and got 21,400,00 results. If I don't find what I'm looking for in the first page or two (20 records), I know I didn't filter good enough. I'm not not sifting through a million records.
So that puts your performance back to your logic of retrieving records and giving your users the correct ability to filter down the data they really need at the time.
How fast one grid shows 1.5 million records seems like fodder for "bench racing" and who cares if it's sluggish scrolling because why pull back that many records to start with?
I apologize if I'm missing the point and you're just having fun with bench racing. But I read you are talking about real world, LOB applications and if that's the case then we need to be realistic about the scenarios.
We use the Telerik grid and it performs just fine for real world LOB app. Again though the users we write for can't look at or process 1.5 millions at once nor would they care too.
Also as you're finding out in this thread their support is second to none and I'll take that anyday from a any company we buy a these types of products from over whether they can load a million records in a grid or not. Telerik, Infragistics or whoever.
For anybody serious about real world scenarios and trying to find a quality suite, the first thing to realize is who's on this thread trying to answer questions about their products.
Please have a look at the following demo which binds 1.5 million rows to a grid with sorting and filtering enabled:
http://labs.infragistics.com/silverlight/lobsamples/2010.3/#/Samples/Grid/Performance/GridLargeResultSet
The "Virtual Collection" is another performance feature:
http://labs.infragistics.com/silverlight/lobsamples/2010.3/#/Samples/VirtualCollection/Scrolling/xamGridScrolling
Disclaimer: I am a Technical Evangelist with Infragistics
I suggest you to check the Performance section in our demos for more info about how the grid will perform with large data and/or real-time updates. Here are several examples:
http://demos.telerik.com/silverlight/#GridView/Performance
http://demos.telerik.com/silverlight/#GridView/UIVirtualization
http://demos.telerik.com/silverlight/#GridView/RealTimeUpdate
http://demos.telerik.com/silverlight/#DataVirtualization/FirstLook

Real-time WPF chart .Net 4

I'm working on a diagnostic tool and receives data every 25 ms. I need this data to be drawn in my chart using a lineSeries. I'm using a a wpf chart with a lineSeries which I bind in xaml to an ObservebleCollection.
The problem is that I need the collection needs to contain atleast 1600 datapoints before starting to remove them at the front.
I understand that 25 ms is a short tiem then it comes to drawing in wpf. Dose anyone have any solution to my problem?
Regards
You should check out SciChart, which can handle data updates at 1ms. It renders like a game-loop, so only draws when new data is appended and the UI thread is free. Some more information at www.scichart.com/wpf-chart-features which shows the features and talks about performance.
Disclosure: It's my own component, so ask any questions if you have them!
I'd suggest you use a custom made drawing routine utilizing WritebleBitmap instead of shapes and draw your lines in a fixed area one segment at a time without any scrolling. The, when you reach 1600 points at the right side of your plot area, start over. Maybe some visual indicator (like vertical line or something) would help perception.
I don't think there any charting libraries targeted at updating 1600 point line every 25ms.
I have a .NET application that charts many measurements on a 33ms interval. I tested a number of charting solutions to accomplish this task, but the only real viable option I found was Arction LightningChart (http://www.arction.com). Lightning Chart will do what you want pretty easily, and I think you can get the basic version for free. The downside will be a dependency on DirectX and the SlimDX library. The trial that you can download from the site will give you pretty good examples of how to use this control in WPF and Windows Forms.
Use Microsoft Chart for WinForms using the WindowsFormsHost control. MS-Chart can handle such data rates well. It internally uses the WritableBitmap method, so it is both fast and stable. Also, don't forget to set the series type to FastLine to avoid slowdown.
I've created a "Tip" article on codeproject which tries to highlight this type of high-data volume usage on MS-Chart. You can change the timer interval to even 1 ms. and see that there is no issue in showing the data.
The article is at http://www.codeproject.com/Tips/1006180/Using-Microsoft-Chart-in-WPF

Where to learn proper way to use Silverlight (or WPF)

Approaching Silverlight development is a rather daunting task as it seems to require a rather different mindset to work I have done in the past.
I have been working on it for several months and we have already released an application that presents form-based pages. So I have the basics of XAML for layout but what I need to do now is move into graphically representing data. For example transform a list of objects representing vehicle speed recordings into a line graph of speed. I am at a loss on what the best way is to approach this.
Can anyone point me to articles or tutorials that present this kind of thing?
Your first port of call for Silverlight learning should be the official site http://silverlight.net/Learn/
If you want to do any data visualization/charting then first try the Silverlight Toolkit on codeplex. It's fantastic if you want to get anything up and running quickly.
Also check out Delay's Blog on charting and the chartbuilder code
Bang your head against it for 3-6 months. That's how I did it and it's worked out pretty well so far.
But seriously, the learning curve sucks.
There's charting libraries for Silverlight out there, you could grab one of those but I wouldn't waste money on it. It's relatively easy to write this kind of code yourself.
All you really need is a DrawingVisual. Once you have that you can render what you need on to it's surface. The trick is to make sure that you have sufficient layout information when you render. Because this is vector graphics, you can use the ScaleTransform to match your content bounds instead of repainting on size changed. Other than that, you'll wanna host your DrawingVisual in a UIFrameworkElement and let the dimension of that object govern where and how you draw your data. This will give you all the layout goodness of WPF/Silverlight.
For drawing there are plenty of Geometry classes you can rely on but there's one thing that you'll wanna do and that's to adjust the level of detail in your data points with respect to your drawing. This is the number one trick to make sure you don't hog the CPU.
Avoid drawing more than one data point per pixel. If you have a lot of data points, and a small drawing surface you can use a rolling average to smooth the result.
If you approach this with the above things in mind you should be able to write a flexible graph UI element that you can visualize data with, in no time at all.
I did this in a WPF application, I'm pretty much assuming that you can do the exact same thing with Silverlight 2.0, you'll just yell at me if you cant?

Resources