카테고리 보관물: 데이터시각화 Data Visualization

DiagrammeR – R 다이어그램 그리기

R 패키지중에 DiagrammeR라는 다이어그램(diagram)을 그릴 수 있게 해주는 것이 있습니다. 다이어그램은 플로우차트(flow chart), 간트 차트(gantt chart), 시퀀스 다이어그램 (sequence diagram)같은 것입니다.

RStudioDiagrammeR 스크린샷

다이어그램을 그릴 때 쓰는 도구는 Visio (Windows 쓰시는 분들) 아니면 OmniGraffle (Mac 쓰시는 분들) 아니면 PowerPoint 와 같이 손으로 그리는 것들이 있고 GraphViz 또는 Mermaid와 같이 정해진 문법을 텍스트로 입력하면 해석해서 시각적으로 표현해주는 도구가 있습니다.

DiagrammeRGraphVizMermaid를 묶어서 연동해 놓은 패키지인데 3가지 방식으로 그래프를 그리게 해줍니다.

  1. Mermaid 문법을 텍스트로 입력한 후 텍스트를 해석해서 렌더링
  2. GraphViz 문법을 텍스트로 입력한 후 텍스트를 해석해서 렌더링
  3. R함수를 사용해서 노드와 엣지를 구성하고 렌더링

패키지를 사용하던 중 GraphViz는 원래 C로 만들어진 binary이므로 R에서 연동해서 사용할 수 있습니다만 Mermaid는 Javascript로 만들어져서 이 두가지를 어떻게 한꺼번에 연동해서 그래프를 시각적으로 표현하게 했는지 갑자기 궁금했습니다.
그래서 살펴봤더니 GraphViz.js와 Mermaid.js를 가져다 연동한 것이고 렌더링된 결과를 표현할 때는 htmlwidgets 패키지를 사용하는 것입니다.
그러니까 결국 웹브라우저를 열고 Javascript를 이용해서 렌더링하는 방식입니다.

그래서 R-GUI에서 렌더링을 하게 되면 웹브라우저가 열립니다.  RStudio에서 렌더링을 시도하면 연동이 되어서 웹브라우저가 실행되지 않고 그래프 패널에 바로 렌더링된 결과를 표현해 줍니다.  위에 넣어 놓은 스크린샷 이미지에서 확인할 수 있습니다.

앞서 말한 렌더링을 하는 세가지 방식중에 Mermaid 문법을 사용하는 것과 GraphViz 문법을 사용하는 것은  RStudio에 연동되어서 파일을 편집할 수 있게 제공하고 있기때문에 R 코드에서 DiamgrammeR 패키지를 로딩할 일이 없게 만들기도 합니다.

RStudioDiagrammeR를 연동해서 .mmd 확장자를 가지는 Mermaid 파일과 .dot 확장자를 가지는 Graphviz dot 파일을 바로 편집하고 코드 하일라이트도 되고 렌더링할 수 있도록 해줍니다.
아래의 링크에서 내용을 확인할 수 있습니다.

https://blog.rstudio.com/2015/05/01/rstudio-v0-99-preview-graphviz-and-diagrammer/

위의 3가지 방식 중 2가지는 앞서 말씀드린 것 처럼 RStudio와 연동으로 인해 DiagrammeR 패키지의 함수를 사용할 일이 없게 만들지만  DiagrammeR 함수를 이용한 방식의 렌더링을 사용하면 data.frame에 있는 데이터를 연동해서 그래프를 그릴 수 있습니다. 이게 가장 큰 장점이지요.

아래는 각각의 방법으로 만든 간단한 장난감 예제입니다. 

Mermaid 문법을 이용한 렌더링

Mermaid 문법을 이용한 예제입니다.

GraphViz 문법을 이용한 렌더링

GraphViz 문법을 이용한 예제입니다.

GrammerR의 R 함수를 이용한 렌더링

전통적인 스타일의 R 함수를 사용한 예제입니다. 아래의 함수들은 DiagrammeR 최신 패키지를 설치해야만 됩니다. 최근에 함수 이름에 변화가 있었던 모양입니다.

dplyr와 연동한 DiagrammeR

역시 RStudio에서 만은 부분을 기여한 패키지인 만큼 dplyr 스타일의 매우 스타일리쉬한 파이프라인 형태의 코딩도 지원합니다.

추가로 네트워크 분석 관련 패키지인 igraph에서 생성한 객체를 DiagrammeR 형태로 변환하는 함수들도 제공합니다.  사용해 보지는 않았습니다. ^^;

colorbrewer2.org 소개

R의 ggplot2 패키지에 보면 scale_color_brewer() 라는 함수가 있습니다. 이 함수는 colorbrewer2.org 사이트에서 제공하는 색상 팔레트를 플롯에 적용해 주는 것인데요. 이것과 관련된 함수로는 scales라는 패키지의 show_col과 brewer_col() 이 있습니다. 이 함수들은 colorbrewer2.org 사이트의 컬러 팔레트를 확인할 수 있게 해줍니다.

이렇게요

코드

R 플롯 출력 결과 show_col로 찍은 color값

colorbrewer2.org 사이트가 R의 예제 코드를 보다 보면 흔치 않게 나오는 사이트이기 때문에 소개해 드립니다. 요렇게 생긴 사이트입니다.

colorbrewer2.org 사이트

원래 카로트그래피(Cartography) 그러니까 지도와 관련 데이터 시각화를 위한 색상을 제공하는 곳인데요.
색상이 잘 정리되어 있어서 일반적인 데이터 시각화를 하는데 색상을 선택하기 위해서도 많이 애용하는 사이트입니다.

심심할 때 들러보세요. ^-^

R ggplot2 – 경제인구동향 그래프 찍기

R에서 ggplot2경제활동인구찍기를 해봤습니다.
사실은 다른 것을 플로팅해보려다가 원하는 자료를 다운로드 받는 것이 만만치 않아서
대충 지나가다가 통계청 데이터중에 처음 보는 것을 가지고 찍어본 것입니다.
우선은 데이터를 가져와야 합니다. 통계청에 가시면 여러가지 통계데이터를 제공하고 있습니다.
아래 사이트에 가서 경제활동인구동향데이터를 긁어 옵니다.
http://kosis.kr/feature/feature_0103List.jsp?mode=getList&menuId=03&NUM=180

CSV로 다운로드 받아서 해도 되겠지만 데이터가 크지 않으므로 그냥 소스코드에 집어넣기 위해서 copy&paste를 해버립니다.
사이트에서 바로 복사하면 컬럼간의 구분이 Tab으로 되어 있을텐데요.
편집기에서 제가 Tab문자를 쓰지 않아서 Tab을 모두 세미콜론(;)으로 바꿨습니다. 그리고 header를 month와 population으로 해서 column 이름을 아예 데이터에서 지정해버렸습니다.

코드는 아래와 같습니다.
economic_activity_population <- "month;population
2009.09;24,630
2009.10;24,655
2009.11;24,625
2009.12;24,063
2010.01;24,082
2010.02;24,035
2010.03;24,382
2010.04;24,858
2010.05;25,099
2010.06;25,158
2010.07;25,232
2010.08;24,836
2010.09;24,911
2010.10;25,004
2010.11;24,847
2010.12;24,538
2011.01;24,114
2011.02;24,431
2011.03;24,918
2011.04;25,240
2011.05;25,480
2011.06;25,592
2011.07;25,473
2011.08;25,257
2011.09;25,076
2011.10;25,409
2011.11;25,318
2011.12;24,880
2012.01;24,585
2012.02;24,825
2012.03;25,210
2012.04;25,653
2012.05;25,939
2012.06;25,939
2012.07;25,901
2012.08;25,623"

자 이제 data.frame으로 로딩합니다.

statdata <- read.table(file=textConnection(econonic_activity_population), header = TRUE, sep = ";", quote = ""'", as.is=TRUE,colClasses=c("character", "character"))

그리고 나서
statdata$month 컬럼을 Date형식으로 바꿔줍니다. 그러지 않으면 나중에 곤란해집니다. 궁금하시면 직접해 보시구요.
년도와 날짜로만 되어 있는 문자열을 날짜형으로 바꾸기 위해서 강제로 01을 붙여서 그달의 첫째날로 바꿔버립니다.
그리고 바꿀때 타임존(tz)을 서울(Asia/Seoul)로 해줍니다. 안해주면 가끔 날짜가 UTC로 바뀌는 경우가 있습니다.


statdata$month <- as.Date(paste(statdata$month, ".01", sep=""), "%Y.%m.%d", tz="Asia/Seoul")

그리고 statdata$population을 숫자형으로 바꿔줍니다. 그런데 숫자데이터에 콤머가 있으므로 콤머를 다 제거해주고 숫자형으로 바꿉니다.

코드는 아래와 같습니다.

statdata$population <- as.numeric(gsub(",", "", statdata$population))

자 이제 플로팅을 해보죠. ggplot2를 로딩한 다음에 바로 찍습니다. ggplot2를 설치하지 않으셨으면 먼저 설치하셔야 합니다.

install.packages("ggplot2") # 설치를 안했으면 먼저 설치부터...

library(ggplot2) # 로딩
ggplot(statdata, aes(x=month, y=population)) + geom_line()

플로팅한 그림은 아래와 같습니다.

나왔네요. 그런데 회색배경에 검은선이라 이쁘지 않네요.
선에 색을 넣어 봅니다.

ggplot(statdata, aes(x=month, y=population)) + geom_line(colour="blue")

조금 낫긴하지만 역시 허전합니다.
아래가 비어서 그런것 같으니 선을 그리지 말고 채우기를 이용해서 그려보죠.
사실 이런류의 데이터는 색을 채우지 않고 선으로 보는 것이 데이터를 보기에는 더 좋습니다만 누군가에게 던져 줄때는 예쁘게 출력하는 것도 중요합니다.
본인이 보는 그래프는 선으로 된 것이면 충분하지만 누군가에게 보여주는 그래프는 알록달록해야 합니다.


gplot(statdata, aes(x=month, y=population)) + geom_area()

찍었습니다. 그런데 어라? 그래프의 모양이 바뀐것 같습니다. 자세히 보니 Y축이 영역(range)가 바뀐것 같은데 그것 때문에 밋밋해진 것이군요.
geom_area는 기본적으로 Y축의 0값부터 채워 넣기 때문에 geom_line과는 다르게 반응합니다.
그래서 Y축의 레인지를 강제로 고쳐줘야 합니다. 밑부분의 넙다란 부분을 잘라서 없애버리는 것입니다.


ggplot(statdata, aes(x=month, y=population)) + geom_area() + coord_cartesian(ylim = c(23500, 26500))

그럴듯하게 나오네요. 그런데 여전히 색이 단조롭네요.
테두리의 선색과 채울때 쓴 색을 다르게 줘서 입체감을 조금 살려보죠. 조금 옅은 회색과 조금 진한 회색을 써보겠습니다.


ggplot(statdata, aes(x=month, y=population)) + geom_area(colour="gray10", fill="gray50") + coord_cartesian(ylim = c(23500, 26500))

조금 괜찮아졌습니다만 역시 흑백보다는 칼라를 넣는 것이 좋을 것 같네요.
삷이 우울해질것만 같습니다.
제가 좋아하는 보라색을 넣어봅니다.

ggplot(statdata, aes(x=month, y=population)) + geom_area(colour="gray10", fill="gray50") + coord_cartesian(ylim = c(23500, 26500))

유후~ 괜찮아졌네요.
자. 이제 대충 색은 되었고 나머지를 조금 더 손을 봐보죠.
Y축의 값은 단위를 천명으로 한 숫자입니다. 통계청 데이터의 설명에 그렇게 나와 있습니다.
원래 숫자대로 바꿔보죠. 값에 곱하기 1000을 해서 원래 숫자로 바꿉니다.
귀찮으니 이쯤에서 처음부터 데이터를 다시 로딩해서 바꿔버립니다. 기존 데이터에 그냥해도 무방합니다.

statdata <- read.table(file=textConnection(econonic_activity_population), header = TRUE, sep = ";", quote = ""'", as.is=TRUE,colClasses=c("character", "character"))

statdata$month <- as.Date(paste(statdata$month, ".01", sep=""), "%Y.%m.%d", tz="Asia/Seoul")
statdata$population <- as.numeric(gsub(",", "", statdata$population)) * 1000

네 바꿨습니다. Y축 레인지를 조절하는 값도 1000을 곱해서 바꿔줘야 하는것을 기억하시구요.
이제 Y축의 레이블값의 숫자들에게 콤머를 찍어줍니다. 콤머를 찍으려면 scales 패키지를 로딩해야 합니다.

library(scales)
ggplot(statdata, aes(x=month, y=population)) + geom_area(colour="#5c0ab9", fill="#8a4fcd") + coord_cartesian(ylim = c(23500000, 26500000)) + scale_y_continuous(labels=comma)

이제 X축의 레이블들을 수정해봅니다. 2011-01 처럼 되어 있는 것을 2011년 011월 이렇게 바꿔줄 것입니다.
한글 폰트를 지정해 주시는 것을 잊지 말아야 합니다.. 저는 맥을 사용하므로 애플산돌고딕네오를 적었습니다만 Windows 사용자라면 “맑은 고딕”같은 것을 사용해주세요. 폰트를 정확히 지정하지 않으면 한글이 출력되지 않습니다.


ggplot(statdata, aes(x=month, y=population)) + geom_area(colour="#5c0ab9", fill="#8a4fcd") + coord_cartesian(ylim = c(23500000, 26500000)) + scale_y_continuous(labels=comma) + scale_x_date(labels = date_format("%Y년 %m월")) + theme(axis.text.x = element_text(family="Apple SD Gothic Neo"))

자! 되었습니다.
이제 마지막으로 X축과 Y축의 타이틀을 한글로 바꿔줍니다.
month와  population을 년/월과 경제활동인구라는 말로 바꿔줄 것입니다.
그러면서 코드를 좀 깔끔하게 정리해 보죠. 한줄에 너무 덕지덕지 다 붙여 놓으면 나중에 찾아서 고치기가 어렵습니다.


ggp <- ggplot(statdata, aes(x=month, y=population))
ggp <- ggp + geom_area(colour="#5c0ab9", fill="#8a4fcd")
ggp <- ggp + coord_cartesian(ylim = c(23500000, 26500000))
ggp <- ggp + scale_y_continuous(labels=comma)
ggp <- ggp + scale_x_date(labels = date_format("%Y년 %m월"))
ggp <- ggp + xlab("년도/월") + ylab("경제활동인구")
theme.title <- element_text(family="Apple SD Gothic Neo", face="bold", size=12, angle=00, hjust=0.54, vjust=0.5)
theme.text <- element_text(family="Apple SD Gothic Neo", size=10)
ggp <- ggp + theme(axis.title.x = theme.title, axis.title.y = theme.title, axis.text.x = theme.text)
ggp
rm(theme.title)
rm(theme.text)
gc()

드디어 완성입니다.
아주 이쁘지는 않지만 그럭저럭 보여줄만한 수준이 되는 것 같습니다.

다음 포스트에서는 플롯의 영역별로 색을 지정하는 것을 해보죠.