You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cjcho acfec5f944 update 12 months ago
.Rproj.user 기상자료개방포털 api crawling in r 1 year ago
ggplot_doc_files/figure-html update 12 months ago
runs/2022-02-10T12-15-12Z/tfruns.d update 12 months ago
.gitignore update 1 year ago
1280px-R_logo.svg.png update 12 months ago
README.md update 12 months ago
gadm36_KOR_2_sp.rds update 12 months ago
ggplot_doc.Rmd update 12 months ago
ggplot_doc.Rproj first commit 1 year ago
ggplot_doc.html update 12 months ago
ggplot_doc.md update 12 months ago
readme.txt update 12 months ago
srtm_62_05.hdr update 12 months ago
srtm_62_05.tfw update 12 months ago
srtm_62_05.tif update 12 months ago

README.md

title author date output
ggplot 기초 문법 정리 및 활용 조창제 2022년, 02월 11일 [{html_document [{keep_md true} {toc_float true} {number_sections true} {toc true} {toc_depth 3} {theme spacelab} {code_folding hide} {code_download false}]}]

데이터 시각화란 데이터가 내포하고있는 정보를 전달하기 위해서 작성하는 이미지다이어그램, 애니메이션들의 기술로 정의하고 있다. 시각화가 주목을 받는 이유는 감각 기관 중 시각이 가장 강력한 정보 수용체 이기 때문이다. 수치로 정보를 전달하는 것 보다 그래프로 그려 전달하는 것이 좀 더 빠르게 인식되기 때문이다.

ggplot

ggplot개념과 구조

ggplot개념

R은 데이터 분석과 시각화에 강한 컴퓨터 언어이다. R이 데이터 시각화에 강한 언어인 이유로는쉽고 빠르게 데이터 형태를 바꿀 수 있다는 점과 손쉽게 예쁜 그림을 그릴 수 있다는 점이라 할 수 있다. 그 중에서도 ggplot2는 R의 시각화 패키지 중 가장 많이 활용되는 패키지로 2005년 Hadley Wickham 교수에 의해 개발되었다. ggplot2는 기본 R 그래픽스에서 제공하는 대부분의 작업을 효과적으로 수행할 수 있으며, 데이터의 특성을 이해하기에 적합한 시각화 툴이라 할 수 있다. 또한 ggplotly 패키지를 통해 편리하게 동적인 시각화를 구현할 수 있다는 장점이 있다.

ggplot의 구조

ggplot2패키지는 함수들을 결합해서 사용하는 특성이 있어 함수만 따로 떼어 설명하기가 어려운 편이다. ggplot2의 기본성분은 아래와 같다.

  • Data : 데이터 프레임 객체 형태의 데이터
  • Aesthetic Mappings : 데이터를 축, 색상 및 점의 크기 등으로 매핑하는 방법
  • Geometric object : 점, 선, 도형과 같은 기하학적 객체
  • Facetting : 패널을 분할하여 표현하는 방법
  • Statistical transformation : 통계변환
  • Scales : 데이터의 스케일을 동적으로 조정하여 어떤 시각적 요소를 사용할 것인가 정의
  • Coordinate system : 좌표계
  • Position adjustment : 위치조정

참고 참고

ggplot 그래프의 종류

시각화 데이터 설명

자세한 설명은 아래 예제데이터로 시각화를 수행하면서 익혀보도록 하자.

iris

시각화 예시에 활용할 자료는 R의 내장된 예제 데이터로 Setosa, Versicolor, Virginica 세 종의 붗꽃에 대한 꽃받침과 꽃잎의 너비와 길이를 정리한 자료인 iris 자료를 활용하겠다. R에서 ??iris를 실행하면 데이터에 대한 설명을 확인 할 수 있다.

  • Sepal.Length : 꽃받침의 길이
  • Sepal.Width : 꽃받침의 너비
  • Petal.Length : 꽃잎의 길이
  • Petal.Width : 꽃잎의 너비

diamonds

시각화 예시에 활용할 자료는 ggplot2 패키지에 내장된 예제 데이터로 약 5,4000개의 다이아몬드의 가격 및 기타속성을 포함하는 diamonds 자료를 활용하겠다. R에서 ??ggplot2::diamonds를 실행하면 데이터에 대한 설명을 확인 할 수 있다.

  • price : 가격
  • carat : 다이아몬드 무게
  • cut : 절단 품질(Fair : 보통, Good : 좋음, Very Good : 매우 좋음, Premium : 프리미엄, Idaeal : 최상)
  • color : 다이아몬드 색상(D(최상)<E<F<G<H<I<J(최악))
  • clarity : 다이아몬드 투명도 ( I1(최악) < SI2 < SI1 < VS2 < VS1 < VVS2 < VVS1 < IF(최상))
  • x : 길이
  • y : 너비
  • z : 높이
  • depth : 총 깊이 비 = z/mean(x, y)
  • table : 가장 넓은 지점의 너비

mtcars

시각화 예시에 활용할 자료는 R의 내장된 예제 데이터로 자동차 모델에 대한 사양 정보를 포함하는 mtcars 자료를 활용하겠다. R에서 ??mtcars를 실행하면 데이터에 대한 설명을 확인 할 수 있는데 1974년 모터트랜드 US 메거진에서 가져온 32종 자동차의 디자인 및 성능특성과 연료소모량 자료입니다.

mtcars의 변수에 대한 설명은 아래와 같다.

  • mpg : 연비
  • cyl : 엔진의 기통수
  • disp : 배기량
  • hp : 마력
  • drat : 뒤차축비
  • wt : 중량
  • qsec : 1/4 mile 도달 시간
  • vs : V engine / Straight engine
  • am : 변속기어
  • gear : 전진기어 개수
  • carb : 기화기 개수

자료설명

AirPassengers

시각화 예시에 활용할 자료는 R의 내장된 예제 데이터로 1949년부터 1960년까지의 승객 수에 대한 정보를 포함하는 AirPassengers 자료를 활용하겠다. R에서 ??AirPassengers를 실행하면 데이터에 대한 보다 상세한 설명을 확인 할 수 있습니다.

ggplot 그래프의 종류

ggplot은 막대그래프, 히스토그램, 박스플롯, 확률분포, 시계열그림, 히트맵, 바이올린 그림 등의 다양한 그래프를 그릴 수 있다.

ggplot 갤러리

원 그래프

원 그래프는 범주형 자료의 각 항목의 비율을 원 모양으로 시각화하여 나타낸 그래프이다. 자료의 다이아몬드 품질 중 저품질의 비율이 낮음을 알 수 있다.

library(ggplot2)
#create data
data=as.data.frame(
  table(diamonds$cut))
colnames(data)=c('cut_type','count')
# 전체 자료의 다이아몬드 품질비 
ggplot(data=data,aes(x='',y=count,fill=cut_type))+
  geom_bar(stat='identity',width=1)+
  coord_polar("y",start=0)

참고

도넛그림

도넛 그림은 원 그래프와 같이 범주형 자료의 각 항목의 비율을 원 모양으로 시각화하여 나타낸 그래프이다. 원그래프와 다르게 여러 변수를 시각화할 수 있다. 품질이 안좋은 다이아몬드에서 투명도가 낮은 비율이 높음을 알 수 있다. 다만 투명도만 다이아몬드 품질에 영향을 미치는 것이 아니므로 최상급 다이아몬드 또한 투명도가 안좋은 경우도 존재한다.

library(ggplot2)
library(data.table)
#create data
data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut','clarity')]
data=data[,per:=count/sum(count)*100,by=c('cut')]
#create data other type
# library(plyr)
# data=ddply(diamonds,.(color,clarity),summarise, count=length(color))
# data=ddply(data,.(color),mutate,per=count/sum(count)*100)
#색상별 투명도
ggplot(data=data, 
       aes(x = cut, y = per, fill = clarity,color=cut)) +
  geom_col() +
  coord_polar("y")

  # scale_color_viridis_d()+
  # scale_color_manual(values=c(1:7)) +
  # scale_fill_viridis_d()

코드 참고 참고 참고

막대그래프

막대그래프는 범주형 자료를 요약하여시각화 하는 방법으로 범주 간의 비교를 위해 주로 사용한다. 범주 간의 비교를 할 때 주로 활용된다.

library(ggplot2)
data=diamonds
#data
ggplot(data=data,aes(x=cut))+
  geom_bar()

data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut')]
ggplot(data=data,aes(x=cut,y=count,fill=cut))+
  geom_bar(stat="identity")+
  coord_flip()

data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut','clarity')]
data=data[,per:=count/sum(count)*100,by=c('cut')]
ggplot(data=data,aes(x=cut,y=per,fill=clarity))+
  geom_bar(stat="identity",position=position_dodge())

ggplot 갤러리 링크

히스토그램

히스토그램은 연속형 자료를 요약하여시각화 하는 방법으로 자료의 분포 형태를 파악하기 위해 위해 주로 사용한다.

참고예정

library(ggplot2)

data=diamonds
ggplot(data, aes(x=price,fill=''))+
  geom_histogram(bins=30)+
  scale_fill_viridis_d()

data=diamonds
data=data[data$color%in%c('J','D'),]

ggplot(data=data,aes(x=price, fill=color)) +
    geom_histogram(bins=30, alpha=0.6) +
    scale_fill_viridis_d()

박스플롯

박스플롯그림은 연속형 자료를 요약하여 시각화 하는 방법으로 이상자료나 기초통계량을 시각화하기위해 주로 사용한다.

library(ggplot2)
 
data=diamonds
ggplot(data, aes(x=clarity,y=carat,fill=clarity))+
  geom_boxplot(alpha=0.3)+
  scale_fill_viridis_d()

바이올린 그림

바이올린 그림은 box플롯과 유사하지만 분포를 볼 수 있다는 장점이 있다. 비대칭 바이올린 그림 넣을지 고민 중

library(ggplot2)
data=diamonds
ggplot(data, aes(x=clarity,y=carat,fill=clarity))+
  geom_violin(alpha=0.3)+
  scale_fill_viridis_d()

밀도분포 그래프

밀도분포은 연속형 자료를 요약하여시각화 하는 방법으로 자료의 분포를 시각화하기 위해 주로 사용한다. 크기가 클수록 다이아몬드 투명도 안좋은 비율이 증가한다.

library(ggplot2)
data=diamonds

# Represent it
ggplot(data, aes(x=carat, fill=clarity)) +
    geom_density(color="#e9ecef", alpha=0.6)

참고

커널밀도함수

산점도 그림

같은 크기에서 다이아몬드 색상에 따라 가격의 차이가 존재함을 시각적으로 확인할 수 있다. 또한 다이아몬드 크기가 커질수록 투명도가 안좋아짐을 확인할 수 있다.

data=diamonds

# Represent it
ggplot(data, aes(x=carat,y=price, color=color)) +
    geom_point()

ggplot(data, aes(x=carat,y=price, color=clarity)) +
    geom_point()

시계열 그림

library(ggplot2)
library(forecast)
library(stringr)
library(viridis)

data=AirPassengers
data=data.frame(values=as.numeric(data),
                date=as.Date(
                  paste0(trunc(time(AirPassengers)),'-',
                         str_pad(cycle(AirPassengers), 2, pad = "0"),'-01')
                  )
                )
ggplot(data=data)+
  geom_line(aes(x=date,y=values,color=''))+
  scale_color_viridis_d()

모자이크 플롯

자료전체의 색상과 투명도에 대한 비를 직관적으로 확인할 수 있다.

library('ggmosaic')
library(data.table)
data=diamonds
data=setDT(data)[,.(count=.N),by=c('color','clarity')]
data=data[,per:=count/sum(count)*100,by=c('color')]

ggplot(data) +
    geom_mosaic(
      aes(x=product(color), fill=clarity,weight=per))

참고1

참고2

참고3

참고4

히트맵 그림

히트맵그림은 색상으로 표현할 수 있는 정보를 이미지 위에 열 분포 형태로 나타내는 그래프이다. 웹로그 분석 시각화에 주로 활용되며 결측자료 시각화나 상관계수 그림을 시각화 할 때 활용되기도한다. 아래는 대한민국 고도 자료를 가져와 시각화 한 결과이다.

library(ggplot2)
library(raster)
# korea <- getData('GADM', country='kor', level=2)
# get data
grid <- getData('SRTM', lon=126,lat=37)
# resolution down
grid=aggregate(grid, fact=50)
data=as.data.frame(grid, xy=T)
colnames(data)=c('x','y','z')
ggplot(data, aes(x, y, fill= z)) + 
  geom_tile()

링크

ggplot 디자인 다루기

ggplot 그래프의 종류와 기본 구조를 알아보았다. 이제 ggplot을 좀 더 아름답게 꾸며보도록 하자.

ggplot 꾸미기

폰트 추가

library(ggplot2)
library(showtext)
library(sysfonts)

#create data
data=as.data.frame(
  table(diamonds$cut))
colnames(data)=c('cut_type','count')

#font setting
font_add_google('Noto Sans KR', 'notosanskr')
font_add_google('Nanum Pen Script', 'nanumpen')
showtext_auto()

# 전체 자료의 다이아몬드 품질비 
ggplot(data=data,aes(x='',y=count,fill=cut_type))+
  geom_bar(stat='identity',width=1)+
  coord_polar("y",start=0)

ggplot(data=data,aes(x='',y=count,fill=cut_type))+
  geom_bar(stat='identity',width=1)+
  coord_polar("y",start=0)+
  theme(text=element_text(size=20,family = 'nanumpen'))

showtext_auto(F)

활용링크 활용링크 링크 링크

색상 조절

library(ggplot2)

#create data
data=as.data.frame(
  table(diamonds$cut))
colnames(data)=c('cut_type','count')

p=ggplot(
  data=data,aes(x='',y=count,fill=cut_type))+
  geom_bar(stat='identity',width=1)+
  coord_polar("y",start=0)

p+scale_fill_viridis_d()

p+scale_fill_manual(
  values=c("#131230", "#002955", "#074ca1", "#7c0022", "#ff6600"))

library(colourpicker)
# colourpicker:::plotHelperAddin()
library(RColorBrewer)

display.brewer.all()

display.brewer.pal(n = 8, name = 'Dark2')

library(dichromat)
library(ggplot2)
x_boundaries <-
  lapply(colorschemes,
         function(x) seq(from = 0, to = 1, length = length(x) + 1))
df <- data.frame(
  xmin = unlist(lapply(x_boundaries, function(x) rev(rev(x)[-1]))),
  xmax = unlist(lapply(x_boundaries, function(x) x[-1])),
  ymax = rep(seq_along(colorschemes), sapply(colorschemes, length)))
anno_df <- data.frame(
  scheme = names(colorschemes),
  num = seq_along(colorschemes))
ggplot(df, aes(xmin = xmin, xmax = xmax, ymin = ymax - 0.85, ymax = ymax)) +
  geom_rect(fill = unlist(colorschemes)) + xlim(c(-0.6, 1)) + 
  annotate("text", x = -0.05, y = anno_df$num - 0.5, label = anno_df$scheme,
           hjust = 1) + 
  theme_bw() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank())

링크 링크

ggplot 라벨

library(ggplot2)

data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut','clarity')]
data=data[,per:=count/sum(count)*100,by=c('cut')]

p=ggplot(data=data,aes(x=cut,y=per,fill=clarity))+
  geom_bar(stat="identity",position=position_dodge())+
  geom_text(aes(label=round(per,1)), 
            position=position_dodge(width=1))
p

p + theme(legend.position='bottom')

p + theme(legend.position = c(0.9, 0.8))

p + theme(legend.position = 'bottom')+
    guides(color = guide_legend(nrow = 2, byrow = TRUE))

p + theme(legend.position = 'none')

https://kuduz.tistory.com/1223?category=834629

여러개 그림 하나에 그리기

library(ggplot2)
library('patchwork')
library(ggplot2)
library(data.table)
#create data
data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut','clarity')]
data=data[,per:=count/sum(count)*100,by=c('cut')]
#색상별 투명도
p1=ggplot(data=data, 
       aes(x = cut, y = per, fill = clarity,color=cut)) +
  geom_col() +
  coord_polar("y")+
  scale_fill_viridis_d()+
  scale_color_viridis_d()

p2=ggplot(data=data,aes(x=cut,y=per,fill=clarity))+
  geom_bar(stat="identity",position=position_dodge())+
  scale_fill_viridis_d()

data=diamonds
data=data[data$color%in%c('J','D'),]

p3=ggplot(data=data,aes(x=price, fill=color)) +
    geom_histogram(bins=30, alpha=0.6) +
    scale_fill_viridis_d()

data=diamonds
p4=ggplot(data, aes(x=clarity,y=carat,fill=clarity))+
  geom_boxplot(alpha=0.3)+
  scale_fill_viridis_d()

p5=ggplot(data, aes(x=carat,y=price, color=color)) +
    geom_point()+
    scale_color_viridis_d()

(p1+p2)/(p3+p4+p5)

(p1/p2)|(p3/p4/p5)

패키지 비교 gridExtra gridExtra patchwork

ggplot custom 심볼

library(ggplot2)
library(forecast)
library(stringr)
library(viridis)

data=AirPassengers
data=data.frame(values=as.numeric(data),
                date=as.Date(
                  paste0(trunc(time(AirPassengers)),'-',
                         str_pad(cycle(AirPassengers), 2, pad = "0"),'-01')
                  )
                )
ggplot(data=data)+
  geom_point(aes(x=date,y=values),shape="\xF0\x9F\x98\x81",size=5)

코드링크 유니코드이모지 유니코드이모지

ggplot 패턴 커스텀

coord_fixed(ratio=1)# 종횡비 labs : 라벨

library(ggplot2)
library(ggpattern)#remotes::install_github("coolbutuseless/ggpattern")
library(magick)#install.packages("magick", repos = 'https://dev.ropensci.org')# sudo apt-get install imagemagick
library(data.table)
data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut','clarity')]
data=data[,per:=count/sum(count)*100,by=c('cut')]

ggplot(data=data,aes(x=cut,y=per,pattern_fill=clarity))+
  geom_col_pattern(stat="identity",position=position_dodge(),
                   fill='white',colour='black',pattern='stripe')

ggplot(data=data,aes(x=cut,y=per,pattern_fill=clarity))+
  geom_col_pattern(stat="identity",position=position_dodge(),
                   fill='white',colour='black',pattern='placeholder')+theme(legend.position = 'none')

flags <- c(
  system.file("img", "flag", "au.png", package = "ggpattern"),
  system.file("img", "flag", "dk.png", package = "ggpattern"),
  system.file("img", "flag", "gb.png", package = "ggpattern"),
  system.file("img", "flag", "gr.png", package = "ggpattern"),
  system.file("img", "flag", "no.png", package = "ggpattern"),
  system.file("img", "flag", "se.png", package = "ggpattern"),
  system.file("img", "flag", "us.png", package = "ggpattern")
)

ggplot(data=data,aes(x=cut,y=per,pattern_filename =clarity))+
  geom_col_pattern(stat="identity",position=position_dodge(),
                   fill='white',colour='black',
                   pattern='image',pattern_type='tile')+
  theme(legend.position = 'none')+
  scale_pattern_filename_discrete(choices = flags)

https://github.com/coolbutuseless/ggpattern

ggplot 배경 수정

library(ggplot2)
library(ggpubr)
library(grid)
# Import the image
#img.file <- system.file(file.path("images", "background-image.png"),package = "ggpubr")
#img <- png::readPNG(img.file)

data=diamonds
img=png::readPNG('1280px-R_logo.svg.png')
alpha=.2
w <- matrix(rgb(img[,,1],img[,,2],img[,,3], img[,,4] * alpha), nrow=dim(img)[1]) 

ggplot(data, aes(x=carat,y=price, color=color)) +
  annotation_custom(rasterGrob(img))+
    geom_point()+
  fill_palette('jco')+theme_classic()

ggplot(data, aes(x=carat,y=price, color=color)) +
  annotation_custom(rasterGrob(w))+
    geom_point()+theme_classic()

png magick

ggplot 관련 패키지 활용

상관성 그림

library(ggcorrplot)
library(ggplot2)
data=data.frame(diamonds)
corr=cor(data[,sapply(data,is.numeric)])
pmat=cor_pmat(data[,sapply(data,is.numeric)])
ggcorrplot(corr,method = 'circle',hc.order = T,type='lower',lab=T,p.mat=pmat)

워드클라우드

library(ggplot2)
library(ggwordcloud)

data("love_words")

set.seed(42)
ggplot(
  love_words,
  aes(
    label = word, size = speakers,
    color = speakers
  )
) +
  geom_text_wordcloud_area(
    aes(angle = 45 * sample(-2:2, nrow(love_words),
    replace = TRUE,
    prob = c(1, 1, 4, 1, 1)
    )
  ),
  mask = png::readPNG(system.file("extdata/hearth.png",
    package = "ggwordcloud", mustWork = TRUE
  )),
  rm_outside = TRUE
  ) +
  scale_size_area(max_size = 40) +
  theme_minimal() +
  scale_color_gradient(low = "darkred", high = "red")

https://kuduz.tistory.com/1198?category=834629

사회관계망

library(ggraph)
library(tidygraph)
# Create graph of highschool friendships
graph <- as_tbl_graph(highschool) %>% 
    mutate(Popularity = centrality_degree(mode = 'in'))

# plot using ggraph
ggraph(graph, layout = 'kk') + 
    geom_edge_fan(aes(alpha = stat(index)), show.legend = FALSE) + 
    geom_node_point(aes(size = Popularity)) + 
    facet_edges(~year) 

https://kuduz.tistory.com/1195?category=834629

퀴버 플롯

library(ggplot2)
library(ggquiver)
field <- expand.grid(x=seq(0,pi,pi/12), y=seq(0,pi,pi/12))
ggplot(field, aes(x=x,y=y,u=cos(x),v=sin(y))) +
  geom_quiver()

https://rdrr.io/cran/ggquiver/man/geom_quiver.html

바람장미도

library(clifro)
wind_df = data.frame(wind_speeds = c(rweibull(80, 2, 4), rweibull(20, 3, 9)),
                     wind_dirs = c(rnorm(80, 135, 55), rnorm(20, 315, 35)) %% 360,
                     station = rep(rep(c("Station A", "Station B"), 2),
                                   rep(c(40, 10), each = 2)))

# Plot a simple windrose using all the defaults, ignoring any facet variable
with(wind_df, windrose(wind_speeds, wind_dirs))

다른 패키지 참고

등고선그림

library(ggplot2)
library(raster)
grid <- getData('SRTM', lon=126,lat=37)
grid=aggregate(grid, fact=50)
data=as.data.frame(grid, xy=T)
colnames(data)=c('x','y','z')
ggplot(data,aes(x,y,z=z,color=z))+
  geom_contour_filled()+
  geom_contour(alpha=.6, binwidth=100)

https://ggplot2.tidyverse.org/reference/geom_contour.html

3d plot

library(ggplot2)
library(viridis)
library(rayshader)#remotes::install_github("tylermorganwall/rayshader")
options("cores"=8)

ggdiamonds = ggplot(diamonds, aes(x, depth)) +
 stat_density_2d(aes(fill = stat(nlevel)), geom = "polygon", n = 200, bins = 50,contour = TRUE) +
 facet_wrap(clarity~.) +
 scale_fill_viridis_c(option = "A")
ggdiamonds

plot_gg(ggdiamonds,multicore = TRUE,width=5,height=5,scale=250,windowsize=c(1400,866),
       zoom = 0.55, phi = 30)
render_snapshot()

render_camera(zoom=0.5,theta=-30,phi=30)
render_snapshot(clear = TRUE)

코드참고 코드참고

https://stackoverflow.com/questions/45052188/how-to-plot-3d-scatter-diagram-using-ggplot http://www.sthda.com/english/wiki/impressive-package-for-3d-and-4d-graph-r-software-and-data-visualization https://r-pyomega.tistory.com/23 http://kocw.xcache.kinxcdn.com/KOCW/document/2019/chungbuk/seonghyeongon1218/4.pdf

2D 밀도 그림

library(ggplot2)
data=diamonds
p <- ggplot(data, aes(carat, price))
p + geom_bin2d()

그 외 참고

x,y 분포도(뺄 예정) https://www.r-bloggers.com/2021/05/visualization-graphs-ggside-with-ggplot/

library(ggside)
library(tidyverse)
library(tidyquant)

p2<-mpg %>%
  ggplot(aes(hwy, cty, color = class)) +
  geom_point(size = 2, alpha = 0.3) +
  geom_smooth(aes(color = NULL), se=TRUE) +
  geom_xsidedensity(
    aes(
      y    = after_stat(density),
      fill = class
    ),
    alpha    = 0.5,
    size     = 1,
    position = "stack"
  ) +
  geom_ysidedensity(
    aes(
      x    = after_stat(density),
      fill = class
    ),
    alpha    = 0.5,
    size     = 1,
    position = "stack"
  ) +
  scale_color_tq() +
  scale_fill_tq() +
  theme_tq() +
  labs(title = "Fuel Economy by Vehicle Type" ,
       subtitle = "Density Plot",
       x = "Highway", y = "City") +  theme(
    ggside.panel.scale.x = 0.4,
    ggside.panel.scale.y = 0.4
  )
plot(p2)

버블 그림

슬로프차트

https://kuduz.tistory.com/1146?category=834629

와플차트 https://kuduz.tistory.com/1144?category=834629

알아두면 유용한 ggplot 정보

수식추가

논문이나 기사 작업에는 LaTeX이라는 문서 작성 도구를 활용합니다. LaTeX은 수식을 넣을 수 있다는 장점이 존재합니다. R에서 latex2exp 패키지를 통해 LaTeX 문법을 지원하고 있다.

library(ggplot2)
library(showtext)
library(sysfonts)

#create data
data=as.data.frame(
  table(diamonds$cut))
colnames(data)=c('cut_type','count')

# 전체 자료의 다이아몬드 품질비 
ggplot(data=data,aes(x='',y=count,fill=cut_type))+
  geom_bar(stat='identity',width=1)+
  coord_polar("y",start=0)+
  labs(x = expression(paste(mu)),
       y = expression(paste(mu)),
       title=bquote(paste(mu)))

library(latex2exp)
ggplot(data=data,aes(x='',y=count,fill=cut_type))+
  geom_bar(stat='identity',width=1)+
  coord_polar("y",start=0)+
  labs(x = TeX(paste('$\\mu')),
       y = TeX(paste('$\\mu')),
       title=TeX(paste('$\\mu')))

# latex2exp_supported()
latex2exp_examples()

https://kuduz.tistory.com/1244?category=834629

ggplot 날짜형식 변경

library(ggplot2)
library(forecast)
library(stringr)
library(viridis)

data=AirPassengers
data=data.frame(
  values=as.numeric(data),
  date=as.Date(
    paste0(trunc(time(AirPassengers)),'-',
    str_pad(cycle(AirPassengers), 2, pad = "0"),'-01')
    )
  )

p=ggplot(data=data)+
  geom_line(aes(x=date,y=values,color=''))+
  scale_color_viridis_d()

p+scale_x_date(date_labels = "%b")

p+scale_x_date(date_labels = "%Y %b %d")

p+scale_x_date(date_labels = "%W")

p+scale_x_date(date_labels = "%m-%Y")

p + scale_x_date(date_breaks = "18 month", date_labels = "%Y/%m")

p + scale_x_date(date_breaks = "18 month", date_labels = "%Y/%m",expand=c(0,0))

p + scale_x_date(breaks = seq(as.Date('1949-01-15'),as.Date('1961-01-16'),by='18 month'),
                 date_labels='%Y\n%m/%d')

https://www.r-graph-gallery.com/279-plotting-time-series-with-ggplot2.html

레이블 이동

library(ggplot2)
library(data.table)
library(ggrepel)
#create data
data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut','clarity')]
data=data[,per:=count/sum(count)*100,by=c('cut')]

p=ggplot(data=data,
         aes(x=cut,y=per,fill=clarity,label=round(per,2)))+
  geom_bar(stat="identity",position=position_dodge())

p+geom_text(size=4,angle=30,position=position_dodge(.9))

p+geom_text_repel(size=4,angle=30,position=position_dodge(.9),
                  color='black',bg.color = "white", bg.r = 0.25)

네온 입히기

library(ggplot2)
library(data.table)
library(ggshadow)
library(ggrepel)
library(forecast)
library(stringr)
library(viridis)
library(scales)
#create data
data=AirPassengers
data=data.frame(values=as.numeric(data),
                date=as.Date(
                  paste0(trunc(time(AirPassengers)),'-',
                         str_pad(cycle(AirPassengers), 2, pad = "0"),'-01')
                  )
                )

p=ggplot(data=data,aes(x=date,y=values,color='',label=values))+
  geom_shadowpoint()+
  scale_color_viridis_d()

p+geom_text(size=4,angle=30,position=position_dodge(.9))

p+geom_text_repel(size=3,angle=30,position=position_dodge(.9),
                  color='black',bg.color = alpha('red',.1), bg.r = 0.25)

https://kuduz.tistory.com/1111?category=834629

그림확대하기

library(ggplot2)
library(ggforce)
df <- data.frame(a = c(1,2,3,500), b = c('a1', 'a2','a3', 'a4'))

ggplot(df) + 
  aes(x = factor(b), y = a) +
  geom_col() +
  theme_bw()+
  facet_zoom(ylim = c(0, 10))

https://stackoverflow.com/questions/7194688/using-ggplot2-can-i-insert-a-break-in-the-axis

http://www.sthda.com/english/articles/32-r-graphics-essentials/131-plot-two-continuous-variables-scatter-graph-and-alternatives/

https://ggforce.data-imaginist.com/reference/facet_zoom.html

막대그림 둥글게 표현하기

library(ggchicklet)#install.packages("ggchicklet",repos = "https://cinc.rud.is")
library(ggplot2)
library(data.table)
data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut','clarity')]
data=data[,per:=count/sum(count)*100,by=c('cut')]
ggplot(data=data,aes(x=cut,y=per,fill=clarity))+
  geom_chicklet(position=position_dodge(),radius = grid::unit(1.5, "mm")) 

https://community.rstudio.com/t/how-to-make-a-rounded-corner-bar-plot/34592/2

축 자르기

library(ggplot2)
library(data.table)
library(ggbreak) 

data=diamonds
data=setDT(data)[,.(count=.N),by=c('cut','clarity')]
data=data[,per:=count/sum(count)*100,by=c('cut')]
p=ggplot(data=data,aes(x=cut,y=per,fill=clarity))+
    geom_bar(stat="identity",position=position_dodge())+
  scale_y_continuous(breaks = seq(0,35,5))
p+scale_y_break(c(10, 15),space=0)+
  theme(axis.ticks.y.right = element_blank(),
        axis.text.y.right = element_blank())

library(ggplot2)
library(forecast)
library(stringr)
library(viridis)
library(ggbreak) 

data=AirPassengers
data=data.frame(values=as.numeric(data),
                date=as.Date(
                  paste0(trunc(time(AirPassengers)),'-',
                         str_pad(cycle(AirPassengers), 2, pad = "0"),'-01')
                  )
                )

p=ggplot(data=data)+
  geom_line(aes(x=date,y=values,color=''))+
  scale_color_viridis_d()+
  scale_x_date(breaks = 
                 seq(as.Date('1949-01-15'),as.Date('1961-01-16'),by='18 month'),
                 date_labels='%Y\n%m/%d')

p+scale_x_break(c(as.Date('1950-01-01'), as.Date('1955-01-01')))+
  theme(axis.ticks.x.top = element_blank(),
        axis.text.x.top = element_blank())

https://cran.r-project.org/web/packages/ggbreak/vignettes/ggbreak.html

ggplot 동적시각화

https://kuduz.tistory.com/1196?category=834629

참고

ggplot 전반적 코드 https://kuduz.tistory.com/1077?category=834629

https://tryfailbetter.netlify.app/2019/02/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EB%B0%8F-%EA%B0%95%EB%82%A8%EA%B5%AC-%EA%B1%B4%EB%AC%BC-%EC%8B%9C%EA%B0%81%ED%99%94/

y축 추가

https://www.r-graph-gallery.com/line-chart-dual-Y-axis-ggplot2.html