第 5 章 整體設計
當基本圖形所要傳達的資訊夠清楚後,我們才會進到最後的調整。
5.1 標題與座標
knitr::opts_chunk$set(fig.showtext=TRUE)
library(showtext)
showtext_auto()
ggplot(mpg)+
geom_point(aes(x=cty,y=hwy,color=class))+
labs(
x="市區每加侖距離",
y="國道每加侖距離",
title="市區與國道燃油效率",
subtitle="單位:每加侖公里數",
caption="資料來源"
)+
theme(text=element_text(size=10, family="wqy-microhei"))
5.2 圖標
圖標在ggplot2裡叫guide可以透過guide()函數去修改,但由於圖標呈現的是aes()對應,所以可以使用scale去修改就好。
請問你如何把上圖圖標改成中文(如下圖)?(可利用scale)[Hint: scale_color_manual裡所有要素都要定義,而scale_color_discrete未定義的會採預設值。]
5.3 主題套用
fig04_ans1 + theme_classic()
xkcd theme
- 先下載xkcd字體
library(extrafont)
download.file("http://simonsoftware.se/other/xkcd.ttf",
dest="xkcd.ttf", mode="wb")
下載後安裝xkcd.tff字型在你的系統,然後執行以下程式引入R
library(showtext)
font_add("xkcd", "xkcd.ttf")
xkcd範例
library(xkcd)
volunteers <- data.frame(year=c(2007:2011),
number=c(56470, 56998, 59686, 61783, 64251))
xrange <- range(volunteers$year)
yrange <- range(volunteers$number)
ratioxy <- diff(xrange) / diff(yrange)
datalines <- data.frame(xbegin=c(2008.3,2010.5),ybegin=c(63000,59600),
xend=c(2008.5,2010.3), yend=c(63400,59000))
mapping <- aes(x, y, scale, ratioxy, angleofspine,
anglerighthumerus, anglelefthumerus,
anglerightradius, angleleftradius,
anglerightleg, angleleftleg, angleofneck)
dataman <- data.frame( x= c(2008,2010), y=c(63000, 58850),
scale = 1000 ,
ratioxy = ratioxy,
angleofspine = -pi/2 ,
anglerighthumerus = c(-pi/6, -pi/6),
anglelefthumerus = c(-pi/2 - pi/6, -pi/2 - pi/6),
anglerightradius = c(pi/5, -pi/5),
angleleftradius = c(pi/5, -pi/5),
angleleftleg = 3*pi/2 + pi / 12 ,
anglerightleg = 3*pi/2 - pi / 12,
angleofneck = runif(1, 3*pi/2-pi/10, 3*pi/2+pi/10))
p <- ggplot() + geom_smooth(mapping=aes(x=year, y =number),
data =volunteers, method="loess") +
xkcdaxis(xrange,yrange) +
ylab("Volunteers at Caritas Spain") +
xkcdman(mapping, dataman) +
annotate("text", x=2008.7, y = 63700,
label = "We Need\nVolunteers!", family="xkcd" ) +
annotate("text", x=2010.5, y = 60000,
label = "Sure\nI can!", family="xkcd" ) +
xkcdline(aes(xbegin=xbegin,ybegin=ybegin,xend=xend,yend=yend),
datalines, xjitteramount = 0.12)
p # Figure 5.a