朝花夕拾|showtext:字体,好玩的字体和好玩的图形
朝花夕拾
今天为大家带来统计之都编辑部的一个新栏目:朝花夕拾。在统计之都创立之初,主站(cos.name)是我们的大本营,上面活跃着一批高质量高产出的作者。小编近日扒楼,哦不,是浏览主站的历史文章,发现了很多有趣又有用的内容,想和我们的新读者们分享。今后在这个栏目中,小编将会不定时发布文章,并且可能会在文章中随机出现啰嗦两句,来辅助食用。
本期文章
文章名称:《showtext:字体,好玩的字体和好玩的图形》
文章作者:小轩哥
文章时间:2014年1月
本期小编:张心雨
分享理由:小编作为一个本科僧,认为这篇文章提到的画图方法,可以直接用来放在各种社会调查报告里,对,就是样本描述的部分。如本期推送封面图所示,感觉画一个这样的图比放几个数字fancy多了吧...简单炫酷易上手,还不来学习一个?
showtext:字体,好玩的字体和好玩的图形
邱怡轩
统计图形的作用想必不用我多说,一幅美观的图往往能让枯燥的数据变得有趣起来,而R恰巧就是这样一个作图的利器。然而,从论坛上的帖子来看,大家在用R画图时经常会遇到几个终极问题:
中文无法显示
XX类型的图怎么画?
中文无法显示
中文无法显示
中文无法显示
……
第2个问题由于太过终极我还没法回答,所以就先试着解决第1个,第3个,第4个,第5个,第……个问题好了。
(一条来自小编的啰嗦:
中文显示的问题现在也有越来越多的解决方法啦。比如郎大为开发的R包wordcloud2,已经能做出美貌的中文词云啦。想学习一个的,http://cos.name/2016/08/wordcloud2/)
使用字体图片无法显示中文,究其原因,是R的很多图形设备只能使用一些标准的字体,但它们往往不包含中文的字符。而包含中文的字体,如Windows自带的宋体、黑体等,R又不知道如何使用它们。于是这就成了一个死循环:我们有中文字体吧,R不会用;R能用的字体吧,我们又看不上——所以说R和useR都不好伺候……
不过现在情况有了一定的改善,我们有了sysfonts这个包,专门用来加载系统里的字体文件,其中主要一个函数是font.add(),用法为
font.add(family, regular, ...)
其中family是你给这个字体赋予的名称,在后面的绘图命令中你将通过它来引用这个字体。regular是字体文件的路径,如果字体在系统的标准位置(例如Windows的C:WindowsFonts)或是当前的工作目录,则可以直接输入文件名。例如,在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);# 开始使用showtextshowtext.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字体# 停止使用showtextshowtext.end();# 关闭图形设备dev.off();
也就是说,要让R使用我们之前加载的字体,只需要将画图命令包含在一对showtext.begin()和showtext.end()中间,然后在绘图命令中选取family = ...即可。代码中的wqy是showtext包自带的文泉驿微米黑字体,可以显示绝大多数的汉字,所以即使你的系统中没有中文字体,也可以用它来绘制带中文的图形。
上面的小程序会在图形中随机显示一些汉字,效果如下图:
图1:随机显示汉字
(我赌两块糖,你不认识上面一半以上的汉字……)
好玩的字体有了上面介绍的showtext包,你基本上可以使用任何一种字体来显示文字了。这时候我们可以做一些有意思的事情:有些字体中包含的并不是字母和数字,而是一些符号或图标。例如这个WM People 1(http://www.dafont.com/wm-people-1.font)字体,其中字母p和字母u分别是男人和女人的图案,利用这一点我们可以绘制出下面这幅图:
图2:用特殊字体绘图
其实这幅图本质上就是一个堆叠的条形图,但这样画出来之后,可以很直观地体现出各个类别的人数和性别比例,而且图形本身就已经有解释性,不需要再额外添加图例等元素。
绘制这幅图的代码为:
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的字符,只是因为在这种字体下,它们显示出不一样的图案罢了。
好玩的图形更进一步,如果坐标轴也用不一样的字体来展现呢?结果当然是,被!玩!坏!了!!
图3:暴漫版图形(图片来源:http://cos.name/cn/topic/147769 @doctorjxd)
不过真的很贴切有木有!!小学的时候各种玩具枪!初中的时候哈哈哈笑个不停!高中的时候多么正经的好少年!去念大学之后就成了那副熊样了不是吗!!(请无视此刻暴走的作者)
不过这种思路确实很赞,试想一下,如果我们把一些枯燥的坐标轴说明文字变成了更形象的图案,那么整幅图的表现力是不是就更强了呢?像是下面这样:
图4:坐标轴上放置表情
附上相应的R代码:
link = "", 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();
所以,发挥你的想像力,绘制出更形象、更有趣的统计图形吧!
附:相关资源
有趣的字体(http://www.dafont.com/search.php?q=people)
还是有趣的字体(http://www.fontspace.com/category/people)
还还是有趣的字体(http://www.dafont.com/search.php?q=icon)
最后的最后,双11要来啦,小编已经压制不住剁手的洪荒之力了!想知道男女都爱买啥?亚磊顺手爬了淘宝搜索“男”或者“女”的结果, 用letterCloud生成词云,你以为这是用图片做的形状么?实际上也是用了showtext包来实现的特殊字符。有代码有真相,大家慢慢读。(链接: http://yalei.name/2016/06/wordcloud2)
作者:邱怡轩
小编:张心雨
版权公告
原创文章,版权所有。
敬告各位友媒,如需转载,请与统计之都小编联系(直接留言或发至邮箱:editor@cos.name ),获准转载的请在显著位置注明作者和出处(转载自:统计之都),并在文章结尾处附上统计之都二维码。
统计之都:专业、人本、正直的中国统计学门户网站。
关注方式:扫描下图二维码。或查找公众帐号,搜索 统计之都 或 CapStat 即可。
往期推送:进入统计之都会话窗口,点击右上角小人图标,查看历史消息即可。
统计之都欢迎诸位看官积极投稿,投稿信箱contact@cos.name
责任编辑:
相关知识
探索字体设计的奥秘:常用字体设计软件大揭秘
在图片上加字,如何确定该用什么字体字体的颜色和放置的位置?
字体LOGO设计这样点缀,绝了!!
中世纪纹章字体设计论文
花字体大全
花字体下载大全,免费字体、正版字体下载尽在字体家
符号字体/提取转换字体/区块组件字体/501
彼岸花回忆字体下载 Aa花语·彼岸花回忆字体 字体下载
广州兰圃好不好玩
免费字体使用 三极字库免费字体 免费字体使用无版权
网址: 朝花夕拾|showtext:字体,好玩的字体和好玩的图形 https://www.huajiangbk.com/newsview661598.html
上一篇: 什么是印刷? |
下一篇: 数字印刷从门店服务走向工业化生产 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039