Как добавить процент в верхнюю часть диаграммы столбца в C # - PullRequest
0 голосов
/ 07 сентября 2018

Итак, вот проблема.

У меня есть диаграмма, которая отображает два столбца, Завершенные и Незавершенные, по ряду типов работ, используя следующий цикл:

foreach (var workType in model.WorkTypes)
        {
            decimal completed = 0;
            decimal uncompleted = 0;
            decimal workSubmitted = 0;
            decimal completionRate= 0;
            foreach (var rec in model.JobList.Where(x => x.jobType== workType.Id))
            {
                uncompleted += model.JobList.SingleOrDefault(x => x.recID== rec.recID && x.jobType == workType.Id).Uncompleted;
                completed += model.JobList.SingleOrDefault(x => x.recID == rec.recID && x.jobType == workType.Id).Completed;

            }
            workSubmitted = uncompleted + completed;

            if (uncompleted != 0)
            {
                completionRate= (completed/ workSubmitted) * 100;
            }                
            myChart.Series["Uncompleted"].Points.AddXY(workType.TypeName, uncompleted );
            myChart.Series["Completed"].Points.AddXY(workType.TypeName, completed);
        }

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

Буду признателен за любую помощь или совет.

Это текущий вид графика: enter image description here

1 Ответ

0 голосов
/ 07 сентября 2018

По умолчанию Labels показывает значение y, но вы можете установить произвольное значение Label для каждого DataPoint, например. когда вы добавляете точку, как это:

int p = myChart.Series["Uncompleted"].Points.AddXY(workType.TypeName, rejections);
myChart.Series["Uncompleted"].Points[p].Label = sometext;

И, конечно, вы можете при необходимости вычислить текст для метки, например ::10000

string sometext = (workSubmitted / rejections * 100).ToString("0.00") + "%";

Обратите внимание, что вы должны обновить Label после изменения значений в ваших расчетах. Автоматические выражения не поддерживаются!

Обновление

Как я уже писал, размещение Label по центру в значении x, которое разделяют столбцы, трудно или даже невозможно; это потому, что Label принадлежит отдельной точке данных. Это уникальная проблема с диаграммами типа столбцов (и столбцов), поскольку здесь точки ряда отображаются в скоплениях вокруг общего значения x. (Мы могли бы обойти это в том и только в том случае, если бы у нас было нечетное число серий, добавив метки к средним точкам)

Итак, нам нужно использовать Annotations. Вот функция, которая поместит TextAnnotation с центром в значение x и на высоту большего значения y двух точек данных ..:

void setCenterAnnotation(Chart chart, ChartArea ca, 
                         DataPoint dp1, DataPoint dp2, string lbl)
{
        TextAnnotation ta = new TextAnnotation();
        ta.Alignment = ContentAlignment.BottomCenter;
        ta.AnchorAlignment = ContentAlignment.TopCenter;
        DataPoint dp = dp1.YValues[0] > dp2.YValues[0] ? dp1 : dp2;
        ta.Height = 0.36f;
        ta.AxisX = ca.AxisX;
        ta.AxisY = ca.AxisY;
        ta.AnchorDataPoint = dp;
        ta.AnchorX = dp1.XValue;
        ta.Text =  lbl;
        chart.Annotations.Add(ta);
}

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

Размещение / привязка аннотаций на самом деле неочевидны, поэтому вот несколько замечаний:

  • I привязка к DataPoint, чтобы он отображался на высоте своего значения y.

  • Чтобы использовать (осевые) значения для привязки, необходимо присвоить ему одну или обе оси.

  • I , а затем (порядок имеет значение!) Установить свойство AnchorX, чтобы оно не центрировалось по точке, а по общему значению x.

  • Я также установил Height, иначе текст не будет перемещаться вверх по столбцу; не совсем уверен, какое здесь обоснование ..

Вот результат:

enter image description here

Я добавил аннотации при добавлении точек:

int ix = s1.Points.AddXY(i, rnd.Next(i+7));
s2.Points.AddXY(i, rnd.Next(i+4)+3);
double vmax = Math.Max(s1.Points[ix].YValues[0], s2.Points[ix].YValues[0]);
string lbl = (vmax / 123f).ToString("0.0") + "%";
setCenterAnnotation(chart12, ca, s1.Points[ix], s2.Points[ix], lbl );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...