I would like to create a multi-dimensional graph like the example below. My table data is in the format unit, rating and total count
I'm having a hard time trying to work out how to get this effect with webchart. I'm using the databind method.
I have been mucking around with the IRenderLabel class and I can achieve the rating labels on the top of the graph but not in the desired format.
Any help/ideas on how to achieve this would be much appreciated.
Cheers,
Steve
unit rating count
A1 Likely (4)-Serious (1.5)-High 1A1 Possible (3)-Serious (1.5)-High 60A1 Possible (3)-Important (1)-Moderate 25A1 Unlikely (2)-Important (1)-Moderate 2A1 Possible (3)-Major (4)-Very High 1A2 Likely (4)-Serious (1.5)-High 1A2 Possible (3)-Serious (1.5)-High 51A2 Possible (3)-Important (1)-Moderate 11A2 Unlikely (2)-Important (1)-Moderate 2
basically you need to get the chart data into a format it expects. here's how i handled this:
DataTable table = new DataTable(); table.Columns.Add("unit", typeof(string)); table.Columns.Add("rating", typeof(string)); table.Columns.Add("count", typeof(int)); table.Rows.Add(new object[] { "A1", "Likely (4)-Serious(1.5)-High", 1 }); table.Rows.Add(new object[] { "A1", "Possible (3)-Serious(1.5)-High", 60 }); table.Rows.Add(new object[] { "A1", "Possible (3)-Important(1)-Moderate", 25 }); table.Rows.Add(new object[] { "A1", "Unlikely (2)-Important(1)-Moderate", 2 }); table.Rows.Add(new object[] { "A1", "Possible (3)-Major(4)-Very High", 1 }); table.Rows.Add(new object[] { "A2", "Likely (4)-Serious(1.5)-High", 1 }); table.Rows.Add(new object[] { "A2", "Possible (3)-Serious(1.5)-High", 51 }); table.Rows.Add(new object[] { "A2", "Possible (3)-Important(1)-Moderate", 11 }); table.Rows.Add(new object[] { "A2", "Unlikely (2)-Important(1)-Moderate", 2 }); UltraChart1.ChartType = ChartType.ColumnChart3D; UltraChart1.Series.AddRange(this.GetSeriesFromTable(table, "rating", "unit", "count")); UltraChart1.Data.DataBind(); private NumericSeries[] GetSeriesFromTable(DataTable table, string seriesNameColumn, string categoryNameColumn, string valueColumn) { List<NumericSeries> result = new List<NumericSeries>(); Dictionary<string, NumericSeries> seriesByLabel = new Dictionary<string, NumericSeries>(); StringCollection allCategories = new StringCollection(); // first create all the series foreach (DataRow row in table.Rows) { string seriesLabel = row[seriesNameColumn].ToString(); NumericSeries currentSeries; if (seriesByLabel.ContainsKey(seriesLabel)) { currentSeries = seriesByLabel[seriesLabel]; } else { currentSeries = new NumericSeries(); currentSeries.Label = seriesLabel; result.Add(currentSeries); seriesByLabel.Add(seriesLabel, currentSeries); } string category = row[categoryNameColumn].ToString(); if (!allCategories.Contains(category)) { allCategories.Add(category); } } foreach (NumericSeries series in result) { foreach (string category in allCategories) { series.Points.Add(new NumericDataPoint(0.0, category, false)); } } foreach (DataRow row in table.Rows) { string seriesLabel = row[seriesNameColumn].ToString(); NumericSeries currentSeries = seriesByLabel[seriesLabel]; string category = row[categoryNameColumn].ToString(); int indexOfCategory = allCategories.IndexOf(category); currentSeries.Points[indexOfCategory].Value = Convert.ToDouble(row[valueColumn]); } return result.ToArray(); }
Thankyou very much David, works a treat!