使用ggplot2進行高級繪圖--修改 ggplot2 圖形的外觀
1 坐標軸
ggplot2包會在創建圖時自動創建刻度線、刻度標記標簽和坐標軸標簽。它們往往看起來不錯,但是有時我們需要在更大程度上控制它們的外觀。我們已經知道了如何通過labs()函數來添加標題並改變坐標軸標簽。那么如何自定義軸標簽?下表包含了用於自定義坐標軸的函數。
控制坐標軸和刻度線外觀的函數
可以看到,ggplot2的函數區分x軸和y軸,以及軸線是否代表一個連續或離散變量(因子)。
將這些函數應用到一個分組箱線圖中,其中包含按學術等級和性別分組的薪資水平,代碼如下:
data(Salaries,package="car")
library(ggplot2)
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Sex", x="", y="")
結果分析:很明顯,平均收入隨着學術排名的上升而上升,在每個學術等級中男性的薪資水平高於女性。
2 圖例
圖例是指出如何用顏色、形狀、尺寸等視覺特性表示數據特征的指南。ggplot2包能自動生成圖例,而且在很多時候能夠滿足我們的需求;但是在其他時候,我們可能要對其進行自定義。標題和位置是最常用的定制特征。
標題的位置由theme()函數中的legend.position選項控制。可能的值包括"left"、"top"、"right"(默認值)和"bottom"。我們也可以在圖中給定的位置指定一個二元素向量。
調整上圖中的圖形,使圖例出現在左上角並且將標題從sex變為Gender。可以通過下面的代碼來完成這個任務:
data(Salaries,package="car")
library(ggplot2)
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Gender",
x="", y="", fill="Gender") +
theme(legend.position=c(.1,.8))
結果分析:圖例的左上角是分別距離左側邊緣10%和底部邊緣80%的部分。如果想刪除圖例,可以使用legend.position="none"。
3 標尺
ggplot2包使用標尺把數據空間的觀察值映射到可視化的空間中。標尺既可以應用到連續的變量,也可以應用到離散的變量。
一個連續性的標尺把yrs.since.phd變量的數值映射到x軸,同時將salary的變量映射到y軸。
連續型的標尺可以映射數值型的變量到圖的其他特征。代碼如下:
ggplot(mtcars, aes(x=wt, y=mpg, size=disp)) +
geom_point(shape=21, color="black", fill="cornsilk") +
labs(x="Weight", y="Miles Per Gallon",
title="Bubble Chart", size="Engine\nDisplacement")
結果分析:按里程划分的汽車重量的氣泡圖。點的大小代表發動機排量,aes()函數的參數size=disp生成連續型變量disp(發動機排量)的標尺,並使用它來控制點的尺寸。結果如圖所示的氣泡圖。從該圖中可以看出汽車里程隨重量和發動機排量的降低而降低。
在這個離散的例子中,可以使用標尺將帶有因子水平的視覺線索(如顏色、形狀、線條類型、尺寸和透明度)關聯起來。下列代碼:
data(Salaries, package="car")
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
scale_color_manual(values=c("orange", "olivedrab", "navy")) +
geom_point(size=2)
結果分析:使用scale_color_manual()函數來設定三個學術等級的點的顏色,可以看到,隨着教齡的增大,大部分教授的薪水時越來越多的。
4 主題
theme()函數中的選項可以讓我們調整字體、背景、顏色和網格線等。主題可以使用一次,也可以保存起來應用到多個圖中。運行下面的代碼:
data(Salaries, package="car")
library(ggplot2)
mytheme <- theme(plot.title=element_text(face="bold.italic",
size="14", color="brown"),
axis.title=element_text(face="bold.italic",
size=10, color="brown"),
axis.text=element_text(face="bold", size=9,
color="darkblue"),
panel.background=element_rect(fill="white",
color="darkblue"),
panel.grid.major.y=element_line(color="grey",
linetype=1),
panel.grid.minor.y=element_line(color="grey",
linetype=2),
panel.grid.minor.x=element_blank(),
legend.position="top")
ggplot(Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Salary by Rank and Sex", x="Rank", y="Salary") +
mytheme
結果分析:主題mytheme指定了圖的標題應該為粗斜體的棕色14號字。軸的標題為粗斜體的棕色10號字。坐標軸標簽應為加粗的深藍色9號字。畫圖區域有白色的填充和深藍色的邊框。主水平網格應該是灰色的實線,次水平網格應該是灰色的虛線;垂直網格不輸出;圖例展示在圖的頂部。
5 多重圖
將多個ggplot2包的圖形放到單個圖形中最簡單的方式是使用gridExtra包中的grid.arrange()函數。們創建三個ggplot2圖並把它們放在單個圖形中。下面給出相關的代碼:
data(Salaries, package="car")
library(ggplot2)
p1 <- ggplot(data=Salaries, aes(x=rank)) + geom_bar()
p2 <- ggplot(data=Salaries, aes(x=sex)) + geom_bar()
p3 <- ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) + geom_point()
library(gridExtra)
grid.arrange(p1, p2, p3, ncol=3)
6 保存圖形
ggsave()函數能更方便地保存它。它的選項包括保存哪幅圖形,保存在哪里和以什么形式保存。例如:
myplot <- ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
ggsave(file="mygraph.png", plot=myplot, width=5, height=4)
在當前路徑下將myplot保存為名為mygraph.png的5英寸×4英寸(12.7厘米×10.2厘米)PNG格式的圖片。
如果忽略plot=選項,最近創建的圖形會被保存。代碼:
ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
ggsave(file="mygraph.pdf")
是有效的,並把圖形保存到磁盤。