By MIke Arkhipov - Friday, June 11, 2010
I have two bar series. X axis is date-time. The series are set to be displayed adjacently (series.MultiBarMode = MultiBarMode.Clustered)
Everything is fine unless all X values are same. In this case the X scale collapses in one dot and the axis displays only seconds without date: "01". This happens when I use any MultiBarMode except MultiBarMode.Series.
The code is following: public partial class Form1 : Form { public void ConfigureChart(DataView data, bool primary) { NChartControl chartControl = nChartControl1; chartControl.DataBindingManager.RemoveAllBindings(); NChart chart = chartControl.Charts[0]; chart.Axis(StandardAxis.SecondaryY).Visible = true; NBarSeries series = (NBarSeries)chart.Series.Add(SeriesType.Bar); series.MultiBarMode = MultiBarMode.Clustered; //!! series.DisplayOnAxis(StandardAxis.PrimaryY, primary); series.DisplayOnAxis(StandardAxis.SecondaryY, !primary); series.UseXValues = true; chartControl.DataBindingManager.RemoveAllBindings();
NDateTimeScaleConfigurator xsc = new NDateTimeScaleConfigurator(); chart.Axis(StandardAxis.PrimaryX).ScaleConfigurator = xsc;
NOrdinalScaleConfigurator ysc = new NOrdinalScaleConfigurator(); chart.Axis(StandardAxis.PrimaryY).ScaleConfigurator = ysc;
NLinearScaleConfigurator yprimesc = new NLinearScaleConfigurator(); chart.Axis(StandardAxis.SecondaryY).ScaleConfigurator = yprimesc;
int index = chart.Series.IndexOf(series); chartControl.DataBindingManager.AddBinding(0, index, "XValues", data, "x"); chartControl.DataBindingManager.AddBinding(0, index, "Values", data, "y");
chartControl.Refresh(); }
public Form1() { InitializeComponent();
DataTable t = new DataTable(); t.Columns.Add("x", typeof(DateTime)); t.Columns.Add("y", typeof(double));
t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), -10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), -10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 0); ConfigureChart(t.DefaultView, true); ConfigureChart(t.DefaultView, false); }
}
Am I doing something wrong? How to fix the axis label to display full date, not only seconds?
Thank you.
|
By Blagovest Milanov 1 - Monday, June 14, 2010
Hi Mike, The problem with the configuration below is that sets equal X values to all bars in the master cluster series - if you change: t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), -10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), -10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 0); to: t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 10); t.Rows.Add(new DateTime(2000, 10, 11, 1, 1, 1), -10); t.Rows.Add(new DateTime(2000, 10, 12, 1, 1, 1), 10); t.Rows.Add(new DateTime(2000, 10, 13, 1, 1, 1), -10); t.Rows.Add(new DateTime(2000, 10, 14, 1, 1, 1), 0); you will get floating cluster bars. It does not display correctly in the order case as the range length of the x axis becomes zero. How to fix the axis label to display full date, not only seconds? When the X axis has zero length it will display milliseconds actually - as the axis uses unit / range sensitive formatting. If you use the code above it will switch to date time formatting (day, month, year according to the current culture settings). You can also override this: xsc.EnableUnitSensitiveFormatting = false; xsc.LabelValueFormatter = new NDateTimeValueFormatter("MM/dd/yy"); In the case above - "MM/dd/yy" can be any date time formatting string. Hope this helps - let me know if you meet any problems. Best regards, Bob
|
By MIke Arkhipov - Wednesday, June 16, 2010
Well, the range sensitive formatting is a very nice feature which I wouldn't like to turn off. And we can't control the data. In most cases we get distinct X values, but sometimes they may be all equal. But even with equal X date values when the series.MultiBarMode is set to MultiBarMode.Simple we get a two day time range (from 10/9/2000 to 10/11/2000) on the X axis.
Is there some reason for not having same behavior with MultiBarMode.Clustered? If not, this may be considered a clustered mode bug.
|
By Blagovest Milanov 1 - Wednesday, June 16, 2010
Hi Mike, In cluster mode only the master series x values will be regarded. When you use MultibarMode.Series both series x values will be taken into account. You can consider some additional inflate to the x-axis to ensure the range does not drop to zero: NDateTimeScaleConfigurator xsc = new NDateTimeScaleConfigurator(); xsc.ViewRangeInflateMode = ScaleViewRangeInflateMode.Absolute; xsc.AbsoluteInflate = new NRange1DL(10, 10); chart.Axis(StandardAxis.PrimaryX).ScaleConfigurator = xsc; That way you'll always have 10 points from the left and right sides of the chart (or more) regardless of the range of the data. BTW I would recommend using the range timeline or value timeline scales when you display date time - they're much more informative. Let me know if you have any questions. Best regards, Bob
|
By MIke Arkhipov - Thursday, June 17, 2010
Hi Bob,
I have tried adding the code
xsc.ViewRangeInflateMode = ScaleViewRangeInflateMode.Absolute; xsc.AbsoluteInflate = new NRange1DL(10, 10);
but I still get the same result. I also tried NRange1DL(0, 10) and different scale configurators (RangeTimeline, ValueTimeline)
Any ideas why?
Thanks for your help!
|
By Blagovest Milanov 1 - Friday, June 18, 2010
Hi Mike, Are you testing with the code / data above or there are additional settings? If so can you post the code for review? It worked fine when I tested so it must be something small - so I want to make sure we use the same chart configuration.
Best regards, Bob
|
By MIke Arkhipov - Friday, June 18, 2010
Same piece of code:
public partial class Form1 : Form { public void ConfigureChart(DataView data, bool primary) { NChartControl chartControl = nChartControl1; chartControl.DataBindingManager.RemoveAllBindings(); NChart chart = chartControl.Charts[0]; chart.Axis(StandardAxis.SecondaryY).Visible = true; NBarSeries series = (NBarSeries)chart.Series.Add(SeriesType.Bar); series.MultiBarMode = MultiBarMode.Clustered; //!! series.DisplayOnAxis(StandardAxis.PrimaryY, primary); series.DisplayOnAxis(StandardAxis.SecondaryY, !primary); series.UseXValues = true; series.DataLabelStyle.Visible = false; chartControl.DataBindingManager.RemoveAllBindings();
NDateTimeScaleConfigurator xsc = new NDateTimeScaleConfigurator(); xsc.ViewRangeInflateMode = ScaleViewRangeInflateMode.Absolute; xsc.AbsoluteInflate = new NRange1DL(10, 10); //xsc.AbsoluteInflate = new NRange1DL(0, 10); chart.Axis(StandardAxis.PrimaryX).ScaleConfigurator = xsc;
NOrdinalScaleConfigurator ysc = new NOrdinalScaleConfigurator(); chart.Axis(StandardAxis.PrimaryY).ScaleConfigurator = ysc;
NLinearScaleConfigurator yprimesc = new NLinearScaleConfigurator(); chart.Axis(StandardAxis.SecondaryY).ScaleConfigurator = yprimesc;
int index = chart.Series.IndexOf(series); chartControl.DataBindingManager.AddBinding(0, index, "XValues", data, "x"); chartControl.DataBindingManager.AddBinding(0, index, "Values", data, "y");
chartControl.Refresh(); }
public Form1() { InitializeComponent();
DataTable t = new DataTable(); t.Columns.Add("x", typeof(DateTime)); t.Columns.Add("y", typeof(double));
t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 0); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 10); t.Rows.Add(new DateTime(2000, 10, 10, 1, 1, 1), 20); ConfigureChart(t.DefaultView, true); ConfigureChart(t.DefaultView, false); } }
|
By Blagovest Milanov 1 - Tuesday, June 22, 2010
Hi Mike, You have to pass different x values - in this case the length of the axis is simply zero. You can workaround the problem by assigning a fixed view range in the case where all x values are equal - for example: chart.Axis(StandardAxis.PrimaryX).View = new NRangeAxisView(new NRange1DD( new DateTime(2000, 10, 9, 1, 1, 1).ToOADate(), new DateTime(2000, 10, 11, 1, 1, 1).ToOADate())); We'll publish a SP fixing this in the next couple of days. Let me know if you meet any problems. Best regards, Bob
|
|