
I just started using the RadChart control and am attempting to create an XY scatter chart that displays matrix data that consists of row/column coordinates with a measurement value at each row/column location. Both the row and column are 1-to-n, so I don't know the upper bound size of each is until runtime. Here's the class representation of a single datapoint:
public class Measurement { public int Row { get; set; } public int Column { get; set; } public double Value { get; set; } }This is the method I'm using to create sample data that I am using to test this out with each row/series of data having multiple measurements:
private List<Measurement> CreateMeasurements() { // Create sample data List<Measurement> measurements = new List<Measurement>(); measurements.Add(new Measurement() { Row = 2, Column = 1, Value = 130.5 }); measurements.Add(new Measurement() { Row = 2, Column = 2, Value = 135.0 }); measurements.Add(new Measurement() { Row = 2, Column = 3, Value = 133.0 }); measurements.Add(new Measurement() { Row = 2, Column = 4, Value = 127.0 }); measurements.Add(new Measurement() { Row = 2, Column = 5, Value = 120.0 }); measurements.Add(new Measurement() { Row = 3, Column = 1, Value = 140.5 }); measurements.Add(new Measurement() { Row = 3, Column = 2, Value = 150.5 }); measurements.Add(new Measurement() { Row = 3, Column = 5, Value = 135.0 }); measurements.Add(new Measurement() { Row = 3, Column = 6, Value = 133.2 }); measurements.Add(new Measurement() { Row = 4, Column = 2, Value = 145.5 }); measurements.Add(new Measurement() { Row = 4, Column = 3, Value = 155.5 }); measurements.Add(new Measurement() { Row = 4, Column = 5, Value = 160.5 }); measurements.Add(new Measurement() { Row = 4, Column = 6, Value = 165.8 }); return measurements; }What I am attempting to do is configure the chart declaratively in XAML, but I can't seem to figure out how to get a series for each row this way since it seems as though I need to know how many ItemMappings there will be beforehand. Here's the XAML I started with for the chart:
<telerik:RadChart HorizontalAlignment="Left" Margin="12,12,12,12" x:Name="XYScatterChart" VerticalAlignment="Top" > <telerik:RadChart.SeriesMappings> <telerik:SeriesMapping LegendLabel="Row"> <telerik:SeriesMapping.SeriesDefinition> <telerik:LineSeriesDefinition/> </telerik:SeriesMapping.SeriesDefinition> <telerik:SeriesMapping.ItemMappings> <telerik:ItemMapping DataPointMember="YValue" FieldName="Value"/> <telerik:ItemMapping DataPointMember="XValue" FieldName="Column"/> </telerik:SeriesMapping.ItemMappings> </telerik:SeriesMapping> </telerik:RadChart.SeriesMappings> </telerik:RadChart> public MainWindow() { InitializeComponent();
// Set chart source data List<Measurement> measurements = CreateMeasurements(); XYScatterChart.ItemsSource = measurements;
// Get distinct row values var rowValues = (from measurement in measurements select measurement.Row).Distinct();
// Add series mappings foreach (int rowValue in rowValues) { SeriesMappingCollection seriesMappings = XYScatterChart.SeriesMappings; CreateSeriesMapping(XYScatterChart.SeriesMappings, rowValue); } }
private void CreateSeriesMapping(SeriesMappingCollection seriesMappings, int rowValue) { // Add a new mapping SeriesMapping seriesMapping = new SeriesMapping(); seriesMappings.Add(seriesMapping);
// Set the legend label seriesMapping.LegendLabel = String.Concat("Row ", rowValue.ToString());
// Set the series definition seriesMapping.SeriesDefinition = new LineSeriesDefinition();
// Add the filter descriptor ChartFilterDescriptor filterDescriptor = new ChartFilterDescriptor(); filterDescriptor.Member = "Row"; filterDescriptor.Operator = FilterOperator.IsEqualTo; filterDescriptor.Value = rowValue; seriesMapping.FilterDescriptors.Add(filterDescriptor);
// Add the item mappings ItemMappingCollection itemMappings = seriesMapping.ItemMappings; itemMappings.Add(new ItemMapping("Column", DataPointMember.XValue)); itemMappings.Add(new ItemMapping("Value", DataPointMember.YValue)); }