Hi,
I am plotting scatter chart for 2 days. But there is a time in between when there is no data at all. Is there a way that I can get rid of this empty area on x-axis, and from the whole chart?
I want the x-axis label to be shown only if the data (y) is avaiable. For example, there is no data between 12-11 15:36 and 12-12 09:54, then this space should disappear on x-axis, and make the chart look continuous.
Many Thanks in Advance
I tried replicating this, but couldn't get the same behavior. Please check your data to make sure that factorData.x.Value is not always the same for each layer. That's really the only thing I can think of at the moment. You can debug the problem better if you bound your series to some very simple sample data. Otherwise, the code seems correct to me.
I first setup the chart like the following:
try
{
_chart.ChartType =
ChartType.Composite;
ChartArea area = new ChartArea();
_chart.CompositeChart.ChartAreas.Add(area);
yAxis.DataType =
AxisDataType.Numeric;
yAxis.Labels.Flip =
false;
yAxis.Labels.ItemFormat =
AxisItemLabelFormat.DataValue;
yAxis.Labels.ItemFormatString =
"<DATA_VALUE:0.##>";
yAxis.Labels.HorizontalAlign =
StringAlignment.Far;
yAxis.Labels.Layout.Behavior =
AxisLabelLayoutBehaviors.Auto;
yAxis.Labels.OrientationAngle = 0;
yAxis.Labels.VerticalAlign =
StringAlignment.Center;
yAxis.Labels.SeriesLabels.HorizontalAlign =
yAxis.Labels.SeriesLabels.Layout.Behavior =
yAxis.LineThickness = 1;yAxis.OrientationType =
AxisNumber.Y_Axis;
yAxis.RangeType =
AxisRangeType.Automatic;
yAxis.TickmarkStyle =
AxisTickStyle.Smart;
yAxis.NumericAxisType =
NumericAxisType.Linear;
yAxis.Visible =
true;
area.Axes.Add(yAxis);
_compositeChartLayers =
new Dictionary<string, ChartLayerAppearance>();
for (int i = 0; i< numberOfDays_; i++)
AxisItem xAxis = new AxisItem(_chart, AxisNumber.X_Axis);
xAxis.Key = dayLabel;
xAxis.Labels.ItemFormat =
xAxis.Labels.ItemFormatString =
xAxis.Labels.Layout.Behavior =
AxisLabelLayoutBehaviors.None;
xAxis.Labels.Orientation =
TextOrientation.VerticalLeftFacing;
xAxis.Labels.OrientationAngle = 0;xAxis.Labels.VerticalAlign =
xAxis.LineThickness = 1;
xAxis.OrientationType =
AxisNumber.X_Axis;
xAxis.RangeType =
xAxis.TickmarkStyle =
AxisTickStyle.DataInterval;
xAxis.Visible =
if (i != 0)
xAxis.Margin.Near.Value = 50;
xAxis.Margin.Near.MarginType =
LocationType.Percentage;
}
else
xAxis.Margin.Far.Value = 50;xAxis.Margin.Far.MarginType =
area.Axes.Add(xAxis);
ChartLayerAppearance layer = new ChartLayerAppearance();
layer.ChartType =
ChartType.ScatterChart;
layer.AxisX = xAxis;
layer.AxisY = yAxis;
layer.ChartArea = area;
if (!_compositeChartLayers.ContainsKey(i.ToString()))
_compositeChartLayers.Add(i.ToString(), layer);
_chart.CompositeChart.ChartLayers.Add(layer);
Then, when I get the data, I populate like the following:
In the below, factorDataCollection is the collection of all data points, and from that, I created XYSeries for each day. (The main logic is to check which date it belongs to, and populate the right series.
for (int i = 0; i < _numberOfDays; i++)
XYSeries xySerie = new XYSeries();
_chartSeries.Add(i.ToString(), xySerie);
if (_factorDataCollection != null)
int count = _factorDataCollection.Count;
if (count > 0)
for (int i = 0; i < _factorDataCollection.Count; i++)
FactorDataPoints factorData = _factorDataCollection[i] as FactorDataPoints;
if (factorData != null && !string.IsNullOrEmpty(factorData.FactorName) && factorData.x.HasValue && factorData.y.HasValue)
if (_tradingPeriodsInUnix != null && _tradingPeriodsInUnix.Count > 0)
foreach (int key in _tradingPeriodsInUnix.Keys)
int startTime = _tradingPeriodsInUnix[key].Key;
int endTime = _tradingPeriodsInUnix[key].Value;
bool isFirstDay = key == 0;
if (isFirstDay)
if (factorData.x.Value > startTime && factorData.x < endTime)
_chartSeries[key.ToString()].Points.Add(
new XYDataPoint(factorData.x.Value, factorData.y.Value, factorData.FactorName, false
));
(factorData.x.Value > startTime && factorData.x < endTime)
foreach (var dayKey in _compositeChartLayers.Keys)
_chart.CompositeChart.Series.Add(_chartSeries[dayKey]);
_compositeChartLayers[dayKey].Series.Add(_chartSeries[dayKey]);
_chart.InvalidateLayers();
Only the series object itself needs to be created beforehand. The number of data points can change dynamically, either by adding new points to the points collection or rebinding the series.
It's hard to tell what's happening in the image from the code snippet. Can you provide a more complete snippet or a sample? I would have to see what the data looks like and how the chart is created.
First, This won't work as the chart need to plot both Historical and Real-Time data. Correct me if I am wrong, but from what I see, all composite charts need to have a definite series that are already created beforehand.
Secondly, I have tried for two days, but this is what I am getting (see picture).
Can you please tell me why they are all plotted in this weird horizonal lines than using the empty space that does not have y-value?
I am using XYSeries, and have used the following setting for 2 X-Axis.
day 0:
xAxis.Margin.Far.Value = 50;
xAxis.Margin.Far.MarginType =
day 1:
It's easier to use 2 chart layers in a single chart area and manipulate the axis location with the Margin property. Here's an example:
ultraChart1.ChartType = ChartType.Composite;ChartArea area = new ChartArea();ultraChart1.CompositeChart.ChartAreas.Add(area);
AxisItem xAxis1 = new AxisItem();xAxis1.OrientationType = AxisNumber.X_Axis;xAxis1.DataType = AxisDataType.String;xAxis1.Margin.Far.Value = 50;xAxis1.Margin.Far.MarginType = LocationType.Percentage;AxisItem xAxis2 = new AxisItem();xAxis2.OrientationType = AxisNumber.X_Axis;xAxis2.DataType = AxisDataType.String;xAxis2.Margin.Near.MarginType = LocationType.Percentage;xAxis2.Margin.Near.Value = 50;
AxisItem yAxis = new AxisItem();yAxis.OrientationType = AxisNumber.Y_Axis;area.Axes.Add(xAxis1);area.Axes.Add(xAxis2);area.Axes.Add(yAxis);
ChartLayerAppearance layer1 = new ChartLayerAppearance();layer1.ChartType = ChartType.ColumnChart;layer1.AxisX = xAxis1;layer1.AxisY = yAxis;layer1.ChartArea = area;ultraChart1.CompositeChart.ChartLayers.Add(layer1);
ChartLayerAppearance layer2 = new ChartLayerAppearance();layer2.ChartType = ChartType.ColumnChart;layer2.AxisX = xAxis2;layer2.AxisY = yAxis;layer2.ChartArea = area;ultraChart1.CompositeChart.ChartLayers.Add(layer2);
NumericSeries series = new NumericSeries();series.Points.Add(new NumericDataPoint(0, "", false));series.Points.Add(new NumericDataPoint(6, "", false));ultraChart1.CompositeChart.Series.Add(series);
layer1.Series.Add(series);layer2.Series.Add(series);