이 저장소의 목표는 내가 배운 깔끔한 ggplot2 트릭을 추적하는 것입니다. 이것은 GGPLOT2의 기본 사항에 익숙해졌으며 자신의 멋진 음모를 구성 할 수 있다고 가정합니다. 그렇지 않다면, 당신의 레무어에서 책을 잊어 버리십시오.
나는 영광스럽게 조립하는 음모와 전문적으로 테마와 컬러 팔레트에 엄청나게 적응하지 않으므로 나를 용서해야합니다. mpg
데이터 세트는 플로팅에 매우 다재다능하므로 읽을 때 많은 것을 볼 수 있습니다. 확장 패키지는 훌륭하고 스스로 덤벼 들었지만 여기서 바닐라 GGPLOT2 트릭으로 제한하려고 노력할 것입니다.
현재로서는 주로 재입학 전용 트릭 백일 것이지만 나중에 다른 파일의 별도 그룹에 넣기로 결정할 수 있습니다.
라이브러리를로드하고 플로팅 테마를 설정함으로써. 여기서 첫 번째 요령은 theme_set()
사용하여 문서 전체에서 모든 플롯에 대한 테마를 설정하는 것입니다. 자신이 모든 음모에 대해 매우 장황한 테마를 설정한다면 여기에 모든 일반적인 설정을 설정하는 곳이 있습니다. 그런 다음 테마 요소의 소설을 다시는 쓰지 마십시오 1 !
library( ggplot2 )
library( scales )
theme_set(
# Pick a starting theme
theme_gray() +
# Add your favourite elements
theme(
axis.line = element_line(),
panel.background = element_rect( fill = " white " ),
panel.grid.major = element_line( " grey95 " , linewidth = 0.25 ),
legend.key = element_rect( fill = NA )
)
)
?aes
문서는 이것을 말하지 않지만 GGPLOT2의 mapping
인수를 스플릿 할 수 있습니다. 그게 무슨 뜻입니까? mapping
!!!
. 한 번에 한 번에 미학을 재활용 해야하는 경우 특히 끔찍합니다.
my_mapping <- aes( x = foo , y = bar )
aes( colour = qux , !!! my_mapping )
# > Aesthetic mapping:
# > * `x` -> `foo`
# > * `y` -> `bar`
# > * `colour` -> `qux`
이것을 개인적으로 가장 좋아하는 사용은 fill
색상이 colour
색상과 일치하지만 약간 가볍게 만드는 것입니다 . 이 경우 지연된 평가 시스템을 사용 after_scale()
경우 다음 섹션에서 더 많이 볼 수 있습니다. 이 문서 에서이 트릭을 몇 번 반복하겠습니다.
my_fill <- aes( fill = after_scale(alpha( colour , 0.3 )))
ggplot( mpg , aes( displ , hwy )) +
geom_point(aes( colour = factor ( cyl ), !!! my_fill ), shape = 21 )
소수의 변수의 열도를 만들어야하는 상황에서 자신을 찾을 수 있습니다. 일반적으로 순차적 스케일은 밝은 곳에서 어두운 곳에서 또는 그 반대의 경우에도 실행되므로 단일 색상의 텍스트를 읽기가 어렵습니다. 우리는 어두운 배경에서 텍스트를 자동으로 흰색으로 작성하고 밝은 배경에서 검은 색을 작성하는 방법을 고안 할 수 있습니다. 아래 함수는 색상의 빛 값을 고려하고 그 가벼움에 따라 검은 색 또는 흰색을 반환합니다.
contrast <- function ( colour ) {
out <- rep( " black " , length( colour ))
light <- farver :: get_channel( colour , " l " , space = " hcl " )
out [ light < 50 ] <- " white "
out
}
이제 우리는 미학을 주문시 레이어의 mapping
주장에 스 플라이싱 할 수 있습니다.
autocontrast <- aes( colour = after_scale(contrast( fill )))
마지막으로 자동 대비 장치를 테스트 할 수 있습니다. 당신은 그것이 척도에 적응한다는 것을 알 수 있으므로이를 위해 조건부 형식을 할 필요가 없습니다.
cors <- cor( mtcars )
# Melt matrix
df <- data.frame (
col = colnames( cors )[as.vector(col( cors ))],
row = rownames( cors )[as.vector(row( cors ))],
value = as.vector( cors )
)
# Basic plot
p <- ggplot( df , aes( row , col , fill = value )) +
geom_raster() +
geom_text(aes( label = round( value , 2 ), !!! autocontrast )) +
coord_equal()
p + scale_fill_viridis_c( direction = 1 )
p + scale_fill_viridis_c( direction = - 1 )
하프 게인 버전의 사물을 제공하는 확장 기능이 있습니다. 내가 아는 사람들 중 Gghalves와 See 패키지는 반세를 제공합니다.
다음은 지연된 평가 시스템을 남용하여 직접 만드는 방법입니다. 이 기능에 대한 추가 의존성을 기꺼이받지 않으면 편리 할 수 있습니다.
쉬운 경우는 BoxPlot입니다. 박스 플롯의 오른쪽과 왼쪽 부분을 각각 유지하기 위해 xmin
또는 xmax
after_scale(x)
로 설정할 수 있습니다. 이것은 여전히 position = "dodge"
에서 잘 작동합니다.
# A basic plot to reuse for examples
p <- ggplot( mpg , aes( class , displ , colour = class , !!! my_fill )) +
guides( colour = " none " , fill = " none " ) +
labs( y = " Engine Displacement [L] " , x = " Type of car " )
p + geom_boxplot(aes( xmin = after_scale( x )))
BoxPlots에서 작동하는 것과 동일하게 오류바에서도 작동합니다.
p + geom_errorbar(
stat = " summary " ,
fun.data = mean_se ,
aes( xmin = after_scale( x ))
)
우리는 다시 바이올린 플롯에 대해 같은 일을 할 수 있지만, 층은 xmin
미학에 대해 알지 못하는 것에 대해 불평합니다. 그것은 그 미학을 사용하지만 데이터가 설정 된 후에 만 사용자 액세스 가능한 미학이 아닙니다 . xmin
기본값을 NULL
로 업데이트하여 경고를 침묵시킬 수 있습니다. 즉, 불평하지 않지만 결석 한 경우 사용하지 않습니다.
update_geom_defaults( " violin " , list ( xmin = NULL ))
p + geom_violin(aes( xmin = after_scale( x )))
이번에는 독자를위한 운동으로 남겨지지 않았지만, 두 개의 반쪽을 결합하고 서로 약간 상쇄되기를 원한다면 어떻게 작동하는지 보여주고 싶었습니다. 우리는 박스 플로트의 스테이플 역할을하는 오류 바를 남용 할 것입니다.
# A small nudge offset
offset <- 0.025
# We can pre-specify the mappings if we plan on recycling some
right_nudge <- aes(
xmin = after_scale( x ),
x = stage( class , after_stat = x + offset )
)
left_nudge <- aes(
xmax = after_scale( x ),
x = stage( class , after_stat = x - offset )
)
# Combining
p +
geom_violin( right_nudge ) +
geom_boxplot( left_nudge ) +
geom_errorbar( left_nudge , stat = " boxplot " , width = 0.3 )
내가 가진 것보다 더 나은 색상 직관이 있다고 가정 해 봅시다. 고통스러운 점은 한계가 완벽하게 중심이되지 않으면 중간 점을 올바르게 얻는 것이 까다 롭다는 것입니다. 스케일로 리그에서 rescaler
인수를 입력하십시오 scales::rescale_mid()
.
my_palette <- c( " dodgerblue " , " deepskyblue " , " white " , " hotpink " , " deeppink " )
p <- ggplot( mpg , aes( displ , hwy , colour = cty - mean( cty ))) +
geom_point() +
labs(
x = " Engine displacement [L] " ,
y = " Highway miles per gallon " ,
colour = " Centered n value "
)
p +
scale_colour_gradientn(
colours = my_palette ,
rescaler = ~ rescale_mid( .x , mid = 0 )
)
대안은 단순히 x의 한계를 중심으로하는 것입니다. 우리는 척도의 한계에 함수를 제공함으로써 그렇게 할 수 있습니다.
p +
scale_colour_gradientn(
colours = my_palette ,
limits = ~ c( - 1 , 1 ) * max(abs( .x ))
)
geom_text()
로 점에 레이블을 지정할 수 있지만 잠재적 인 문제는 텍스트와 포인트가 겹치는 것입니다.
set.seed( 0 )
df <- USArrests [sample(nrow( USArrests ), 5 ), ]
df $ state <- rownames( df )
q <- ggplot( df , aes( Murder , Rape , label = state )) +
geom_point()
q + geom_text()
이 문제에 대한 몇 가지 일반적인 해결책이 있으며 모두 단점이 있습니다.
nudge_x
및 nudge_y
매개 변수를 설정할 수 있습니다. 여기서 문제는 데이터 단위로 정의되므로 간격은 예측할 수 없으며 원래 위치에 의존 할 수있는 방법이 없습니다.hjust
와 vjust
Aesthetics를 설정할 수 있습니다. 원래 위치에 의존 할 수 있지만 자연스러운 오프셋이 없습니다.다음은 옵션 2와 3이 있습니다.
q + geom_text( nudge_x = 1 , nudge_y = 1 )
q + geom_text(aes(
hjust = Murder > mean( Murder ),
vjust = Rape > mean( Rape )
))
당신은 다음과 같이 생각할 것입니다. '나는 더 넓은 상쇄를 얻기 위해 정당화를 곱할 수 있습니다'. 당신은 옳을 것입니다. 그러나 정당화는 텍스트의 크기에 따라 달라 지므로 불평등 한 오프셋이 발생할 수 있습니다. 아래 플롯 아래의 '노스 다코타'는 y 방향에서 너무 멍청하고 X 방향에서 '로드 아일랜드'에서 너무 상쇄됩니다.
q + geom_text(aes(
label = gsub( " North Dakota " , " North n Dakota " , state ),
hjust = (( Murder > mean( Murder )) - 0.5 ) * 1.5 + 0.5 ,
vjust = (( Rape > mean( Rape )) - 0.5 ) * 3 + 0.5
))
geom_label()
의 좋은 점은 라벨 상자를 끄고 텍스트를 유지할 수 있다는 것입니다. 이렇게하면 label.padding
설정과 같은 다른 유용한 것들을 계속 사용하여 텍스트에서 레이블로 절대 (데이터 독립적) 오프셋을 제공 할 수 있습니다.
q + geom_label(
aes(
label = gsub( " " , " n " , state ),
hjust = Murder > mean( Murder ),
vjust = Rape > mean( Rape )
),
label.padding = unit( 5 , " pt " ),
label.size = NA , fill = NA
)
이것은 패싯 태그를 패널에 넣는 것에 대한 팁이었습니다. ggplot2 3.5.0을 사용하면 더 이상 무한 위치를 설정하고 hjust
또는 vjust
매개 변수를 조정하는 데 바이올린을 만들 필요가 없습니다. 이제 x = I(0.95), y = I(0.95)
사용하여 오른쪽 상단 코너에 텍스트를 배치 할 수 있습니다. 기존 팁을보기 위해 세부 사항을 열어보십시오.
텍스트 주석을 측면 플롯에 넣는 것은 통증입니다. 한계는 패널 당 다를 수 있기 때문에 올바른 위치를 찾기가 매우 어렵 기 때문입니다. 이 통증을 완화시키는 확장은 Tagger 확장이지만 바닐라 ggplot2에서 비슷한 일을 할 수 있습니다.
운 좋게도 GGPLOT2의 위치 축에는 -Inf
스케일의 최소 및 최대 Inf
로 해석되는 GGPLOT2 의 위치 축에 각각의 정비가 있습니다. x = Inf, y = Inf
선택하여 라벨을 모퉁이에 넣음으로써이를 악용 할 수 있습니다. Inf
대신 -Inf
사용하여 상단 대신 하단에 배치하거나 오른쪽 대신 왼쪽을 사용할 수도 있습니다.
우리는 hjust
/ vjust
인수를 줄거리 측면과 일치시켜야합니다. x/y = Inf
의 경우 hjust/vjust = 1
이어야하며 x/y = -Inf
의 경우 hjust/vjust = 0
이어야합니다.
p + facet_wrap( ~ class , scales = " free " ) +
geom_text(
# We only need 1 row per facet, so we deduplicate the facetting variable
data = ~ subset( .x , ! duplicated( class )),
aes( x = Inf , y = Inf , label = LETTERS [seq_along( class )]),
hjust = 1 , vjust = 1 ,
colour = " black "
)
불행히도, 이것은 텍스트를 패널의 경계에 똑바로 배치하여 우리의 아름다움을 화나게 할 수 있습니다. geom_label()
사용하여 약간 더 화려하게 될 수 있습니다.이를 통해 label.padding
을 설정하여 텍스트와 패널 테두리 사이의 간격을보다 정확하게 제어 할 수 있습니다.
또한 geom의 텍스트 상자 부분을 숨기려면 label.size = NA, fill = NA
사용할 수 있습니다. 예시 목적으로, 이제 우리는 이제 오른쪽 상단 대신 왼쪽 상단에 태그를 배치합니다.
p + facet_wrap( ~ class , scales = " free " ) +
geom_label(
data = ~ subset( .x , ! duplicated( class )),
aes( x = - Inf , y = Inf , label = LETTERS [seq_along( class )]),
hjust = 0 , vjust = 1 , label.size = NA , fill = NA ,
label.padding = unit( 5 , " pt " ),
colour = " black "
)
우리가 다른 데이터 세트와 열을 가진 비슷한 음모를 만들어내는 임무를 맡고 있다고 가정 해 봅시다. 예를 들어, 특정 사전 세트로 일련의 Barplots 4를 만들 수 있습니다. 바가 X 축을 터치하고 수직 그리드 라인을 그리지 않기를 원합니다.
유사한 플롯을 많이 만드는 잘 알려진 방법 중 하나는 플롯 구성을 함수로 래핑하는 것입니다. 이렇게하면 기능에서 원하는 모든 사전 설정을 인코딩 할 수 있습니다.
aes()
함수를 사용하여 프로그래밍하는 다양한 방법이 있으며 {{ }}
(Curly-Curly)를 사용하는 것이 가장 유연한 방법 중 하나입니다 .
barplot_fun <- function ( data , x ) {
ggplot( data , aes( x = {{ x }})) +
geom_bar( width = 0.618 ) +
scale_y_continuous( expand = c( 0 , 0 , 0.05 , 0 )) +
theme( panel.grid.major.x = element_blank())
}
barplot_fun( mpg , class )
이 접근법의 한 가지 단점은 기능 인수에서 미학을 잠그는 것입니다. 이것을 돌아 다니기 위해, 더 간단한 방법은 단순히 aes()
로 직접 통과 ...
것입니다.
barplot_fun <- function ( data , ... ) {
ggplot( data , aes( ... )) +
geom_bar( width = 0.618 ) +
scale_y_continuous( expand = c( 0 , 0 , 0.1 , 0 )) +
theme( panel.grid.major.x = element_blank())
}
barplot_fun( mpg , class , colour = factor ( cyl ), !!! my_fill )
매우 비슷한 일을하는 또 다른 방법은 플롯 '골격'을 사용하는 것입니다. 골격의 배후에있는 아이디어는 data
인수의 유무에 관계없이 플롯을 구축하고 나중에 세부 사항을 추가 할 수 있다는 것입니다. 그런 다음 실제로 플롯을 만들려면 %+%
사용하여 데이터 세트를 채우거나 교체 할 수 있으며 + aes(...)
관련 미학을 설정할 수 있습니다.
barplot_skelly <- ggplot() +
geom_bar( width = 0.618 ) +
scale_y_continuous( expand = c( 0 , 0 , 0.1 , 0 )) +
theme( panel.grid.major.x = element_blank())
my_plot <- barplot_skelly % + % mpg +
aes( class , colour = factor ( cyl ), !!! my_fill )
my_plot
이 골격에 대한 한 가지 깔끔한 점은 이미 data
및 mapping
인수를 채우더라도 계속해서 교체 할 수 있다는 것입니다.
my_plot % + % mtcars +
aes( factor ( carb ), colour = factor ( cyl ), !!! my_fill )
여기서 아이디어는 전체 플롯을 골격하는 것이 아니라 자주 재사용되는 부품을 자주 재사용하는 것입니다. 예를 들어, 우리는 Barplot에 라벨을 붙이고 라벨이 붙은 바 플로트를 구성하는 모든 것을 함께 포장 할 수 있습니다. 이에 대한 속임수는 이러한 구성 요소를 +
와 함께 추가 하지 않고 단순히 list()
에 넣는 것입니다. 그런 다음 메인 플롯 호출과 함께 목록을 +
할 수 있습니다.
labelled_bars <- list (
geom_bar( my_fill , width = 0.618 ),
geom_text(
stat = " count " ,
aes( y = after_stat( count ),
label = after_stat( count ),
fill = NULL , colour = NULL ),
vjust = - 1 , show.legend = FALSE
),
scale_y_continuous( expand = c( 0 , 0 , 0.1 , 0 )),
theme( panel.grid.major.x = element_blank())
)
ggplot( mpg , aes( class , colour = factor ( cyl ))) +
labelled_bars +
ggtitle( " The `mpg` dataset " )
ggplot( mtcars , aes( factor ( carb ), colour = factor ( cyl ))) +
labelled_bars +
ggtitle( " The `mtcars` dataset " )
#> ─ Session info ───────────────────────────────────────────────────────────────
#> setting value
#> version R version 4.3.2 (2023-10-31 ucrt)
#> os Windows 11 x64 (build 22631)
#> system x86_64, mingw32
#> ui RTerm
#> language (EN)
#> collate English_Netherlands.utf8
#> ctype English_Netherlands.utf8
#> tz Europe/Amsterdam
#> date 2024-02-27
#> pandoc 3.1.1
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> cli 3.6.2 2023-12-11 [] CRAN (R 4.3.2)
#> colorspace 2.1-0 2023-01-23 [] CRAN (R 4.3.2)
#> digest 0.6.34 2024-01-11 [] CRAN (R 4.3.2)
#> dplyr 1.1.4 2023-11-17 [] CRAN (R 4.3.2)
#> evaluate 0.23 2023-11-01 [] CRAN (R 4.3.2)
#> fansi 1.0.6 2023-12-08 [] CRAN (R 4.3.2)
#> farver 2.1.1 2022-07-06 [] CRAN (R 4.3.2)
#> fastmap 1.1.1 2023-02-24 [] CRAN (R 4.3.2)
#> generics 0.1.3 2022-07-05 [] CRAN (R 4.3.2)
#> ggplot2 * 3.5.0.9000 2024-02-27 [] local
#> glue 1.7.0 2024-01-09 [] CRAN (R 4.3.2)
#> gtable 0.3.4 2023-08-21 [] CRAN (R 4.3.2)
#> highr 0.10 2022-12-22 [] CRAN (R 4.3.2)
#> htmltools 0.5.7 2023-11-03 [] CRAN (R 4.3.2)
#> knitr 1.45 2023-10-30 [] CRAN (R 4.3.2)
#> labeling 0.4.3 2023-08-29 [] CRAN (R 4.3.1)
#> lifecycle 1.0.4 2023-11-07 [] CRAN (R 4.3.2)
#> magrittr 2.0.3 2022-03-30 [] CRAN (R 4.3.2)
#> munsell 0.5.0 2018-06-12 [] CRAN (R 4.3.2)
#> pillar 1.9.0 2023-03-22 [] CRAN (R 4.3.2)
#> pkgconfig 2.0.3 2019-09-22 [] CRAN (R 4.3.2)
#> R6 2.5.1 2021-08-19 [] CRAN (R 4.3.2)
#> ragg 1.2.7 2023-12-11 [] CRAN (R 4.3.2)
#> rlang 1.1.3 2024-01-10 [] CRAN (R 4.3.2)
#> rmarkdown 2.25 2023-09-18 [] CRAN (R 4.3.2)
#> rstudioapi 0.15.0 2023-07-07 [] CRAN (R 4.3.2)
#> scales * 1.3.0 2023-11-28 [] CRAN (R 4.3.2)
#> sessioninfo 1.2.2 2021-12-06 [] CRAN (R 4.3.2)
#> systemfonts 1.0.5 2023-10-09 [] CRAN (R 4.3.2)
#> textshaping 0.3.7 2023-10-09 [] CRAN (R 4.3.2)
#> tibble 3.2.1 2023-03-20 [] CRAN (R 4.3.2)
#> tidyselect 1.2.0 2022-10-10 [] CRAN (R 4.3.2)
#> utf8 1.2.4 2023-10-22 [] CRAN (R 4.3.2)
#> vctrs 0.6.5 2023-12-01 [] CRAN (R 4.3.2)
#> viridisLite 0.4.2 2023-05-02 [] CRAN (R 4.3.2)
#> withr 3.0.0 2024-01-16 [] CRAN (R 4.3.2)
#> xfun 0.41 2023-11-01 [] CRAN (R 4.3.2)
#> yaml 2.3.8 2023-12-11 [] CRAN (R 4.3.2)
#>
#>
#> ──────────────────────────────────────────────────────────────────────────────
글쎄, 당신은 당신의 문서의 시작 부분에서 한 번해야합니다. 그러나 다시는 절대! 다음 문서를 제외하고. 문서에서 plot_defaults.R
Script source()
를 작성하십시오. 모든 프로젝트에 대해 해당 스크립트를 복사합니다. 그런 다음 진정으로, 다시 는 : 마음 :. ↩
이것은 거짓말입니다. 실제로, 나는 채우기를 밝히는 대신 aes(colour = after_scale(colorspace::darken(fill, 0.3)))
사용합니다. 나는이 readme가 {colorspace}에 의존하는 것을 원하지 않았다. ↩
예를 들어 스케일에서 oob = scales::oob_censor_any
설정하여 플롯을 자체 파괴하지 않는 한. ↩
당신의 영혼의 영혼 안에서, 당신은 정말 많은 바를 만들고 싶습니까? ↩
var
은 .data
대명사 .data[[var]]
사용하는 것 .data$var
. ↩
이 비트는 원래 '부분 골격'이라고 불 렸지만 늑골이 골격의 일부 이므로이 제목은 더욱 연상적인 소리로 들렸습니다. ↩