"How to rotate the data labels on a pie or doughnut chart

to make them face the center of the cirle"

 

원형이나 도너츠형 차트의 데이터 라벨은 기본적으로 가로방향입니다.

이 가로 방향을 VBA를 이용해서 원의 중심을 향하도록 자동으로 회전시키는 방법입니다.

 

아래와 같이 데이터라벨의 Orientation을 원의 중심을 향해 회전시키는 것이 목적입니다.

style 1

 

텍스트가 원의 중심을 바라보게 만들면 데이터 라벨이 어느 차트 항목이나 계열에 속하는지 구별이 잘 되는 장점이 있습니다. 보는 사람의 시선이 차트의 중심에서 바깥으로 퍼져나가도록 만들기도 합니다.

style 2

문제는 여기서 데이터라벨의 회전 각도를 계산하는 것이 핵심입니다.

 

아래 그림에서 데이터라벨의 가운데 좌표(x, y)와 원의 중심 좌표(rx,ry)를 연결하는 선과

세로(rx, y - rx, ry) 선의 각도 A를 계산해야 합니다.

 

여기서는 각A 의 Tangent 값이 높이 (y-ry) / 밑변 (rx-x) 이므로

우리가 알고 있는(y-ry) / (rx-x) 를 이용해서 역으로 Arc Tangent 값을 구하면

각도A가 Radian 값으로 나오게 됩니다.

 

결국 ( A )Radian = Atn( ( y - ry ) / ( rx - x )  ) 가 되고

이 값에 57.2958을 곱하여 실제 Angle 값으로 변환하면 됩니다.

 

 

이제 차트의 모든 계열/항목에 대해 순환하면서

모든 데이터레이블에 대해 위 공식을 적용해서

Orientation값을 적용해주면 데이터라벨들이 원의 중심을 향하게 되겠습니다.

 

 

추가로  Atn((rx - x) / (ry - y)) 를 이용하면 원의 중심을 향해서 직각으로 회전한 데이터라벨로 만들 수 있습니다.

Orientation 값은 90도를 넘을 수 없어서 궁여지책으로 계산했습니다.

 

 

실제 구현한 전체 코드는 아래와 같습니다.

Sub RotateChartLabels_Garo()

    '가로 방향 & 원의 중심 직각방향 회전
    Call RotateDataLabels(1)
    
End Sub

Sub RotateChartLabels_Sero()

    '데이터라벨 중심 방향 회전
    Call RotateDataLabels(2)
    
End Sub

Sub ResetChartLabels()
    
    '데이터라벨 원래대로(가로로)
    Call RotateDataLabels(0)
    
End Sub

Function RotateDataLabels(Garo As Integer)

    Dim shp As Shape
    Dim srs As Series, pt As Point
    Dim s%, p%, rx!, ry!, x!, y!
    
    On Error Resume Next
    Set shp = ActiveWindow.Selection.ShapeRange(1)
    On Error GoTo 0
    If shp Is Nothing Then MsgBox "차트 도형을 선택하세요.": Exit Function
    
    If Not shp.HasChart Then MsgBox "차트를 선택하세요.": Exit Function
    
    s = shp.Chart.ChartType
    If s <> xlPie And s <> xl3DPie And s <> xlDoughnut And s <> xlPieOfPie And _
        s <> xlPieExploded And s <> xl3DPieExploded And s <> xlDoughnutExploded Then _
            MsgBox "Pie또는 Doughnut 등 원형차트여야 합니다.": Exit Function
    
    '차트 중심
    With shp.Chart.PlotArea
        rx = .Left + .Width / 2
        ry = .Top + .Height / 2
    End With
    
    '그래프영역 순환
    For s = 1 To shp.Chart.FullSeriesCollection.Count
    
        Set srs = shp.Chart.FullSeriesCollection(s)
        '데이터 포인트
        For p = 1 To srs.Points.Count
            Set pt = srs.Points(p)
            '데이터 라벨
            If pt.HasDataLabel Then
                With pt.DataLabel
                    x = .Left + .Width / 2
                    y = .Top + .Height / 2
                    '1도= 0.0174533 rad / 1 rad = 57.2958도
                    If Garo = 1 Then
                        '.Orientation = Atn((y - ry) / (rx - x)) * 57.2958 + 90
                        .Orientation = Atn((rx - x) / (ry - y)) * 57.2958
                    ElseIf Garo = 2 Then
                        .Orientation = Atn((y - ry) / (rx - x)) * 57.2958
                    ElseIf Garo = 0 Then
                        .Orientation = -4128
                    End If
                    'Debug.Print rx, ry, x, y, .Text, .Orientation
                    
                End With
            End If
        Next p
    
    Next s
    
End Function

 

RotateChartLabels_Sero 는 데이터라벨을 원의 중심을 향해 회전시키고

RotateChartLabels_Garo 는 데이터라벨을 원의 중심을 직각으로 향해 회전시키며

ResetChartLabels 는 데이터라벨을 원래대로 가로로 복구합니다.

 

테스트 파일 첨부합니다. 매크로 허용해서 열어야 합니다.

차트를 선택하고 Alt-F8누르고 매크로를 실행하면 됩니다.

파이차트, 도넛차트 등 원형 차트에만 적용이 됩니다.

 

RotatePieChartLabel1.pptm
0.14MB

 

참고: 사실 VBA를 이용하지 않아도

엑셀 2016부터 지원하는 '선버스트' 형태 차트를 이용하면

자동으로 데이터 라벨 텍스트가 원의 중심을 향해 회전합니다.

위 코드는 하위 버전에서 데이터레이블을 회전시키거나

선버스트 이외에 파이나 도넛차트인 경우 데이터레이블이 길어서 회전시키기 싶을 때

이용하면 효과적이겠습니다.