По умолчанию 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
, иначе текст не будет перемещаться вверх по столбцу; не совсем уверен, какое здесь обоснование ..
Вот результат:

Я добавил аннотации при добавлении точек:
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 );