Как выровнять индексированные серии на диаграмме

При настройке Series для индексирования путем установки _ 2_ до true диаграмма требует, чтобы все Series были выровнены:

Если вы отображаете несколько серий и хотя бы одна серия использует индексированные значения X, тогда все серии должны быть выровнены, то есть иметь одинаковое количество точек данных, а соответствующие точки должны иметь одинаковые значения X.

Как вы можете добавить необходимые Emtpy DataPoints в слоты, в которых они отсутствуют, в любом из Series?


person TaW    schedule 29.07.2016    source источник


Ответы (1)


Эта процедура сначала собирает все значения во всех Series в коллекции doubles.

Затем он перебирает все Series и все значения и вставляет отсутствующий пустой DataPoints:

void AlignSeries(Chart chart)
{
    var allValues = chart.Series.SelectMany(s => s.Points)
                          .Select(x=>x.XValue).Distinct().ToList();
    foreach (Series series in chart.Series)
    {
        int px = 0;    //insertion index
        foreach(double d in allValues )
        {
            var p = series.Points.FirstOrDefault(x=> x.XValue == d);
            if (p == null)  // this value is missing
            {
                DataPoint dp = new DataPoint(d, double.NaN);
                dp.IsEmpty = true;
                series.Points.Insert(px, dp);
            }
            px++;
        }
    }
}

Обратите внимание, что код предполагает ..

  • что ваши значения x установлены правильно, т.е. они были добавлены как numbers или DateTimes. Если вы добавили их как strings, все они будут 0, и индексация не имеет смысла.

  • что DataPoints были добавлены в возрастающем порядке. Это не всегда так, особенно при построении LineCharts. Однако индексация этого тоже не имеет смысла.

Также обратите внимание, что вы можете установить несколько вариантов обработки Empty DataPoints в Series, задав свойства в _ 14_, производный от _ 15_.

Итак, вы можете установить их Color следующим образом:

 someSeries.EmptyPointStyle.Color = Color.Red;
person TaW    schedule 29.07.2016