標度控制着數據到圖形屬性的映射,當有需要時,ggplot2會自動添加一個默認的標度。我們確實可以在不了解標度運行原理的情況下畫出許多圖形,但理解標度並學會如何操縱它們則將賦予我們對圖形更強的控制能力。
每一種圖形屬性都擁有一個默認的標度,此標度將在我們每次使用這個圖形屬性時被自動添加到圖形中,這些標度列於下表中,默認屬性粗體顯示:
圖形屬性 | 離散型 | 連續型 |
顏色和填充色 | brewer grey hue identity manual |
gradient gradient2 gradientn |
位置 | discrete | continuous date |
形狀 | shape identity manual |
|
線條類型 | linetype identity manual |
|
大小 | identity manual |
size |
如果要添加一個不同的標度或修改默認標度的某些特征,我們必須構建一個新的標度,然后使用+將其添加到圖形上。所有的標度構建器(scale)都擁有一套通用的命名方案,它們以scale_開頭,接下來是圖形屬性的名稱(例如:colour_,shape_,或x_)最后以標度的名稱結尾(gradien、hue或manual)。比如scale_x_discrete().離散圖形的顏色屬性的默認標度名為scale_colour_hue(),填充色的Brewer配色標度名為scale_fill_brewer()。
> p <- qplot(sleep_total,sleep_cycle,data=msleep,colour=vore) > p ##默認參數 > p + scale_colour_hue("what does\nit eat?",breaks=c("herbi","carni","omni",NA),labels=c("plants","meats","both","don't know")) ##調整標度的參數
標度詳解,可大致分為幾組:
- 位置標度,用於將連續型、離散型和日期時間型變量映射到繪圖區域,以及構造對應的坐標軸。
- 顏色標度,用於將連續型和離散型變量映射到顏色
- 手動標度,將離散型變量映射到我們選擇的符號大小、線條類型、形狀、或顏色
1.通用參數
以下參數對所有標度都通用:
- name:設置坐標軸或圖例上出現的標簽。可以使用三個輔助函數xlab(),ylab(),labs()可以讓我們減少部門鍵入。
> p <- qplot(cty,hwy,data=mpg,colour=displ) ##默認標度下圖左1 > p > p + scale_x_continuous("City mpg") ##添加x標簽 下圖左2 > p + xlab("City mpg") ##添加x標簽 與上相同 > p + ylab("Highway mpg") ##添加y標簽 > p + labs(x= "City mpg",y = "Hightway mpg",colour = "Displacement") ##添加x、y及colour標度 下圖左3 > p + xlab(expression(frac(miles,gallon))) ##x標度為表達式 下圖右1 >
- limits:固定標度的定義域。連續型標度接受一個長度為2的數值型向量;離散型標度接受一個字符型向量。一旦設定limits,數據將不再進行任何訓練。限制定義域可以幫助我們移除不想在圖形上展示的數據,任何不在此范圍內的數據將會被丟棄。
- breaks和labels:breaks控制着顯示在坐標軸或圖例上的值。labels指定了應在斷點處顯示的標簽,若設定labels,則必須同時指定breaks。
> p <- qplot(cyl,wt,data=mtcars) > p ##圖第一行 (1,1) > p + scale_x_continuous(breaks = c(5.5,6.5)) ##圖第一行 (1,2) > p + scale_x_continuous(limits = c(5.5,6.5)) ##圖第一行 (1,3) > p <- qplot(wt,cyl,data=mtcars,colour=cyl) > p ##圖第二行 (2,1) > p + scale_colour_gradient(breaks=c(5.5,6.5)) ##圖第二行 (2,2) > p + scale_colour_gradient(limits=c(5.5,6.5)) ##圖第三行 (2,3)
上圖中第一列使用的是默認的breaks和limits,即limits=c(4,8)和breaks=4:8。中間一列重新設置了breaks:繪圖區域不變,但刻度和標簽的位置都被移動了。
最右列則重新定義了limits,相當多的數據落在了繪圖區域之外。
2.位置標度
每幅圖都一定擁有兩個位置標度,水平位置和豎直位置。ggplot2提供了連續型、離散型以及日期型標度。
我們可以自行實施變換,比如我們可以直接繪制log10(x),而不去使用scale_x_log10().這兩種做法將在繪圖區域生成完全相同的結果,但是坐標軸和刻度標簽卻是不同的。
> qplot(log10(carat),log10(price),data=diamonds) ##下圖左 > qplot(carat,price,data=diamonds) + scale_x_log10() + scale_y_log10() ##下圖右 >
上面的圖形主體是相同的,但坐標軸上的標簽是不同的。
日期和時間
日期和時間值基本上屬於連續型,但在標注坐標軸時有着特殊的處理方式。目前我們僅支持屬於date類的日期值和屬於POSIXct類的時間值。如果你的日期和時間值是其他格式的,則需要as.Date()或as.POSIXct()對其進行轉換。
有三個參數可以控制坐標軸外觀和刻度的位置:major、minor、以及format。
- 參數major和minor用以按照時間的單位,即年月周日時分秒來指定主要和次要斷點的位置,並且允許以這些單位的倍數出現,比如,major="2weeks"將在每隔兩周的位置放置一個主刻度。如果未指定,日期刻度可以自動選出合適的默認值。
- 參數format指定了刻度標簽的格式
我們通過繪制下圖來演示部分參數的用法:
> library(ggplot2) > library(scales) > plot <- qplot(date,psavert,data=economics,geom="line") + + ylab("Personal saving rates")+ + geom_hline(xintercept = 0,yintercept=0,colour="grey50") > plot ##圖為個人儲蓄率的時間序列圖形,為默認外觀
> plot + scale_x_date(breaks = date_breaks("10 years")) ##每隔10年為一斷點
> plot + scale_x_date( + limits = as.Date(c("2004-01-01","2005-01-01")), ######使用年月日的格式僅顯示在2004年內的圖形 + labels = date_format("%Y-%m-%d") + )
3.顏色標度
連續型
根據顏色梯度中的色彩數量划分,共有三類連續型顏色梯度(即漸變色):
- scale_colour_gradient() 和 scale_fill_gradient():雙色梯度。參數low和high控制梯度兩端的顏色。
- scale_colour_gradient2() 和 scale_fill_gradient2():三色梯度。順序為低-中-高,這兩種標度還在中點處擁有一個中間色。
- scale_colour_gradientn() 和 scale_fill_gradientn():自定義n色梯度
顏色梯度通常被用來展示一個二維表面的高度。下面我們將以faithful數據集的一個二維密度估計表面為例進行說明。
> library(ggplot2) > f2d <- with(faithful,MASS::kde2d(eruptions,waiting,h=c(1,10),n=50)) > df <- with(f2d,cbind(expand.grid(x,y),as.vector(z))) > names(df) <- c("eruptions","waiting","density") > erupt <- ggplot(df,aes(waiting,eruptions,fill=density)) + geom_tile()+ + scale_x_continuous(expand = c(0,0))+ + scale_y_continuous(expand = c(0,0)) > erupt + scale_fill_gradient(limits = c(0,0.04)) 下圖左 > erupt + scale_fill_gradient(limits = c(0,0.04),low="white",high="black") 下圖中 > erupt + scale_fill_gradient2(limits = c(-0.04,0.04),midpoint=mean(df$density)) 下圖右 >
上面左圖為默認的顏色梯度,中間為自定義的黑白梯度,右圖中點設為密度均值的3點梯度。
離散型
默認的配色方案,即scale_colour_hue(),可通過沿着hcl色輪選取均勻分布的色相來生成顏色。下圖展示了應用於點和條形的三種調色板。
> point <- qplot(brainwt ,bodywt,data=msleep,log="xy",colour=vore) > point <- qplot(brainwt ,bodywt,data=msleep,log="xy",colour=vore) > area <- qplot(log10(brainwt),data=msleep,fill=vore,binwith=1) > area <- qplot(log10(brainwt),data=msleep,fill=vore,binwidth=1) > point + scale_colour_brewer(palette = "Set1") ##第一行圖左 > point + scale_colour_brewer(palette = "Set2") ##第一行圖中 > point + scale_colour_brewer(palette = "Paste11") ##第一行圖右 > area + scale_fill_brewer(palette = "Set1") ##第二行圖左 > area + scale_fill_brewer(palette = "Set2") ##第二行圖中 > area + scale_fill_brewer(palette = "Pastel1") ##第二行圖右 >
對於類別型數據點而言,我們最感興趣的調色板是“Set1”和“Dark2”,對面積而言則是"Set2","Pastel1"和“Pastel2”和“Accent”。
4.手動離散型標度
離散型標度scale_linetype(),scale_size_discrete()和scale_shape()基本上沒有選項,如果想定制這些標度,需要以下手動型標度來創建新的標度:scale_shape_manual(),scale_linetype_manual(),scale_colour_manual()等等。手動型標度擁有一個重要參數values,你可以使用它來指定這個標度應該生成的值。以下展示了scale_manual()的使用方法;
> plot <- qplot(brainwt,bodywt,data=msleep,log="xy") > plot + aes(colour = vore)+ + scale_colour_manual(values = c("red","orange","yellow","green","blue")) ##下圖左 > colours <- c(carni = "red","NA"="orange",insecti="yellow",herbi="green",omni="blue") > plot + aes(colour = vore) + scale_colour_manual(values = colours) ##下圖中 > plot + aes(shape = vore) + scale_colour_manual(values = c(1,2,6,0,23)) ##下圖右