Search code examples
c#labelaxismschart

MSChart axis CustomLabel angle at RowIndex > 0


Using VisualStudio WindowsForms Form. Creating Chart control in designer.

I'm trying to add some customLabels on charts Axis along WITH the default labels. To do so I add customLabels with RowIndex property =1. Thus I see default labels AND my customLabels. Now the problem is that while the default labels are rotated correctly my custom labels are not.

The Axis property LabelStyle.Angle affects only labels that are in RowIndex = 0, i.e. default labels. And if I put customLabels at RowIndex=0 - all default labels will disappear.

What I see:

enter image description here

What I want to see:

enter image description here


Solution

  • I see no way to do that, really. The reason is probably that the developers decided there simply cannot be enough space for horizontal labels, once you start putting them in one or more extra rows..

    Here is a workaround: Make those CustomLabels all transparent and draw them as you like in a xxxPaint event.

    Here is an example:

    I prepared the CustomLabels :

    CustomLabel cl = new CustomLabel();
    cl.ForeColor = Color.Transparent;
    cl.RowIndex = 1;
    ...
    

    And I code the drawing like this:

    private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
    {
        Axis ay = chart1.ChartAreas[0].AxisY;
        foreach (var cl in ay.CustomLabels)
        {
            if (cl.RowIndex == 1)
            {
                double vy = (cl.ToPosition + cl.FromPosition) / 2d;
                int y = (int)ay.ValueToPixelPosition(vy);
                e.ChartGraphics.Graphics.DrawString(cl.Text, 
                             cl.Axis.TitleFont, Brushes.DarkRed, 0, y);
            }
        }
    }
    

    Do use a Font and Brush of your own liking. Here is the result:

    enter image description here

    Note that you may need to create more space to the left by tweaking the ChartArea.Position or the ChartArea.InnerPlotPosition, both of which are in 100% and, as usual, default to 'auto'.

    For even more rows you need to change the check to cl.RowIndex < 0 and find a nice x position value for the DrawString.