يجعل ShowText من السهل استخدام أنواع مختلفة من الخطوط (truetype ، opentype ، النوع 1 ، خطوط الويب ، إلخ) في مؤامرات r. الدافع لتطوير هذه الحزمة هو أن استخدام الخطوط غير القياسية في قطع R (خاصة بالنسبة لجهاز PDF) ليس واضحًا ، على سبيل المثال ، عند إنشاء PDF مع الأحرف الصينية. هذا لأن معظم الخطوط القياسية المستخدمة من قبل pdf() لا تحتوي على حروف رسومية صينية ، ولا يمكن للمستخدمين استخدام خطوط النظام في R.
تعد الحزمة Extrafont التي طورتها Winston Chang إحدى الحلول لهذه المشكلة ، والتي تركز بشكل أساسي على استخدام خطوط TrueType ( .ttf ) في جهاز رسومات PDF. الآن يمكن لـ 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 ، ثم أخبرنا بتقديم النص باستخدام SHOWTEXT من خلال استدعاء وظيفة showtext_auto() . كل الجزء المتبقي هو بالضبط نفس أوامر التخطيط المعتادة.
يجب أن يعمل هذا المثال على معظم أجهزة الرسومات ، بما في ذلك أجهزة pdf() و png() و postscript() والأجهزة على الشاشة مثل windows() على Windows و x11() على Linux.
اسمحوا لي أولاً أن أشرح قليلاً كيف يعمل pdf() .
إلى أفضل معرفتي ، لا يصف جهاز PDF الافتراضي في R "النص" ، ولكنه في الواقع "يصف" النص في ملف PDF. وهذا يعني ، بدلاً من رسم الخطوط والمنحنيات الخاصة بـ Glyph الفعلي ، لا يدمج سوى معلومات حول النص ، على سبيل المثال الأحرف التي لديها ، والتي تستخدمها ، إلخ.
ومع ذلك ، يمكن عرض النص الذي يحتوي على خط معلن بشكل مختلف في نظام التشغيل مختلفًا ، مما يعني أن ظهور الرسم البياني الذي تم إنشاؤه بواسطة pdf() يعتمد على النظام. إذا لم يكن لديك للأسف الخط المعلن في نظامك ، فقد لا تتمكن من رؤية النص بشكل صحيح على الإطلاق.
بالمقارنة ، تحاول حزمة ShowText حل هذه المشكلة عن طريق تحويل النص إلى الخطوط العريضة المملوءة بالألوان (لرسومات المتجهات) أو الصور النقطية (للرسومات النقطية والرسومات على الشاشة) ، وبالتالي وجود نفس المظهر تحت جميع الأنظمة الأساسية. الأشخاص الذين يشاهدون هذا الرسم البياني لا يحتاجون إلى تثبيت الخط الذي ينشئ الرسم البياني. يوفر الراحة لكل من صانعي الرسوم البيانية ومشاهدي الرسم البياني.
والأهم من ذلك ، يمكن لـ ShowText استخدام ملفات خطوط النظام ، بحيث يمكنك عرض النص في الرسم البياني مع وجه الخط المفضل لديك ، طالما أنه مدعوم من Freetype. انظر القسم تحميل الخطوط أدناه.
لإنشاء رسم بياني باستخدام خط محدد ، يمكنك ببساطة القيام بما يلي:
فقط الخطوات التي تحمل علامة (*) جديدة. إذا كنت ترغب في استخدام showtext على مستوى العالم ، فيمكنك استدعاء الوظيفة showtext_auto() مرة واحدة ، ثم ستستخدم جميع الأجهزة بعد ذلك تلقائيًا عرض النص ، كما يظهر مثال في البداية.
إذا كنت ترغب في الحصول على تحكم أكثر دقة على أي جزء من الكود يجب أن يستخدم 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 هو المسار إلى ملف الخط. وهذا يعني ، فقط أن معرفة "اسم الخط" لا يكفي ، لأنها عادة ما تعتمد على النظام. على العكس من ذلك ، فإن ملف FONT هو الكيان الذي يوفر فعليًا الرسوم المتحركة للحرف.
عادةً ما توجد ملفات الخط في بعض الدلائل "القياسية" في النظام (على سبيل المثال على 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 ) بالنسبة لنظام التشغيل الآخر ، قد لا يكون لديك ملف خط simhei.ttf ، ولكن لا توجد صعوبة في استخدام شيء آخر. في الوقت الحالي ، يدعم font_add() خطوط truetype (*. TTF/*.
أيضًا ، هناك العديد من الخطوط المجانية المتاحة ويمكن الوصول إليها على الويب ، على سبيل المثال مشروع Fonts Google (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 مفتوح المصدر (الصيني والياباني والكوري) Font Wenquanyi Micro Hei. إذا كنت ترغب فقط في عرض نص CJK في الرسم البياني الخاص بك ، فما عليك سوى تحديد اسم عائلة wqy-microhei في وظائف التخطيط.
هناك خيار آخر هو تثبيت Source Han Sans/Serif Lists محليًا باستخدام الكود التالي:
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 بتنفيذ بعض الوظائف لرسم عناصر رسومية محددة ، على سبيل showtext ، path() و polygon() لرسم المضلعات ، raster() raster() صور نقطية ، text() path() textUTF8() لإظهار النص ، إلخ.
يتم تنفيذ هذا الإجراء فقط عند استدعاء showtext_begin() ولن تقوم بتعديل جهاز الرسومات إذا قمت بالاتصال showtext_end() لاستعادة وظائف الجهاز الأصلية مرة أخرى.
بدءًا من الإصدار 0.9 ، يمكن أن يعمل ShowText بشكل جيد مع جهاز رسومات RSTUDIO (RSTUDIOGD). ما عليك سوى استدعاء showtext_auto() في جلسة rstudio ثم سيتم عرض المؤامرات بشكل صحيح.