ggplot2繪圖之圖例微調

ggplot2繪圖之圖例微調

來自專欄 R語言中文社區

作者:劉順祥 R語言中文社區專欄作者

公眾號:數據分析1480 (微信ID:lsxxx2011)

配套教程:手把手教你做文本挖掘 edu.hellobi.com/course/

我們說一幅完整的圖應包含至少4項元素,即:標題、坐標軸、圖例和數據來源,在基於ggplot2圖形的微調文中已經詳細的介紹了圖形的標題、坐標軸和數據來源的設置,包括屬性設置和外觀設置等。本文就詳細為大家講講有關圖例的設置,包括屬性設置、位置設置、順序設置、外觀設置等。

一、清除圖例

有時圖例的存在並沒有意義,如之前的圖形中已經出現了圖例,在之後的某些圖中就沒必要使圖例存在;x軸或y軸已經表示了分類的各個水平(如盒形圖),此時也沒必要將圖例保存下來。這裡介紹兩種清除圖例的辦法,即標度法和主題法。

library(ggplot2)

set.seed(1234)

type <- sample(c(A,B,C,D,E), size = 1000, replace = TRUE, prob = c(0.1,0.2,0.2,0.3,0.2))

region <- sample(c(West,East), size = 1000, replace = TRUE, prob = c(0.3, 0.7))

values <- c(rnorm(n = 300, mean = 2,sd = 5), rt(n = 300, df = 4), runif(n = 400, min = 10, max = 100))

df <- data.frame(type = type, region = region, values = values)

head(df)

#盒形圖保留圖例是沒有必要的

ggplot(data = df, mapping = aes(x = type, y = values, fill = type)) + geom_boxplot()

接下來使用標度法和主題法將圖例刪除,標度法通過使用scale_fill_discrete()函數實現,只需將guide參數設置為FALSE即可;主題法就是通過them()函數,將參數legend.position設為none即可。這兩方法可以達到相同的功效。

ggplot(data = df, mapping = aes(x = type, y = values, fill = type)) + geom_boxplot() + scale_fill_discrete(guide = FALSE)

#或者

ggplot(data = df, mapping = aes(x = type, y = values, fill = type)) + geom_boxplot() + theme(legend.position = none)

上面的圖只是舉了個圖例為填充色的例子,如果圖例是由其他屬性構成,如大小、形狀、顏色、線型等,同樣可以使用以上的標度法,只不過需要將對於的標度更改就可以了。下面就列出常用的標度出來:

基於填充色屬性:

scale_fill_discrete() #離散變數填充色

scale_fill_continuous() #連續變數填充色

scale_fill_gradient() #連續變數色階

scale_fill_gray() #灰度填充色

scale_fill_hue() #自定義畫板填充色

scale_fill_brewer() #自定義畫板填充色

scale_fill_manual() #自定義填充色

基於顏色屬性:

scale_colour_discrete()

scale_colour_continuous()

scale_colour_gradient()

scale_colour_gray()

scale_colour_hue()

scale_colour_brewer()

scale_colour_manual()

基於大小屬性:

scale_size_discrete()

scale_size_continuous()

scale_size_manual()

scale_size_area()

基於形狀屬性:

scale_shape_discrete()

scale_shape_continuous()

scale_shape_manual()

基於線型屬性:

scale_linetype_discrete()

scale_linetype_continuous()

scale_linetype_manual()

如果圖例是必不可少的,為了美觀,可能需要對圖例做更多的改動,如圖例位置的擺放、順序的重設定、外觀設置等。下面就看看如何使我們的圖例變得更具吸引眼球。

二、修改圖例位置

有關圖例位置的更改,可以通過主題theme()函數實現,只需要通過調整legend.position()參數的設定就可以隨心所欲的擺放圖例位置。

library(dplyr)

#數據匯總分析

df2 <- group_by(.data = df, type, region)

df3 <- df2 %>% summarize(., Total = sum(values))

head(df3)

#默認情況下的圖例

p <- ggplot(data = df3, mapping = aes(x = type, y = Total, fill = region)) + geom_bar(stat = identity, position = dodge)

p

#更改圖例位置

p + theme(legend.position=bottom)

legend.position可以設置為頂部(top),底部(bottom)、左邊(left)和右邊(right)。發現圖標在頂部或底部的話,原來的圖形會被壓縮,高度明顯變矮。為了解決這樣的問題,legend.position還可以設置圖例的具體位置,即legend.position = c(x, y)。注意,這裡的x和y的取值範圍均為[0,1]。

#將圖例放到圖形內部,並設置為左上角

p + theme(legend.position=c(0,1))

咦?這位置怎麼跑的很奇怪?雖是左上角,怎麼還跑到圖形外面去了?因為默認情況下圖例的中心點位置設在了(0,1)的位置,如果需要更改圖例中心點位置,則需使用legend.justification = c(x, y)進行設置,如legend.justification = c(1,0)表示圖例中心點在圖例的左上角。下面使用legend.justification重新繪製一下圖例的位置:

p + theme(legend.position=c(0,1), legend.justification=c(0,1))

Perfect!圖例不再錯誤的偏移了。有沒有發現不和諧的地方?圖形的背景為灰色,而圖例的背景為白色,明顯感覺像是不專業的PS工作者,如何讓圖例融入到圖形中呢?很簡單,只需要進一步設置圖例背景主題即可。

p + theme_bw() + theme(legend.position=c(0,1), legend.justification=c(0,1)) + theme(legend.background = element_rect(fill = white, colour = black))

其中,theme_bw()將原來的灰色背景設置為黑白背景,fill設置圖例背景色為白色, colour設置圖例邊框為黑色。如果不需要邊框色的話,就不需要指定顏色屬性的值。

三、修改圖例內容的順序

如果我想把圖例內容的順序改一改,即West在East之上,該如何實現呢?ggplot2包仍然允許你添加少量的代碼就可以實現目的。

p + theme_bw() + theme(legend.position=c(0,1), legend.justification=c(0,1)) + theme(legend.background = element_rect(fill = white, colour = black)) + scale_fill_discrete(limits = c(West,East))

哎?跟上一幅圖相比,發現一個問題,雖然圖例內容的順序發生了變化,但原本的顏色跟著變化了,即原來East為粉紅色變為了藍色,原來West為藍色變為了粉紅色,而且條形圖的順序並沒有跟著發生變化。在我看來顏色的變化並不是重點,重點是條形圖的順序紋絲不動,如果想讓圖例項目順序和條形圖順序一致的話,該如何操作呢?實際也很簡單,只需將因子順序改變即可。

ggplot(data = df3, mapping = aes(x = type, y = Total, fill = factor(region, levels = c(West,East)))) + geom_bar(stat = identity, position = dodge) + theme_bw() + theme(legend.position=c(0,1), legend.justification=c(0,1)) + theme(legend.background = element_rect(fill = white, colour = black)) + scale_fill_discrete(limits = c(West,East)) + labs(fill = region)

四、圖例內容順序的整體逆轉

如何逆轉圖例的整體內容呢?同樣很簡單,只需使用guide()函數就可以輕鬆實現:

#原始默認的圖例內容順序

ggplot(data = df3, mapping = aes(x = region, y = Total, fill = type)) + geom_bar(stat = identity, position = dodge)

#實現整體圖例內容的逆轉

ggplot(data = df3, mapping = aes(x = region, y = Total, fill = type)) + geom_bar(stat = identity, position = dodge) + guides(fill = guide_legend(reverse = TRUE))

五、修改圖例標題和圖例項目的內容

使用labs()函數,通過設定fill、colour、shape、size、linetype等屬性的值,就可以更改圖例標題了。當然也可以通過標度方法達到相同的目的,以例子說明這兩種方法的應用:

ggplot(data = df3, mapping = aes(x = region, y = Total, fill = type)) + geom_bar(stat = identity, position = dodge) + labs(fill = 類型by_labs)

#或者

ggplot(data = df3, mapping = aes(x = region, y = Total, fill = type)) + geom_bar(stat = identity, position = dodge) + scale_fill_discrete(name = 類型by_scale)

#當然也可以通過這種方式刪除圖例標題

ggplot(data = df3, mapping = aes(x = region, y = Total, fill = type)) + geom_bar(stat = identity, position = dodge) + labs(fill = )

#修改圖例項目的內容

ggplot(data = df3, mapping = aes(x = region, y = Total, fill = type)) + geom_bar(stat = identity, position = dodge) + scale_fill_discrete(labels = c(Level01,Level02,Man,Women,Children))

六、修改圖例標題和圖例內容的外觀

之前我們說過,修改圖形標題、坐標軸標籤和刻度標籤的外觀可以通過主題方式實現,這裡同樣也可以通過主題theme()函數實現圖例標題和圖例內容的外觀

#默認情況下的圖例

p <- ggplot(data = df3, mapping = aes(x = type, y = Total, fill = region)) + geom_bar(stat = identity, position = dodge)

p

#修改圖例標題和圖例內容的外觀

p + theme(legend.title = element_text(colour = steelblue, size = 15, face = bold.italic)) + theme(legend.text = element_text(colour = red, face = bold))

參考文獻:

R語言_ggplot2:數據分析與圖形藝術

R數據可視化手冊


推薦閱讀:

Origin(Pro):3D圖--Matrix
小技巧丨兩種方法獲取任意地區CAD地形圖!
Origin(Pro):3D圖--Error Bar
Origin(Pro):圖層的合併與拆分

TAG:MATLAB | 繪圖 | R編程語言 |