2 분 소요

산점도에 대한 시각화 표현을 해본다.

적용데이타

통계 R에 내장된 데이타 iris 를 사용한다.

  • 3종의 붓꽃종류(Species) 데이터에서 50개 꽃에 대해 꽃받침길이(Sepal.Length), 꽃받침너비(Sepal.Length) , 꽃잎길이(Petal.Length), 꽃잎너비(Petal.Length) 측정치를 센치미터 단위로 제공된 데이터 임
> head(iris, 6)

산점도의 기본형 (plot 사용)

# plot(x=iris$Sepal.Length, y=iris$Petal.Width , ylab = "꽃잎너비", xlab = "꽃받침길이", main = "Sample 산점도") 
# 여기서 x,y의 변수로 정의 할 경우 아래의 data=iris는 사용하지 않는다.
# ylab : y축 제목, xlab : x축 제목, main : 그래프 제목, xlim,ylim : x,y축 범위, col:종류별 색깔  ( 생략가능 옵션 )
# ※ c("red", "blue", "green")[iris$Species] 종류별로 색깔 할당 표현식, 이런 문구는 [] 에 들어가는 변수는 factor 변수에만 적용된다. factor 가 아니면 as.factor()로 변환필요

> plot(formula = Petal.Width ~ Sepal.Length, data = iris, ylab = "꽃잎너비", xlab = "꽃받침길이", 
       main = "Sample 산점도", xlim = c(4, 6) , ylim = c(0, 1) 
       col = c("red", "blue", "green")[iris$Species]
       )

산점도에 smoothing line , Encircling, jittered , geom_count (ggplot 사용)

# ggplot + geom_point + geom_smooth 활용
# geom_point 종류별로 색깔 주려면, geom_point(aes(col=Species)) , point에 size 조정시: geom_point(aes(col=Species, size=0.01)) 
# geom_smooth : smothing 라인 추가, se 옵션 : T/F smothing 라인에 iterval 추가 옵션, 
# geom_encircle : ggalt 라이브러리 안에 있음 , 아래예는 setosa 만 선택하였음
# geom_jitter : 중복된 data는 하나 점으로 찍히는, 중첩된 것을 일부 랜덤평행이동 하여 여러점으로 보여 줌 , width = .5, size=1 평행이동 폭 0.5
# geom_count : 중복되는 점이 많을 수록 점의 크기를 크게 하는 것

> library(ggplot2)
> library(ggalt) 
> encir_dt = iris[ iris$Species=='setosa',]

> ggplot(iris, aes(x=Sepal.Length, y=Petal.Width)) +
  geom_point(aes(col=Species)) +
  geom_smooth(method="auto",se=F) +
  geom_encircle(aes(x=Sepal.Length, y=Petal.Width) , data=encir_dt , color="red" , size=2, expand = 0.09 ) +
  geom_jitter(width = .5, size=1) +   
  geom_count(show.legend=F ) +     
  xlim(c(4,6)) + 
  ylim(c(0,2)) +
  labs( subtitle = "꽃받침길이 Vs 꽃잎너비",  y="꽃잎너비", x="꽃받침길이", title = "Sample 산점도", caption = "Source : 붓꽃데이터")

Bubble Chart

범주별로 상관관계를 파악 하고, Bubble의 Size도 의미를 주는 것임

# ggplot + geom_point + geom_smooth 활용
> library(ggplot2)

> ggplot(iris, aes(x=Sepal.Length, y=Petal.Width)) +
  geom_jitter(aes(col=Species, size=Petal.Width)) +
  geom_smooth(aes(col=Species), method="lm", se=F)

산점도에서 양축에 분포그림 추가

# ggMarginal 활용, type 옵션은 "density", "histogram", "boxplot", "violin", "densigram"

> library(ggplot2)
> library(ggExtra)  # ggMarginal 이 들어있는 라이브러리

> g <- ggplot(iris, aes(x=Sepal.Length, y=Petal.Width)) +
       geom_point(aes(col=Species))
> ggMarginal(g, type = "histogram", fill="transparent")

상관도 Matrix 작성

# 기본형
> pairs(~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, main = "붓꽃데이타", 
         pch = 21, bg = c("red", "blue", "green")[iris$Species], data=iris , panel=panel.smooth )
# 기본형 + 위쪽은 상관계수, 대각선 히스토그램 추가

# ------------------------------------------ 함수 Definition -----------------------------
## R helo 참고
## put histograms on the diagonal
> panel.hist <- function(x, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(usr[1:2], 0, 1.5) )
  h <- hist(x, plot = FALSE)
  breaks <- h$breaks; nB <- length(breaks)
  y <- h$counts; y <- y/max(y)
  rect(breaks[-nB], 0, breaks[-1], y, col = "cyan", ...)
} 
## with size proportional to the correlations.
> panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    r <- abs(cor(x, y))
    txt <- format(c(r, 0.123456789), digits = digits)[1]
    txt <- paste0(prefix, txt)
    if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
    text(0.5, 0.5, txt, cex = cex.cor * r)
}
## regression lm
> panel.lm <- function (x, y, col=par("col"), bg=NA, pch=par("pch"),
                     cex=1, col.smooth="black", ...) {
    points(x, y, pch = pch, col = col, bg = bg, cex = cex)
    abline(stats::lm(y ~ x), col = col.smooth, ...)
}
# ------------------------------------------ 함수 Definition End -----------------------------

> pairs(~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, main = "붓꽃데이타",
      pch = 21, bg = c("red", "blue", "green")[iris$Species], data=iris , 
      upper.panel = panel.cor, diag.panel = panel.hist , lower.panel = panel.lm )

댓글남기기