이번 포스팅에서는 시장 점유율과 같이 구성비율을 시각화하는데 사용하는 (1) 원 그래프 (Pie Chart), (2) 하위 그룹을 포함한 도넛 그래프 (Donut Chart with Subgraphs) 그리는 방법을 소개하겠습니다. 


두 개 모두 matplotlib 의 pie() 함수를 사용합니다. 



  (1) 원 그래프 (Pie Chart)



# importing library and set figure size

import matplotlib.pyplot as plt

plt.rcParams['figure.figsize'] = [12, 8]

 



# information of groups

group_names = ['Group_A', 'Group_B', 'Group_C']

group_sizes = [95, 54, 25]

group_colors = ['yellowgreen', 'lightskyblue', 'lightcoral']

group_explodes = (0.1, 0, 0) # explode 1st slice

 



# Pie chart

plt.pie(group_sizes, 

        explode=group_explodes, 

        labels=group_names, 

        colors=group_colors, 

        autopct='%1.2f%%', # second decimal place

        shadow=True, 

        startangle=90,

        textprops={'fontsize': 14}) # text font size

plt.axis('equal') #  equal length of X and Y axis

plt.title('Pie Chart of Market Share', fontsize=20)

plt.show()




  (2) 하위 그룹을 포함한 도넛 그래프 (Donut Chart with Subgraphs)


상위 그룹 A, B, C가 있고, 각 상위 그룹에 딸린 하위 그룹으로 'A_1'~'A_4', 'B_1'~'B_3', 'C_1'~'C_2' 의 하위 그룹(subgroups)이 있는 경우 가운데가 뚫린 도넛 모양의 도넛 그래프로 표현해주면 효과적입니다. 


기본 원리는 간단합니다. matplotlib 으로 원 그래프를 그리되, radius 와 width 의 숫자를 적절히 조절하여 (a) 바깥쪽의 상위 그룹의 원 그래프를 반지름이 크고 폭은 작아서 가운데가 뚫린 도넛 그래프로 만들고, (b) 안쪽에는 하위 그룹의 원 그래프를 반지름이 상위 그룹의 것보다는 작고(즉, 상위 그룹 도넛 그래프의 폭 만큼을 빼줌) 폭은 상위 그룹과 같은 가운데가 뚫린 도넛 그래프를 만들여서, (a)와 (b)의 두개 도넛 그래프를 겹치게 그리는 것입니다. 



# importing library and set figure size

import matplotlib.pyplot as plt

plt.rcParams['figure.figsize'] = [12, 8]

 



 # info. of groups

group_names = ['Group_A', 'Group_B', 'Group_C']

group_sizes = [95, 54, 25]


# info. of subgroups

subgroup_names = ['A_1', 'A_2', 'A_3', 'A_4', 

                  'B_1', 'B_2', 'B_3', 

                  'C_1', 'C_2']

subgroup_sizes = [50, 30, 10, 5, 30, 20, 4, 20, 5]


# colors

a, b, c = [plt.cm.Reds, plt.cm.Greens, plt.cm.Blues]


# width

width_num = 0.4

 



# Outside Ring

fig, ax = plt.subplots()

ax.axis('equal')

pie_outside, _ = ax.pie(group_sizes, 

                        radius=1.3

                        labels=group_names, 

                        labeldistance=0.8,

                        colors=[a(0.6), b(0.6), c(0.6)])

plt.setp(pie_outside

         width=width_num

         edgecolor='white')


# Inside Ring

pie_inside, plt_labels, junk = \

    ax.pie(subgroup_sizes, 

           radius=(1.3 - width_num), 

           labels=subgroup_names, 

           labeldistance=0.75, 

           autopct='%1.1f%%', 

           colors=[a(0.5), a(0.4), a(0.3), a(0.2), 

                   b(0.5), b(0.4), b(0.3), 

                   c(0.5), c(0.4)])

plt.setp(pie_inside

         width=width_num

         edgecolor='white')

plt.title('Donut Plot with Subgroups', fontsize=20)

plt.show()

 



많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)



728x90
반응형
Posted by Rfriend
,

변수의 개수 및 데이터의 형태에 따라서 그래프, 시각화 방법이 달라지는데요,

 

지난번 포스팅에서는 연속형 데이터의 시각화 방법으로

 - 히스토그램(Histogram)
    : geom_histogram()

- 커널 밀도 곡선(Kernel Density Curve)
    : geom_density()

 - 박스 그래프(Box Plot)
    : geom_boxplot()

 - 바이올린 그래프(Violin Plot)
    : geom_violin()

에 대해서 알아보았습니다. 

 

 

이번 포스팅에서는 범주형 데이터의 시각화 방법으로서

 

 - 막대그림(Bar Chart): geom_bar()

 - 원그림(Pie Chart): geom_bar() + coord_polar()

 - 모자이크 그림(Mosaic Chart): vcd 패키지 mosaic()

 

에 대해서 소개해드리겠습니다.

 

 

[ 변수 개수 및 데이터 형태에 따른 그래프 ]

 

 

 

데이터는 MASS 패키지에 들어있는 Cars93 데이터 프레임의 차종(Type)과 제조국(Origin) 데이터를 활용해서 차종별 제조국별 도수를 구한 후에, 원그림을 그려보겠습니다.

 

원그림은 세로로 쌓아올린(stacked) 막대그림을 먼저 geom_bar()로 먼저 그린 후에 ==> coord_polar("y")로 해서 표현 형식을 원형(polar coordinates)으로 바꾸어주는 절차를 따릅니다.

 

(1) 바로 아래에 있는 그래프가 쌓아올린 막대그림 (stacked bar chart) 이구요,

 

> ## 원그림(Pie Chart)
> library(ggplot2)
> library(MASS)
> 
> # 막대그림 먼저 그린 후 => 원그림
> library(sqldf)
> Car_Type_Origin_cnt <- sqldf( 'select Type, Origin, count(*) as Type_Origin_cnt
+                               from Cars93
+                               group by Type, Origin
+                               order by Type, Origin
+                               ')
> 
> Car_Type_Origin_cnt
      Type  Origin Type_Origin_cnt
1  Compact     USA               7
2  Compact non-USA               9
3    Large     USA              11
4  Midsize     USA              10
5  Midsize non-USA              12
6    Small     USA               7
7    Small non-USA              14
8   Sporty     USA               8
9   Sporty non-USA               6
10     Van     USA               5
11     Van non-USA               4
> 
> sapply(Car_Type_Origin_cnt, class)
           Type          Origin Type_Origin_cnt 
       "factor"        "factor"       "integer" 
> 
> 
> ggplot(data=Car_Type_Origin_cnt, aes(x="", y=Type_Origin_cnt, fill=Type)) +
+   facet_grid(facets=. ~ Origin) + 
+   geom_bar(stat="identity", width=1) + 
+   ggtitle("Bar Chart of Frequency by Car Type & Origin")

 

 

 

 

 

(2) 그 다음 표현형식을 coord_polar("y") 를 써서 원형으로 바꾸어 본 것이 아래 script 가 되겠습니다.

 

> 
> # 원그림(Pie Chart) : geom_bar() + coord_ploar(theta="y")
> ggplot(data=Car_Type_Origin_cnt, aes(x="", y=Type_Origin_cnt, fill=Type)) +
+   facet_grid(facets=. ~ Origin) + 
+   geom_bar(stat="identity", width=1) + 
+   coord_polar(theta="y") + 
+   ggtitle("Pie Chart of Car Type by Origin, theta=y")

 

 

 

 

 

 

이번 포스팅에서 원그림(Pie Chart)를 소개하기는 했습니다만, 저는 원그림은 그다지 추천하지 않습니다.  일단 눈으로 보고 해석하기에, 범주간 비교하기에 그다지 용이하지가 않습니다.  파이 조각의 면적을 눈으로 가늠해서 비교하기가 쉽지 않거든요.  막대그림으로 높이를 비교하는 것이 범주 간 차이를 단박에 보여주는 것과 비교하면 원그림은 그래프를 봐야하는 이에게는 불친절한 그래프입니다.

(단, 두 집단(가령 USA, non-USA) 간에 과반을 넘는 특정 segment를 비교해서 강조하고 싶은 경우는 원그림이 효과적일 수 있음)

 

신문이나 잡지에서 보면 원그림을 많이 사용하고 있고, 더 나아가서는 입체 원그림을 그리고, 또 나아가서는 입체 원그림의 한 조각을 확대하거나 원그림을 살짝 눕히기도 하는데요, 이건 정말 최악 중의 최악입니다.  일단, 시각적으로 해석하기에 어렵구요, 더 나아가서는 악의를 가지고 시각의 불완전성을 이용해서 정보를 왜곡/오도하기 위한 것일 수도 있으니 주의가 필요합니다

 

웬만하면 원그림은 사용하지 말기를 권하며, 누가 원그림 사용하거든 그만 사용하라고 권해주기를 권합니다.  그냥 쉽고 편한 막대그림 사용하세요.

 

참고용으로, 막대그림으로 나타내면 아래와 같은데요, 위의 원그림과 비교해보시기 바랍니다.  뭐가 더 쉽고 해석하기 편한지요.

 

> # 막대그림
> ggplot(data=Car_Type_Origin_cnt, aes(x=Type, y=Type_Origin_cnt)) +
+   facet_grid(facets=. ~ Origin) + 
+   geom_bar(stat="identity", width=1, fill="white", colour="black") + 
+   ggtitle("Bar Chart of Frequency by Car Type & Origin")

 

 

 

 

원그림 소개한다고 해놓고는, 막대그림으로 끝을 맺네요. ^^'

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

 

728x90
반응형
Posted by Rfriend
,