Вот пример:
стилизовать Chart
вы используете это:
// prepare:
chart1.Series.Clear();
Series S1 = chart1.Series.Add("S1");
ChartArea CA = chart1.ChartAreas[0];
// style type, font, color, axes
S1.ChartType = SeriesChartType.Bar;
CA.BackColor = Color.AliceBlue;
chart1.BackColor = CA.BackColor;
Font f = new Font("Consolas", 10f);
CA.AxisX.LabelStyle.Font = f;
S1.BackGradientStyle = GradientStyle.TopBottom;
CA.AxisX.MajorGrid.Enabled = false;
CA.AxisX.MajorTickMark.Enabled = false;
CA.AxisX.LineColor = Color.Transparent;
CA.AxisY.Enabled = AxisEnabled.False;
CA.AxisY.MajorGrid.Enabled = false;
CA.AxisY.MajorTickMark.Enabled = false;
Чтобы цвет индивидуальные DataPoints
вы должны установить их Color
:
S1.Points[0].Color = Color.YellowGreen;
S1.Points[1].Color = Color.YellowGreen;
Для создания formatted этикетки вы можете создать строки и использовать их как (псевдо) X-значения при добавлении точек:
string label = string.Format("{0,-11}{1, 7:0.0}%{2,8:##0.0}GB ",
t.Item1, t.Item2 * 100d/total, t.Item2) + "\u2001\u2001";
int idx = S1.Points.AddXY(label, t.Item2);
Здесь я использую Tuple<string, int>
держать мои данные. Вам нужно будет адаптировать это к источнику данных. Обратите внимание, как я рассчитываю процент от общего числа.
Вот полный код, который я использовал для моего примера данных:
List<Tuple<string, double>> data = new List<Tuple<string, double>>()
{
new Tuple<string, double>("0-1 months", 4),
new Tuple<string, double>("2-3 months", 14),
new Tuple<string, double>("4-11 months", 44),
new Tuple<string, double>("1-2 years", 23),
new Tuple<string, double>("3-5 years", 3),
new Tuple<string, double>("> 5 years", 100),
};
double total = data.Sum(x => x.Item2);
foreach (Tuple<string, double> t in data)
{
string label = string.Format("{0,-11}{1, 7:0.0}%{2,8:##0.0}GB",
t.Item1, t.Item2 * 100d/total, t.Item2) + "\u2001\u2001";
int i = S1.Points.AddXY(label, t.Item2);
S1.Points[i].Font = f;
}
Примечание:
- Чтобы получить внутреннее выравнивание строки вам нужно использовать шрифт в моноширинного как
Consolas
.
- Также обратите внимание: не может использовать разные шрифты или стили внутри одной этикетки.
- Я добавляю два m-space characters, чтобы создать расстояние между метками и площадью. (Нормальные пробелы не отображаются!).
Обновление:
Второй график показывает изображение SeriesChartType.Column
.Чтобы вставить новые строки, все, что вам нужно сделать, это вставить символ \n
и убедиться, что достаточно места.
Трудная часть имеет одну линию другого цвета. Это невозможно с помощью ярлыков.
Вместо этого вам нужно добавить два CustomLabels
за каждый набор данных: первый из них показывает, например, черные линии. Второй может иметь различный ForeColor
и должен иметь как можно больше \n
, так как первый имеет линии.
Обратите внимание, что CustomLabels
сидеть посередине между двумя позициями. Так что я теперь добавил DataPoints
с вещественными числами, начиная с 0, так как их рентгеновскими значений, а затем установите CustomLabels
на полпути между ..
chart1.Series.Clear();
Series S1 = chart1.Series.Add("S1");
S1.ChartType = SeriesChartType.Column;
ChartArea CA = chart1.ChartAreas[0];
chart1.Legends.Clear();
CA.BackColor = Color.AliceBlue;
chart1.BackColor = Color.AliceBlue;
Font f = new Font("Consolas", 9f);
CA.AxisX.LabelStyle.Font = f;
S1.BackGradientStyle = GradientStyle.LeftRight;
CA.AxisX.MajorGrid.Enabled = false;
CA.AxisX.MajorTickMark.Enabled = false;
CA.AxisX.LineColor = Color.Transparent;
CA.AxisY.Enabled = AxisEnabled.False;
CA.AxisY.MajorGrid.Enabled = false;
CA.AxisY.MajorTickMark.Enabled = false;
CA.Position.X = 0f;
List<Tuple<string, double>> data = new List<Tuple<string, double>>()
{
new Tuple<string, double>("0-1 months", 4),
new Tuple<string, double>("2-3 months", 14),
new Tuple<string, double>("4-11 months", 44),
new Tuple<string, double>("1-2 years", 23),
new Tuple<string, double>("3-5 years", 3),
new Tuple<string, double>("> 5 years", 100),
};
double total = data.Sum(x => x.Item2);
foreach (Tuple<string, double> t in data)
{
string label1 = string.Format("{0}\n{1:0.0}%", t.Item1, t.Item2 * 100d/total);
string label2 = string.Format("\n\n{0:##0.0}GB", t.Item2);
int i = S1.Points.AddXY(S1.Points.Count, t.Item2);
S1.Points[i].Font = f;
DataPoint dp = S1.Points[i];
int v = (int)dp.YValues[0];
CustomLabel cl = new CustomLabel();
cl.Text = label1;
cl.FromPosition = i - 0.5f;
cl.ToPosition = i + 0.5f;
CustomLabel cl2 = new CustomLabel();
cl2.Text = label2;
cl2.FromPosition = i -0.5f;
cl2.ToPosition = i + 0.5f;
cl2.ForeColor = Color.Green;
CA.AxisX.CustomLabels.Add(cl);
CA.AxisX.CustomLabels.Add(cl2);
}
S1.Points[0].Color = Color.YellowGreen;
S1.Points[1].Color = Color.YellowGreen;
Благодаря TaW. Это очень помогло мне ... – thejustv
Я добавил еще один снимок экрана, не могли бы вы помочь мне отформатировать этот ярлык. – thejustv
Я добавил несколько советов о том, как вы можете сделать что-то вроде второго изображения. – TaW