Zhen Zhang's Blog

Mac上R作图中文字体的处理

这几天在学习R绘制中国地图以供数据分析之用,然而Mac上R作图的默认设备是Quartz,如果不进行中文字体的设置,是无法出现中文汉字的,会出现诸如框框的情况。为此,我查询了一些资料,主要参考两篇文章,讲了如何进行字体的设置。我把他们列在了最后的参考文献中。

Mac上字体的查看

Mac上安装了一些中文字体,包括: “STFangsong”, “STHeiti”, “STKaiti”, “STSong”等。他们可以通过Font Book查看。

fontBook

在本文中,我主要使用”STKaiti”。

普通作图函数的设置

有如下三种方式:

  1. 在打开Quartz的时候指定:

    1
    quartz(family='STKaiti')
  2. 在作图之前指定全局作图参数:

    1
    par(family="STKaiti")
  3. 在每次作图的时候指定。

    这里我将会用我在学习画中国地图的时候遇到的实例来说明,包括下面对于ggplot的设置也是如此。

    1
    2
    3
    plot(mydat, ylim = c(18, 54), panel.first = grid()) # I have already read the map data as mydat
    points(city$Jd, city$Wd, pch = 19, col = rgb(0, 0, 0, 0.5))
    pointLabel(city$Jd, city$Wd, labels = city[,1], cex = 0.5) # pointLabel is a function in the package of maptool. It facilitate us to add the label in the best position. For more information, please refer to that package

    这里没有设定参数,所以作出来的图有框框。

    plotCHN1

    正确的作图命令应该把上述代码的最后一行替换为:

    1
    pointLabel(city$Jd,city$Wd,labels = city[,1], cex = 0.5, family = "STKaiti")

    这里在添加中文字符的地方指定了family = "STKaiti"

    plotCHN2

ggplot中文字体的设置

在ggplot中,上面所讲述的方法都不适用,这是因为ggplot有自己的作图方式。有些网站(比如下文的参考文献1)所讲的theme_text(family='STKaiti')也不可以,这是因为ggplot最新版对其进行了改动。具体的配置请看下文:

  1. 如果是加入的label之类的,可以直接在相应的函数中加入family = "STKaiti"

    1
    ggplot(zhejiang,aes(x=long,y=lat,group=id,fill="beige")) + geom_polygon(fill="beige") + geom_path(color="grey40") + geom_point(x=120.12,y=30.16,fill=NA) + annotate("text",x=120.3,y=30,label="杭州市" ,family="STKaiti") # Here I am drawing the map of Zhejiang Province

    ggplotCHN1

  2. 如果需要改变全局变量,比如下文演示的图例(注:这里由于没有调整大小,图例没有显示全),则需要加入图层theme(text=element_text(family="STKaiti"))

    1
    ggplot(z, aes(x = long, y = lat, group = group,fill=NAME)) + geom_polygon( ) + geom_path(colour = "grey40") + coord_map() + theme(text=element_text(family="STKaiti")) # z is the data frame I use. If you want to see more information, please see my next blog, talking about how to draw map in R.

    ggplotCHN2

References

  1. 关于Mac OS X中R作图的字体

  2. R绘图中文问题