|
12 months ago | |
---|---|---|
.Rproj.user | 1 year ago | |
ggplot_doc_files/figure-html | 12 months ago | |
runs/2022-02-10T12-15-12Z/tfruns.d | 12 months ago | |
.gitignore | 1 year ago | |
1280px-R_logo.svg.png | 12 months ago | |
README.md | 12 months ago | |
gadm36_KOR_2_sp.rds | 12 months ago | |
ggplot_doc.Rmd | 12 months ago | |
ggplot_doc.Rproj | 1 year ago | |
ggplot_doc.html | 12 months ago | |
ggplot_doc.md | 12 months ago | |
readme.txt | 12 months ago | |
srtm_62_05.hdr | 12 months ago | |
srtm_62_05.tfw | 12 months ago | |
srtm_62_05.tif | 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은 막대그래프, 히스토그램, 박스플롯, 확률분포, 시계열그림, 히트맵, 바이올린 그림 등의 다양한 그래프를 그릴 수 있다.
원 그래프
원 그래프는 범주형 자료의 각 항목의 비율을 원 모양으로 시각화하여 나타낸 그래프이다. 자료의 다이아몬드 품질 중 저품질의 비율이 낮음을 알 수 있다.
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())
히스토그램
히스토그램은 연속형 자료를 요약하여시각화 하는 방법으로 자료의 분포 형태를 파악하기 위해 위해 주로 사용한다.
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))
히트맵 그림
히트맵그림은 색상으로 표현할 수 있는 정보를 이미지 위에 열 분포 형태로 나타내는 그래프이다. 웹로그 분석 시각화에 주로 활용되며 결측자료 시각화나 상관계수 그림을 시각화 할 때 활용되기도한다. 아래는 대한민국 고도 자료를 가져와 시각화 한 결과이다.
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()
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
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
y축 추가
https://www.r-graph-gallery.com/line-chart-dual-Y-axis-ggplot2.html