您好,登錄后才能下訂單哦!
這篇文章主要介紹“R語言的showtext怎么使用”,在日常操作中,相信很多人在R語言的showtext怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”R語言的showtext怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
圖片無法顯示中文,究其原因,是R的很多圖形設備只能使用一些標準的字體,但它們往往不包含中文的字符。而包含中文的字體,如Windows自帶的宋體、黑體等,R又不知道如何使用它們。于是這就成了一個死循環:我們有中文字體吧,R不會用;R能用的字體吧,我們又看不上——所以說R和useR都不好伺候……
不過現在情況有了一定的改善,我們有了sysfonts這個包,專門用來加載系統里的字體文件,其中主要一個函數是font.add()
,用法為
font.add(family, regular, ...)
其中family
是你給這個字體賦予的名稱,在后面的繪圖命令中你將通過它來引用這個字體。regular
是字體文件的路徑,如果字體在系統的標準位置(例如Windows的C:\Windows\Fonts)或是當前的工作目錄,則可以直接輸入文件名。例如,在Windows系統下,以下命令將導入系統中的楷體文件,并給它取名為“kaishu”:
font.add("kaishu", "simkai.ttf")
添加完字體之后,可以使用font.families()
函數來查看當前可用的字體名稱,不出意外的話現在應該包含四種字體:sans,serif,mono和kaishu。其中前三個是sysfonts
包自動加載的,而kaishu則是我們剛才添加進去的。
字體的加載過程完畢,接下來就是如何使用它們了。當然了,R本身是不認識這些字體的,我們需要使用showtext附加包來真正利用這些字體繪圖。
showtext
的用法更加簡單,目前只有兩個函數:showtext.begin()
和showtext.end()
。我們需要做的就是把繪圖的命令包含在這兩個語句中間,然后在適當的地方選取字體即可。不多說,直接上代碼:
# showtext會自動加載sysfonts包 library(showtext); # 導入楷體 font.add("kaishu", "simkai.ttf"); library(Cairo); # 打開圖形設備 CairoPNG("chinese-char.png", 600, 600); # 開始使用showtext showtext.begin(); # 一系列繪圖命令 set.seed(123); plot(1, xlim = c(-3, 3), ylim = c(-3, 3), type = "n"); text(runif(100, -3, 3), runif(100, -3, 3), intToUtf8(round(runif(100, 19968, 40869)), multiple = TRUE), col = rgb(runif(100), runif(100), runif(100), 0.5 + runif(100)/2), cex = 2, family = "kaishu"); # 指定kaishu字體 title("隨機漢字", family = "wqy"); # 指定wqy字體 # 停止使用showtext showtext.end(); # 關閉圖形設備 dev.off();
也就是說,要讓R使用我們之前加載的字體,只需要將畫圖命令包含在一對showtext.begin()
和showtext.end()
中間,然后在繪圖命令中選取family = ...
即可。代碼中的wqy
是showtext
包自帶的文泉驛微米黑字體,可以顯示絕大多數的漢字,所以即使你的系統中沒有中文字體,也可以用它來繪制帶中文的圖形。
上面的小程序會在圖形中隨機顯示一些漢字,效果如下圖:
圖1:隨機顯示漢字
(我賭兩塊糖,你不認識上面一半以上的漢字……)
有了上面介紹的showtext
包,你基本上可以使用任何一種字體來顯示文字了。這時候我們可以做一些有意思的事情:有些字體中包含的并不是字母和數字,而是一些符號或圖標。例如這個WM People 1字體,其中字母p和字母u分別是男人和女人的圖案,利用這一點我們可以繪制出下面這幅圖:
其實這幅圖本質上就是一個堆疊的條形圖,但這樣畫出來之后,可以很直觀地體現出各個類別的人數和性別比例,而且圖形本身就已經有解釋性,不需要再額外添加圖例等元素。
繪制這幅圖的代碼為:
link = "http://img.dafont.com/dl/?f=wm_people_1"; download.file(link, "wmpeople1.zip", mode = "wb"); unzip("wmpeople1.zip"); library(showtext); font.add("wmpeople1", "wmpeople1.TTF"); library(ggplot2); library(plyr); library(Cairo); dat = read.csv(textConnection(' edu,educode,gender,population 未上過學,1,m,17464 未上過學,1,f,41268 小 學,2,m,139378 小 學,2,f,154854 初 中,3,m,236369 初 中,3,f,205537 高 中,4,m,94528 高 中,4,f,70521 大專及以上,5,m,57013 大專及以上,5,f,50334 ')); dat$int = round(dat$population / 10000); gdat = ddply(dat, "educode", function(d) { male = d$int[d$gender == "m"]; female = d$int[d$gender == "f"]; data.frame(gender = c(rep("m", male), rep("f", female)), x = 1:(male + female)); }); gdat$char = ifelse(gdat$gender == "m", "p", "u"); CairoPNG("edu-stat.png", 600, 300); showtext.begin(); theme_set(theme_grey(base_size = 15)); ggplot(gdat, aes(x = x, y = educode)) + geom_text(aes(label = char, colour = gender), family = "wmpeople1", size = 8) + scale_x_continuous("人數(千萬)") + scale_y_discrete("受教育程度", labels = unique(dat$edu[order(dat$educode)])) + scale_colour_hue(guide = FALSE) + ggtitle("2012年人口統計數據"); showtext.end(); dev.off();
其實,圖中的每一個小人都是一個p或者u的字符,只是因為在這種字體下,它們顯示出不一樣的圖案罷了。
更進一步,如果坐標軸也用不一樣的字體來展現呢?結果當然是,被!玩!壞!了!!
不過真的很貼切有木有!!小學的時候各種玩具槍!初中的時候哈哈哈笑個不停!高中的時候多么正經的好少年!去念大學之后就成了那副熊樣了不是嗎!!(請無視此刻暴走的作者)
不過這種思路確實很贊,試想一下,如果我們把一些枯燥的坐標軸說明文字變成了更形象的圖案,那么整幅圖的表現力是不是就更強了呢?像是下面這樣:
附上相應的R代碼:
link = "http://img.dafont.com/dl/?f=emoticons"; download.file(link, "emoticons.zip", mode = "wb"); unzip("emoticons.zip"); library(showtext); font.add("emoticons", "emoticons.ttf"); library(ggplot2); library(Cairo); emotions = c("W", "s", "C", "A", "p"); score = c(0.5, 0.9, 5.5, 18.4, 74.7); x = factor(emotions, emotions); gdat2 = data.frame(x, score); CairoPNG("douban.png", 600, 600); showtext.begin(); ggplot(gdat2, aes(x = x, y = score)) + geom_bar(stat = "identity") + scale_x_discrete("") + scale_y_continuous("百分比") + theme(axis.text.x=element_text(size=rel(4), family="emoticons")) + ggtitle("《神探夏洛克第三季》豆瓣評分"); showtext.end(); dev.off();
到此,關于“R語言的showtext怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。