R

ggplot2를 이용한 시각화 ① (두변수가연속형인경우, 그룹별 표시하기)

한번해보즈아 2021. 4. 5. 16:27

 

이번시간에는 MASS 패키지에 있는 Cars93데이터를 이용하여 시각화를 해보도록 하겠습니다. Cars93데이터는 column이 27개나 있으므로 1열부터8열까지 짤라서 보기로 하겠습니다.

 

> library(ggplot2)
> library(MASS)

> df <- Cars93[,1:8]
> head(df)
  Manufacturer   Model    Type Min.Price Price Max.Price MPG.city MPG.highway
1        Acura Integra   Small      12.9  15.9      18.8       25          31
2        Acura  Legend Midsize      29.2  33.9      38.7       18          25
3         Audi      90 Compact      25.9  29.1      32.3       20          26
4         Audi     100 Midsize      30.8  37.7      44.6       19          26
5          BMW    535i Midsize      23.7  30.0      36.2       22          30
6        Buick Century Midsize      14.2  15.7      17.3       22          31


> str(df)
'data.frame':	93 obs. of  8 variables:
 $ Manufacturer: Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model       : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type        : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...

 

 

여기서는 두변수가 연속형인 경우 Min.Price와 Max.Price를 이용하여 그래프를 그려보도록 하겠습니다.

주로 사용하는 그래프는 다음과같습니다.

 

산점도 / 산포도 geom_point( )

선 그래프 geom_line( )

박스플롯 geom_boxplot( )

히스토그램 geom_histogram( )

막대 그래프 geom_bar( )



> ## 두변수다 연속형인 경우
> ggplot(data=df,
+        mapping=aes(x=Min.Price,
+                    y=Max.Price))+geom_point(colour="blue",
+                                             size=2,
+                                             pch=3)+
+   ggtitle("scatter")

 

 

 

> ggplot(data=df,
+        mapping=aes(x=Min.Price,
+                    y=Max.Price))+geom_line()+
+   ggtitle("LINE")

 

 

 

그룹별로 색상,모양,크기 다르게하기

Type은 6가지 종류가 있고 각각 size(크기), pch(모양), colour(색상)을 다르게 해서 그래프로 표현한다. 

> # colour는 색상, pch는 모양 ,#size는 크기 // colours는 뭘까 ??
> table(df$Type)

Compact   Large Midsize   Small  Sporty     Van 
     16      11      22      21      14       9 
> ggplot(data=df,
+        mapping=aes(x=Min.Price,
+                    y=Max.Price))+geom_point(colour=c("red","blue","pink","green","yellow","black")[df$Type],
+                                             pch=c(3,5,7,10,13,15)[df$Type],
+                                             size=c(1,2,3,4,5,6)[df$Type])+
+   ggtitle("scatter")

 

데이터가 겹치는 부분 표시하기(Compact,Large,Midsize겹치는 부분 색상으로는red,blue,pink)

 

> g <- ggplot(data=df,
+        mapping=aes(x=Min.Price,
+                    y=Max.Price))+geom_point(colour=c("red","blue","pink","green","yellow","black")[df$Type],
+                                             size=2)


> #type별로 최소값,최댓값구하기기
> df_range <- df %>% group_by(Type) %>% 
+   summarise(min_x=min(Min.Price),
+             max_x=max(Min.Price),
+             min_y=min(Max.Price),
+             max_y=max(Max.Price))

> df_range
# A tibble: 6 x 5
  Type    min_x max_x min_y max_y
* <fct>   <dbl> <dbl> <dbl> <dbl>
1 Compact   8.5  29    11.4  37.1
2 Large    17.5  34.4  18.4  37.8
3 Midsize  12.4  45.4  14.9  80  
4 Small     6.7  12.9   7.9  18.8
5 Sporty    9.1  34.6  11    41.5
6 Van      13.6  19.5  18    26.6

#compact,large, midsize의 최소,최댓값만 추출
df_range <- df_range[1:3,]
start_x <- max(df_range$min_x)
end_x <- min(df_range$max_x)
start_y <- max(df_range$min_y)
end_y <- min(df_range$max_y)

g+ annotate(geom="rect",    #annotate = 주석을 달다.
            xmin=start_x,
            xmax=end_x,
            ymin=start_y,
            ymax=end_y,
            fill="red",
            alpha=0.3,  # 알파는 투명도
            colour="black",
            lty=2)

데이터 겹치는 부분 표시

 

 

> #선으로 구분하기
> g+annotate(geom="segment",
+            x=c(start_x,end_x,-Inf,-Inf),
+            xend= c(start_x,end_x,Inf,Inf),
+            y=c(-Inf,-Inf,end_y,start_y),
+            yend=c(Inf,Inf,end_y,start_y),
+            colour="black",
+            alpha=0.3,
+            lty=2,
+            size=1)

 

 

 

> #행번호 표시하기
> g+annotate(geom="text",
+            x=df$Min.Price,
+            y=df$Max.Price,
+            label=rownames(df),
+            colour="black",
+            alpha=0.5,
+            size=3,
+            hjust=0.5,  #숫자 위치를 x축으로 옮길수있음
+            vjust=-1)   #숫자 위치를 y축으로 옮길수있음

 

 

 g+coord_flip()  #x축 y축 바꾸기

 

 

 

 

g+coord_cartesian(xlim=c(20,30),
                  ylim=c(20,40)) #x,y축 범위 제한하기

 

 

 

> #글 지정해서 넣기기
> g+labs(title="Cars93 scatter",
+        subtitle="sub title",
+        caption="jinuk",
+        x="최소가격",
+        y="최대가격")