溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

R語言的showtext怎么使用

發(fā)布時間:2022-03-25 15:48:09 來源:億速云 閱讀:1003 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“R語言的showtext怎么使用”,在日常操作中,相信很多人在R語言的showtext怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”R語言的showtext怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

使用字體

圖片無法顯示中文,究其原因,是R的很多圖形設備只能使用一些標準的字體,但它們往往不包含中文的字符。而包含中文的字體,如Windows自帶的宋體、黑體等,R又不知道如何使用它們。于是這就成了一個死循環(huán):我們有中文字體吧,R不會用;R能用的字體吧,我們又看不上——所以說R和useR都不好伺候……

不過現(xiàn)在情況有了一定的改善,我們有了sysfonts這個包,專門用來加載系統(tǒng)里的字體文件,其中主要一個函數(shù)是font.add(),用法為

font.add(family, regular, ...)

其中family是你給這個字體賦予的名稱,在后面的繪圖命令中你將通過它來引用這個字體。regular是字體文件的路徑,如果字體在系統(tǒng)的標準位置(例如Windows的C:\Windows\Fonts)或是當前的工作目錄,則可以直接輸入文件名。例如,在Windows系統(tǒng)下,以下命令將導入系統(tǒng)中的楷體文件,并給它取名為“kaishu”:

font.add("kaishu", "simkai.ttf")

添加完字體之后,可以使用font.families()函數(shù)來查看當前可用的字體名稱,不出意外的話現(xiàn)在應該包含四種字體:sans,serif,mono和kaishu。其中前三個是sysfonts包自動加載的,而kaishu則是我們剛才添加進去的。

字體的加載過程完畢,接下來就是如何使用它們了。當然了,R本身是不認識這些字體的,我們需要使用showtext附加包來真正利用這些字體繪圖。

showtext的用法更加簡單,目前只有兩個函數(shù):showtext.begin()showtext.end()。我們需要做的就是把繪圖的命令包含在這兩個語句中間,然后在適當?shù)牡胤竭x取字體即可。不多說,直接上代碼:

# 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 = ...即可。代碼中的wqyshowtext包自帶的文泉驛微米黑字體,可以顯示絕大多數(shù)的漢字,所以即使你的系統(tǒng)中沒有中文字體,也可以用它來繪制帶中文的圖形。

上面的小程序會在圖形中隨機顯示一些漢字,效果如下圖:

R語言的showtext怎么使用

圖1:隨機顯示漢字

(我賭兩塊糖,你不認識上面一半以上的漢字……)

好玩的字體

有了上面介紹的showtext包,你基本上可以使用任何一種字體來顯示文字了。這時候我們可以做一些有意思的事情:有些字體中包含的并不是字母和數(shù)字,而是一些符號或圖標。例如這個WM People 1字體,其中字母p和字母u分別是男人和女人的圖案,利用這一點我們可以繪制出下面這幅圖:

R語言的showtext怎么使用

其實這幅圖本質(zhì)上就是一個堆疊的條形圖,但這樣畫出來之后,可以很直觀地體現(xiàn)出各個類別的人數(shù)和性別比例,而且圖形本身就已經(jīng)有解釋性,不需要再額外添加圖例等元素。

繪制這幅圖的代碼為:

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("人數(shù)(千萬)") +
    scale_y_discrete("受教育程度",
        labels = unique(dat$edu[order(dat$educode)])) +
    scale_colour_hue(guide = FALSE) +
    ggtitle("2012年人口統(tǒng)計數(shù)據(jù)");
showtext.end();
dev.off();

其實,圖中的每一個小人都是一個p或者u的字符,只是因為在這種字體下,它們顯示出不一樣的圖案罷了。

好玩的圖形

更進一步,如果坐標軸也用不一樣的字體來展現(xiàn)呢?結果當然是,被!玩!壞!了!!

不過真的很貼切有木有!!小學的時候各種玩具槍!初中的時候哈哈哈笑個不停!高中的時候多么正經(jīng)的好少年!去念大學之后就成了那副熊樣了不是嗎!?。ㄕ垷o視此刻暴走的作者)

不過這種思路確實很贊,試想一下,如果我們把一些枯燥的坐標軸說明文字變成了更形象的圖案,那么整幅圖的表現(xiàn)力是不是就更強了呢?像是下面這樣:

R語言的showtext怎么使用

附上相應的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怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI