2015-08-08 3 views
1

Am создает форму окна приложения, которое использует chart.I хочет изменить диаграммуWindows, изменение формы диаграммы этикетки

  1. Как изменить область диаграммы Фоновой цвет (белый цвета в в скриншоте)
  2. Как применить различный цвет к каждому бару.
  3. Как форматировать оси метки Y (необходимо выровнять файл с расширением левого конца и целое значение в правой части)

Это мой текущий снимок экрана

enter image description here

нужно обновить мой экран, как этот

enter image description here

можно ли совместите метку как этот

enter image description here

ответ

2

Вот пример:

enter image description here

стилизовать 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 на полпути между ..

enter image description here

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; 
+0

Благодаря TaW. Это очень помогло мне ... – thejustv

+0

Я добавил еще один снимок экрана, не могли бы вы помочь мне отформатировать этот ярлык. – thejustv

+0

Я добавил несколько советов о том, как вы можете сделать что-то вроде второго изображения. – TaW

Смежные вопросы