【问题标题】:Windows form Chart label modificationWindows窗体图表标签修改
【发布时间】:2015-08-10 23:40:24
【问题描述】:

正在创建一个使用图表的窗体应用程序。我想修改图表

  1. 如何编辑图表区域背景颜色(屏幕截图中的白色)
  2. 如何为每个条形应用不同的颜色。
  3. 如何格式化Y轴标签(需要将文件扩展名对齐到左端,整数值对齐到右端)

这是我当前的屏幕截图

需要像这样更新我的屏幕

是否可以像这样对齐标签

【问题讨论】:

    标签: c# winforms windows-forms-designer


    【解决方案1】:

    这是一个例子:

    要设置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开始,作为它们的X值,然后将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;
    

    【讨论】:

    • 我又添加了一张屏幕截图,你能帮我把标签格式化成这样吗..
    • 我添加了一些提示,告诉您如何执行第二张图片之类的操作。
    • 感谢您的更新。请提供 customLabels 的示例代码
    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 2017-09-25
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多