ShowText를 사용하면 R 플롯에서 다양한 유형의 글꼴 (Truetype, OpenType, Type 1, Web Fonts 등)을 쉽게 사용할 수 있습니다. 이 패키지를 개발하려는 동기는 R 플롯 (특히 PDF 장치의 경우 비표준 글꼴을 사용하는 것이 중국어로 PDF를 만들 때 간단하지 않다는 것입니다. pdf() 에서 사용하는 대부분의 표준 글꼴에는 한자 글리프가 포함되어 있지 않으며 사용자는 R에서 시스템 글꼴을 거의 사용할 수 없기 때문입니다.
Winston Chang이 개발 한 엑스트라 폰트 패키지는이 문제에 대한 훌륭한 솔루션 중 하나이며, 주로 PDF 그래픽 장치에서 트루 타입 글꼴 ( .ttf )을 사용하는 데 중점을 둡니다. 이제 ShowText는 더 많은 글꼴 형식과 더 많은 그래픽 장치를 지원할 수 있으며 GhostScript와 같은 외부 소프트웨어를 사용하지 않습니다.
library( showtext )
# # Loading Google fonts (https://fonts.google.com/)
font_add_google( " Gochi Hand " , " gochi " )
font_add_google( " Schoolbell " , " bell " )
font_add_google( " Covered By Your Grace " , " grace " )
font_add_google( " Rock Salt " , " rock " )
# # Automatically use showtext to render text for future devices
showtext_auto()
# # Tell showtext the resolution of the device,
# # only needed for bitmap graphics. Default is 96
showtext_opts( dpi = 96 )
set.seed( 123 )
x = rnorm( 10 )
y = 1 + x + rnorm( 10 , sd = 0.2 )
y [ 1 ] = 5
mod = lm( y ~ x )
op = par( cex.lab = 2 , cex.axis = 1.5 , cex.main = 2 )
plot( x , y , pch = 16 , col = " steelblue " ,
xlab = " X variable " , ylab = " Y variable " , family = " gochi " )
grid()
title( " Draw Plots Before You Fit A Regression " , family = " bell " )
text( - 0.5 , 4.5 , " This is the outlier " , cex = 2 , col = " steelblue " ,
family = " grace " )
abline(coef( mod ))
abline( 1 , 1 , col = " red " )
par( family = " rock " )
text( 1 , 1 , expression(paste( " True model: " , y == x + 1 )),
cex = 1.5 , col = " red " , srt = 20 )
text( 0 , 2 , expression(paste( " OLS: " , hat( y ) == 0.79 * x + 1.49 )),
cex = 1.5 , srt = 15 )
legend( " topright " , legend = c( " Truth " , " OLS " ), col = c( " red " , " black " ), lty = 1 )
par( op ) 이 예에서는 먼저 Google Fonts를 통해 온라인으로 제공되는 일부 글꼴을로드 한 다음 showtext_auto() 함수를 호출하여 ShowText를 사용하여 텍스트를 렌더링하도록 R을 알려줍니다. 나머지 부분은 일반적인 플로팅 명령과 정확히 동일합니다.
이 예제는 pdf() , png() , postscript() 및 Linux의 windows() 및 x11() 과 같은 스크린 장치를 포함한 대부분의 그래픽 장치에서 작동해야합니다.
먼저 pdf() 의 작동 방식을 조금 설명하겠습니다.
내가 아는 한, R의 기본 PDF 장치는 텍스트를 "그리기"하지 않고 PDF 파일의 텍스트를 "설명"합니다. 즉, 실제 글리프의 선과 곡선을 그리는 대신 텍스트에 대한 정보, 예를 들어 어떤 문자, 사용하는 글꼴 등과 같은 텍스트에 대한 정보 만 포함됩니다.
그러나 선언 된 글꼴이있는 텍스트는 다른 OS에서 다르게 표시 될 수 있으며, 이는 pdf() 에 의해 생성 된 그래프의 모양이 시스템 종속임을 의미합니다. 불행히도 시스템에 선언 된 글꼴이 없다면 텍스트를 전혀 볼 수 없을 수도 있습니다.
이에 비해 ShowText 패키지는 텍스트를 색상으로 채워진 다각형 윤곽선 (벡터 그래픽) 또는 래스터 이미지 (비트 맵 및 스크린 그래픽의 경우)로 변환 하여이 문제를 해결하려고 시도하여 모든 플랫폼에서 동일한 모양을 갖습니다. 이 그래프를 보는 사람들은 그래프를 생성하는 글꼴을 설치할 필요가 없습니다. 그래프 메이커와 그래프 시청자 모두에게 편의성을 제공합니다.
더 중요한 것은 ShowText가 System Font 파일을 사용할 수 있으므로 Freetype에서 지원되는 한 좋아하는 글꼴면으로 그래프에 텍스트를 표시 할 수 있습니다. 아래 로딩 글꼴 섹션을 참조하십시오.
지정된 글꼴을 사용하여 그래프를 만들려면 다음을 수행합니다.
(*)로 표시된 단계 만 새롭습니다. 전 세계적으로 ShowText를 사용하려면 showtext_auto() 함수를 한 번 호출 한 다음 그 후 모든 장치는 자동으로 ShowText를 사용하여 시작의 예에서 표시됩니다.
코드의 어느 부분이 showtext를 사용해야하는지 더 미세한 제어하려면 showtext_begin() 및 showtext_end() 기능이 도움이됩니다. 이 통화 쌍으로 둘러싸인 기능 만 플롯팅하면 Showtext가 사용되지 않으며 다른 통화는 그렇지 않습니다. 예를 들어, 제목 글꼴 만 변경하려면 다음을 수행 할 수 있습니다.
library( showtext )
font_add_google( " Schoolbell " , " bell " )
# # By default the automatic call of showtext is disabled
# # You can manually turn it off using the line below
# # showtext_auto(enable = FALSE)
# # To use showtext_begin() and showtext_end() you need to
# # explicitly open a graphics device
png( " demo.png " , 700 , 600 , res = 96 )
set.seed( 123 )
x = rnorm( 10 )
y = 1 + x + rnorm( 10 , sd = 0.2 )
y [ 1 ] = 5
mod = lm( y ~ x )
op = par( cex.lab = 1.5 , cex.axis = 1.5 , cex.main = 2 )
plot( x , y , pch = 16 , col = " steelblue " ,
xlab = " X variable " , ylab = " Y variable " )
grid()
# # Use showtext only for this part
showtext_begin()
title( " Draw Plots Before You Fit A Regression " , family = " bell " )
showtext_end()
text( - 0.5 , 4.5 , " This is the outlier " , cex = 2 , col = " steelblue " )
abline(coef( mod ))
abline( 1 , 1 , col = " red " )
text( 1 , 1 , expression(paste( " True model: " , y == x + 1 )),
cex = 1.5 , col = " red " , srt = 20 )
text( 0 , 2 , expression(paste( " OLS: " , hat( y ) == 0.79 * x + 1.49 )),
cex = 1.5 , srt = 15 )
legend( " topright " , legend = c( " Truth " , " OLS " ), col = c( " red " , " black " ), lty = 1 )
par( op )
dev.off()글꼴 로딩은 실제로 패키지 Sysfonts 에 의해 수행됩니다.
글꼴을 showtext 에로드하는 쉬운 방법은 font_add(family, regular) 호출하는 것입니다. 여기서 family 해당 글꼴에 할당 한 이름입니다 (나중에이 글꼴을 플로팅에서 사용할 수 있도록 par(family = ...) 를 호출 할 수 있습니다). regular 글꼴 파일의 경로입니다. 즉, "글꼴 이름"만 아는 것만으로는 충분하지 않습니다. 일반적으로 시스템 의존적이기 때문입니다. 반대로 글꼴 파일은 실제로 문자 Glyphs를 제공하는 엔티티입니다.
일반적으로 글꼴 파일은 시스템의 일부 "표준"디렉토리에 있습니다 (예 : Windows는 일반적으로 C:WindowsFonts )입니다. font_paths() 사용하여 현재 검색 경로를 확인하거나 새 검색 경로를 추가하고 font_files() 사용하여 검색 경로에 사용 가능한 글꼴 파일을 나열 할 수 있습니다. font_files() 에는 다른 유용한 정보 (예 : 글꼴을 지정하는 데 사용하는 가족 이름과 다른 변형에 대한 글꼴면도 나열합니다. 아래는 내 컴퓨터의 결과를 보여주는 예입니다.
head(font_files())
# # path file family
# # 1 ***/.local/share/fonts Flavors-Regular.ttf Flavors
# # 2 ***/.local/share/fonts FrederickatheGreat-Regular.ttf Fredericka the Great
# # 3 ***/.local/share/fonts GandhiSerif-Bold.otf Gandhi Serif
# # 4 ***/.local/share/fonts GandhiSerif-BoldItalic.otf Gandhi Serif
# # 5 ***/.local/share/fonts GandhiSerif-Italic.otf Gandhi Serif
# # 6 ***/.local/share/fonts GandhiSerif-Regular.otf Gandhi Serif
# #
# # face version ps_name
# # 1 Regular Version 1.001 Flavors-Regular
# # 2 Regular Version 1.001 FrederickatheGreat-Regular
# # 3 Bold Version 1.001 GandhiSerif-Bold
# # 4 Bold Italic Version 1.001 GandhiSerif-BoldItalic
# # 5 Italic Version 1.001 GandhiSerif-Italic
# # 6 Regular Version 1.001 GandhiSerif-Regular아래 코드는 Windows에서 시스템 글꼴을로드하고 사용하는 방법을 보여줍니다.
library( showtext )
# # Add fonts that are available on Windows
font_add( " heiti " , " simhei.ttf " )
font_add( " constan " , " constan.ttf " , italic = " constani.ttf " )
library( ggplot2 )
p = ggplot( NULL , aes( x = 1 , y = 1 )) + ylim( 0.8 , 1.2 ) +
theme( axis.title = element_blank(), axis.ticks = element_blank(),
axis.text = element_blank()) +
annotate( " text " , 1 , 1.1 , family = " heiti " , size = 15 ,
label = " u 4F60 u 597D u FF0C u 4E16 u 754C " ) +
annotate( " text " , 1 , 0.9 , label = ' Chinese for "Hello, world!" ' ,
family = " constan " , fontface = " italic " , size = 12 )
# # Automatically use showtext for new devices
showtext_auto()
# # On-screen device
x11()
print( p )
dev.off()
# # PDF device
pdf( " showtext-example-3.pdf " , 7 , 4 )
print( p )
dev.off()
# # PNG device
ggsave( " showtext-example-4.png " , width = 7 , height = 4 , dpi = 96 )
# # Turn off if no longer needed
showtext_auto( FALSE ) 다른 OS의 경우 simhei.ttf 글꼴 파일이 없지만 다른 것을 사용하는 데 어려움이 없습니다. 현재 font_add() truetype fonts (*. ttf/*. ttc) 및 OpenType Fonts (*. OTF)를 지원하며 Freetype가 지원하는 한 새 글꼴 유형을 추가하는 것이 사소합니다.
또한 웹에는 무료 글꼴이 많이 있으며, 예를 들어 Google Fonts Project (https://fonts.google.com/)가 있습니다. Sysfonts는 아래의 예에서 볼 수 있듯이 font_add_google() 함수를 통해 해당 글꼴을 자동으로 다운로드하고 등록하는 인터페이스를 제공합니다.
library( showtext )
font_add_google( " Lobster " , " lobster " )
showtext_auto()
plot( 1 , pch = 16 , cex = 3 )
text( 1 , 1.1 , " A fancy dot " , family = " lobster " , col = " steelblue " , cex = 3 ) Showtext 에는 오픈 소스 CJK (중국어, 일본 및 한국) 글꼴 Wenquanyi Micro Hei가 포함됩니다. 그래프에 CJK 텍스트를 표시하려면 기능을 플로팅하여 wqy-microhei 패밀리 이름을 지정하십시오.
또 다른 옵션은 다음 코드를 사용하여 소스 Han Sans/Serif 글꼴을 로컬로 설치하는 것입니다.
library( showtext )
font_install(source_han_serif())
font_families()
# # [1] "sans" "serif" "mono" "wqy-microhei"
# # [5] "source-han-serif-cn" 자세한 내용은 ?font_install 및 ?source_han 참조하십시오.
r의 모든 그래픽 장치는 특정 그래픽 요소와 같은 일부 기능 (예 : path() 및 polygon() 을 그릴 수있는 일부 path() 을 구현합니다. Polygons, raster() text() )를 그리며 텍스트를 표시하기위한 래스터 textUTF8() raster() 를 표시하기위한 텍스트 등을 표시합니다. showtext 자신 의 텍스트 렌더링 기능을 대체하는 것입니다. 글리프.
이 동작은 showtext_begin() 호출 할 때만 수행되며 원래 장치 기능을 다시 복원하기 위해 showtext_end() 호출하는 경우 그래픽 장치를 수정하지 않습니다.
버전 0.9부터 Showtext는 Rstudio 그래픽 장치 (Rstudiogd)와 잘 어울릴 수 있습니다. Rstudio 세션에서 showtext_auto() 호출하면 플롯이 올바르게 표시됩니다.