Ggplot2 में फोंट बदलना


97

एक बार मैंने इसे बदलने के लिए ggplot2उपयोग करके अपने फ़ॉन्ट windowsFonts(Times=windowsFont("TT Times New Roman"))को बदल दिया। अब मैं इसे इससे दूर नहीं कर सकता।

सेट करने की कोशिश में family=""में ggplot2 theme()मैं फोंट में बदलाव उत्पन्न करने के लिए के रूप में मैं अलग फ़ॉन्ट परिवारों के साथ नीचे मेगावाट संकलन नहीं कर पा रहे।

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
        ggtitle("Fuel Efficiency of 32 Cars") +
        xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
        theme(text=element_text(size=16, 
#       family="Comic Sans MS"))
#       family="CM Roman"))
#       family="TT Times New Roman"))
#       family="Sans"))
        family="Serif"))


print(a)
print("Graph should have refreshed")

R एक चेतावनी लौटा रहा है font family not found in Windows font database, लेकिन एक ट्यूटोरियल था जिसका मैं अनुसरण कर रहा था (यदि मैं इसे फिर से पा सकता हूं तो मैं यहां लिंक को अपडेट करूंगा) ने कहा कि यह सामान्य था और समस्या नहीं थी। इसके अलावा, किसी तरह यह एक बिंदु पर काम करता है क्योंकि मेरे ग्राफ ने एक बार कुछ एरियल या हेलविटिका टाइप फ़ॉन्ट का उपयोग किया था। मुझे लगता है कि शुरुआती समय के प्रवास के दौरान भी यह हमेशा एक चेतावनी रही है।

अपडेट करें

जब मैं windowsFonts()अपना आउटपुट चलाता हूं तो

$ सेरिफ़ [1] "टीटी टाइम्स न्यू रोमन"

$ sans [1] "टीटी एरियल"

$ मोनो [1] "टीटी कूरियर न्यू"

लेकिन, यह मेरे भागने के बाद है font_import()इसलिए मैं केवल यह निष्कर्ष निकाल सकता हूं कि मेरे फोंट सही जगह पर नहीं बचाए जा रहे हैं। font_import()अनुरोध को चलाने वाला कोड वास्तव में पुस्तकालयों को लोड करता है:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))

2
क्या यह एक विंडोज़-विशिष्ट प्रश्न और उत्तर है? क्या कोई लिनक्स में सामान्यीकरण करना चाहता है?
मुस्कान

2
इसके अलावा, windowsFonts3.4.1 के बाद grDevices से गायब हो गया । यहां कोड को अपडेट करने की आवश्यकता है।
sms

1
@smci: यह और यह देखें । आपको बस लिनक्स में सही रास्ता निर्दिष्ट करने की आवश्यकता है
Tung

जवाबों:


129

आपको लगता है कि मुझे लगता है कि मैं एक शुरुआती कदम से चूक गया।

आप देख सकते हैं कि आपके पास कमांड के साथ कौन से फोंट उपलब्ध हैं windowsFonts()। उदाहरण के लिए मेरा ऐसा दिखता है जब मैंने इसे देखना शुरू किया:

> windowsFonts()
$serif
[1] "TT Times New Roman"

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

पैकेज को अतिरिक्त बनाने के बाद और font_importइस तरह से चल रहा है (यह 5 मिनट की तरह लगता है):

library(extrafont)
font_import()
loadfonts(device = "win")

मेरे पास बहुत अधिक उपलब्ध थे - यकीनन बहुत सारे, निश्चित रूप से बहुत से लोग यहाँ सूचीबद्ध करने के लिए।

फिर मैंने आपका कोड आज़माया:

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text=element_text(size=16,  family="Comic Sans MS"))
print(a)

यह उपज:

यहाँ छवि विवरण दर्ज करें

अपडेट करें:

आप निम्न कोड स्निपेट के familyपैरामीटर के लिए आवश्यक फ़ॉन्ट का नाम पा सकते हैं element_text:

> names(wf[wf=="TT Times New Roman"])
[1] "serif"

और तब:

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text=element_text(size=16,  family="serif"))
print(a)

पैदावार: यहाँ छवि विवरण दर्ज करें


मदद के लिए धन्यवाद, वहाँ आधा रास्ता। मैं अब बीच में टॉगल कर सकता हूं mono||sans(ये अब तक अलग नहीं दिखते हैं) और serif``, but not the actually name like "टीटी टाइम्स न्यू रोमन" , but additionally, I not sure that my लोडफोंट्स 'सफल रहा। जब मैं कॉल करता fonts()हूं तो मेरे पास लगभग 300 फोंट की एक सूची होती है, लेकिन मेरा अनुमान है कि वे स्थानीय वातावरण में स्थापित नहीं थे, जो उन्हें विंडोज़ डिवाइस के लिए सुलभ बनाता है। मुझे यकीन नहीं है कि अगर इसका कोई मतलब है, लेकिन मैंने स्निपेट के साथ अपने मूल प्रश्न को अपडेट प्रदान करने की कोशिश की जो मदद कर सकता है। एक बार फिर धन्यवाद!
इंगबर्ड

उस स्निपेट अपडेट के नाम के लिए धन्यवाद, यह बहुत उपयोगी लगता है, कि आपके कॉमिक सैंस मिस उदाहरण ने सही उपस्थिति कैसे उत्पन्न की अगर परिवार एकमात्र स्ट्रिंग है जो मेरी स्थापना को पहचानती है।
EngBIRD

भाग्य। उस फ़ॉन्ट में (और बहुत सारे लोगों में), परिवार का नाम परिवार के मूल्य के समान है। तो wf[which(wf=="Comic Sans MS")]पैदावार$``Comic Sans MS`` [1] "Comic Sans MS"
माइक वाइज

धन्यवाद, क्या आप जानते हैं कि किसी विशेष स्थान से फोंट को निर्देशित करना या लोड करना संभव है? यानी लोड फोंट की स्थापना या फोंट निर्दिष्ट करने के लिए भी? सारांश प्रदर्शन कॉल को दोहराते समय मुझे अतिरिक्त विंडोज़ दृश्यमान फोंट नहीं मिलते ...
EngBIRD

क्या आपने एक दूसरे के बाद font_import और loadfonts () चलायी?
माइक वाइज

43

एक अन्य विकल्प showtextपैकेज का उपयोग करना है जो अधिक प्रकार के फोंट (ट्रू टाइप, ओपन टाइप, टाइप 1, वेब फोंट, आदि) और अधिक ग्राफिक्स उपकरणों का समर्थन करता है, और भूत सॉफ्टवेयर जैसे बाहरी सॉफ़्टवेयर का उपयोग करने से बचता है।

# install.packages('showtext', dependencies = TRUE)
library(showtext)

कुछ Google फ़ॉन्ट्स आयात करें

# https://fonts.google.com/featured/Superfamilies
font_add_google("Montserrat", "Montserrat")
font_add_google("Roboto", "Roboto")

वर्तमान खोज पथ से फ़ॉन्ट लोड करें showtext

# Check the current search path for fonts
font_paths()    
#> [1] "C:\\Windows\\Fonts"

# List available font files in the search path
font_files()    
#>   [1] "AcadEref.ttf"                                
#>   [2] "AGENCYB.TTF"                           
#> [428] "pala.ttf"                                    
#> [429] "palab.ttf"                                   
#> [430] "palabi.ttf"                                  
#> [431] "palai.ttf"

# syntax: font_add(family = "<family_name>", regular = "/path/to/font/file")
font_add("Palatino", "pala.ttf")

font_families()
#> [1] "sans"         "serif"        "mono"         "wqy-microhei"
#> [5] "Montserrat"   "Roboto"       "Palatino"

## automatically use showtext for new devices
showtext_auto() 

प्लॉट: विंडोज ग्राफिक्स डिवाइस को खोलने की जरूरत है क्योंकि showtextRStudio अंतर्निहित ग्राफिक्स डिवाइस के साथ अच्छी तरह से काम नहीं करता है

# https://github.com/yixuan/showtext/issues/7
# https://journal.r-project.org/archive/2015-1/qiu.pdf
# `x11()` on Linux, or `quartz()` on Mac OS
windows()

myFont1 <- "Montserrat"
myFont2 <- "Roboto"
myFont3 <- "Palatino"

library(ggplot2)

a <- ggplot(mtcars, aes(x = wt, y = mpg)) + 
  geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text = element_text(size = 16, family = myFont1)) +
  annotate("text", 4, 30, label = 'Palatino Linotype',
           family = myFont3, size = 10) +
  annotate("text", 1, 11, label = 'Roboto', hjust = 0,
           family = myFont2, size = 10) 

## On-screen device
print(a) 

## Save to PNG 
ggsave("plot_showtext.png", plot = a, 
       type = 'cairo',
       width = 6, height = 6, dpi = 150)  

## Save to PDF
ggsave("plot_showtext.pdf", plot = a, 
       device = cairo_pdf,
       width = 6, height = 6, dpi = 150)  

## turn showtext off if no longer needed
showtext_auto(FALSE) 

संपादित करें : showtextRStudio में उपयोग करने के लिए एक और समाधान । R सत्र ( स्रोत ) की शुरुआत में निम्नलिखित कोड चलाएँ

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)

संपादन 2 : संस्करण 0.9 से शुरू होकर, शोस्टेक्स RStudio ग्राफिक्स डिवाइस (RStudioGD) के साथ अच्छी तरह से काम कर सकता है। बस showtext_auto()RStudio सत्र में कॉल करें और फिर भूखंडों को सही ढंग से प्रदर्शित किया जाएगा।


1
धन्यवाद, मैं इसे आज़माने के लिए तत्पर हूं!
EngBIRD

1
धन्यवाद एक हजार बार ... पैकेज यह सुपर आसान बना देता है) सत्यापित करें कि आपने फ़ॉन्ट परिवारों को फ़ॉन्ट_फैमिली () द्वारा ख के लिए क्या उपलब्ध कराया है। font_add (परिवार, font_file_name) द्वारा एक फ़ॉन्ट परिवार के रूप में। बहुत बढ़िया!!!
Agile बीन

@AgileBean: खुशी है कि मैं मदद कर सकता हूं :)
तुंग

1
महत्वपूर्ण: आप सभी को पहले xquartz.org से XQuartz पैकेज स्थापित करना होगा , या लाइब्रेरी लोड करने की कोशिश करने पर आपको एक गैर- विवरणी त्रुटि मिलेगी।
ivoवू वेल्च

यह समाधान मेरे लिए काम नहीं करता है। मुझे अभी भी डिफ़ॉल्ट फ़ॉन्ट मिलता है, दोनों खिड़की और Rstudio की साजिश खिड़की में।
ग्रीनमैनएक्सवाई

11

एक सरल उत्तर यदि आप कुछ नया स्थापित नहीं करना चाहते हैं

अपने प्लॉट में सभी फॉन्ट बदलने के लिए आपका चुना हुआ फॉन्ट plot + theme(text=element_text(family="mono"))कहां monoहै।

डिफ़ॉल्ट फ़ॉन्ट विकल्पों की सूची:

  • मोनो
  • बिना
  • सेरिफ़
  • संदेशवाहक
  • Helvetica
  • बार
  • एवांटगार्डे
  • बूकमेन
  • Helvetica-संकीर्ण
  • NewCenturySchoolbook
  • Palatino
  • URWGothic
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R के पास शानदार फॉन्ट कवरेज नहीं है और, जैसा कि माइक वाइज बताता है, R सामान्य फोंट के लिए विभिन्न नामों का उपयोग करता है।

यह पृष्ठ डिफ़ॉल्ट फोंट के माध्यम से विस्तार से जाता है।


4

पार्टी के लिए देर से, लेकिन यह shinyapps.io पर ggplotsएक shinyऐप के अंदर कस्टम फोंट जोड़ने के लिए देख रहे लोगों के लिए ब्याज की हो सकती है ।

आप ऐसा कर सकते हैं:

  1. में रखें कस्टम फ़ॉन्ट wwwनिर्देशिका: जैसे IndieFlower.ttfसे यहाँ
  2. यहां से चरणों का पालन करें

यह app.Rफ़ाइल के अंदर निम्न ऊपरी अनुभाग की ओर जाता है :

dir.create('~/.fonts')
file.copy("www/IndieFlower.ttf", "~/.fonts")
system('fc-cache -f ~/.fonts')

एक पूर्ण उदाहरण ऐप यहां पाया जा सकता है


3

Ggplot2 भूखंडों के लिए विश्व स्तर पर फ़ॉन्ट बदलने के लिए।

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.