作者:dwzb,R語言中文社區專欄作者。知乎專欄:https://zhuanlan.zhihu.com/Data-AnalysisR
第一篇戳:R|ggplot2(一)|一個完整的繪圖流程
第二篇戳:R|ggplot2(二)|覆蓋柱狀圖各種需求
第三篇戳:R|ggplot2(三)|coord 系列函數坐標軸轉換
第四篇戳:R|ggplot2(四)|stat_ geom_ 和position
查看ggplot2包的官方文檔,我們可以看到scale系列函數構成是有一定規律的。如scale_fill_gradient scale_x_continuous
三個單詞用_連接
本文分為以下兩個部分
對顏色的各種修改(color fill)
對坐標軸的更改(x y)
顏色的函數名中,第二個單詞有color和fill兩個,看你分組使用的是哪一個就用哪一個,比如柱狀圖,fill是柱子的填充顏色,color是柱子的邊框顏色,一般我們都用fill接分組變量,這時就應該使用scale_fill_系列函數來更改顏色。再比如是geom_point作圖使用color分組,則加scale_color_系列函數。
根據第三個單詞的不同,更換的顏色分為以下幾種
1. 離散型
2. 連續型
這裡分成兩類,離散型和連續型
下面我們分為兩個部分
library(ggplot2)
p0 <- ggplot(mpg, aes(class))+geom_bar(aes(fill=drv))
p0
p0 + scale_fill_manual(values=c("red", "blue", "green"))
p0 + scale_fill_manual(values=c("4" = "red", "r" = "blue", "f" = "darkgreen"))
# hue
# 主要參數:h = c(0, 360) + 15, c = 100, l = 65
# h指定色域,範圍越大,顏色區分度越大。範圍整體移動改變取色區域
# c越大飽和度越高
p0
p0 + scale_fill_hue(l=8)
p0 + scale_fill_hue(l=100)
p0 + scale_fill_hue(c=200)
p0 + scale_fill_hue(h=c(15,100))
p0 + scale_fill_hue(h=c(15,100)+100)
p0 + scale_color_hue(h=c(15,100)) # 前面使用fill分組,用color系列無效
ggplot(mpg, aes(class))+geom_bar(aes(color=drv)) +
scale_color_hue(h=c(15,100)) # 使用color分組才有效
# brewer
library(RColorBrewer)
display.brewer.all() # 展示所有顏色
# 主要是palette參數調用色板
p0
p0 + scale_fill_brewer() # 默認使用Blues調色板中的顏色
p0 + scale_fill_brewer(palette = "Greens")
p0 + scale_fill_brewer(palette = "Greens",direction = -1)
# grey
# 通過start end 兩個參數指定,都在0-1範圍內,0為黑,1為白
p0
p0 + scale_fill_grey()
p0 + scale_fill_grey(start=1, end=0)
p0 + scale_fill_grey(start=1, end=0.5)
# 連續型
df <- data.frame(
x = runif(100),
y = runif(100),
z1 = rnorm(100),
z2 = abs(rnorm(100))
)
pp0 <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z1))
# gradient
# 使用參數指定節點顏色
pp0
pp0 + scale_color_gradient(low = "white", high = "black")
pp0 + scale_color_gradient2(low = "white", mid = "red", high = "black")
pp0 + scale_color_gradientn(colours = terrain.colors(10))
# distiller
# 將ColorBrewer的顏色應用到連續變量上
pp0 + scale_color_distiller(palette = "Spectral")
pp0 + scale_color_distiller(palette = "Greens")
# identity
# 直接使用所接顏色變量元素指向的顏色
# 如果不能代表顏色就會報錯
df0 <- data.frame(
x = rep(1:4,each=2),
y = rep(1:4, 2),
colour = c("red", "green", "blue", "yellow")
)
ggplot(df0,aes(x,y)) +geom_point(aes(color=colour))
ggplot(df0,aes(x,y)) +geom_point(aes(color=colour)) + scale_color_identity()
ggplot(df0,aes(x,y)) +geom_col(aes(fill=colour))
ggplot(df0,aes(x,y)) +geom_col(aes(fill=colour)) + scale_fill_identity()
ggplot(df0,aes(x,y)) +geom_col(aes(fill=colour)) +
scale_fill_identity(guide = "legend") # 把圖例加回來
以上函數我們查看幫助文檔看參數時,會發現有一個...,這代表除了本頁列舉的這些參數之外,這個函數還可以使用其他的參數,這些參數往往是幾個函數共有的,所以在另外一個地方列舉了出來。
我們直接輸入函數名稱查看原始碼時,會發現分為兩類
下面我將分別介紹這兩類函數的參數
離散型函數所有參數使用?discrete_scale命令查看,下面只使用其中比較常用的一部分,連續型函數同理
p0 <- ggplot(mpg, aes(class))+geom_bar(aes(fill=drv))
p0
p0 + scale_fill_manual("class", values=c("red", "blue", "green"))
p0 + scale_fill_manual(values=c("red", "blue", "green"),
breaks = c("4", "r", "f"),
labels = c("four", "rr", "rr"))
p0 + scale_fill_manual(values=c("red", "blue", "green"),
limits=c("4", "r"))
p0 + scale_fill_manual(values=c("red", "blue", "green", "black"),
limits=c("4", "r", "f", "6"))
pp0
pp0 + scale_color_gradient(low = "white", high = "black",
breaks=c(1,2,0.5),
labels=c("a","b","c"))
pp0 + scale_color_gradient("black", low = "white", high = "black",
limits=c(0.5,2))
這部分主要是對坐標軸做如下改變,比如
更改坐標軸名稱
更改x軸上標數的位置和內容
顯示對一個軸做統計變換
只展示一個區域內的點
更改刻度標籤的位置
實現上面的這些可以使用scale_x等函數,同時像xlab這樣的函數實現其中某一方面的功能,但是用起來更加方便
因為這裡的數據也有連續和離散之分,所以也要使用不同的函數來實現。
# 橫坐標是離散變量,縱坐標是連續變量
p0 <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_point()
# 其實scale_x_discrete函數主要參數也是上面顏色的離散變量函數的通用參數,在discrete_scale中查詢
p0 + scale_x_discrete("cyl") # 更改坐標軸名稱
p0 + scale_x_discrete(labels = c("4"="a","6"="b","8"="c")) # 更改橫軸標度
p0 + scale_x_discrete(labels = c("4"="a","6"="b"))
p0 + scale_x_discrete(labels = letters[1:3])
p0 + scale_x_discrete(limits=c("4","6"))
# 連續變量可以更改標度,還可以進行統計變換
p0
p0 + scale_y_continuous("ylab_mpg")
p0 + scale_y_continuous(breaks = c(10,20,30))
p0 + scale_y_continuous(breaks = c(10,20,30), labels=scales::dollar)
p0 + scale_y_continuous(limits = c(10,30))
p0 + scale_y_reverse() # 縱坐標翻轉,小數在上面,大數在下面
p0 + scale_y_log10()
p0 + scale_y_continuous(trans = "log10")
p0 + scale_y_sqrt()
# 使用更簡單易用 的函數
p0 + xlab("cyl")
p0 + labs(x = "cyl")
p0 + ggtitle("ggtitle",subtitle = "subtitle")
p0 + xlim(c("4","6"))
# 更改刻度標籤的位置
p0 + scale_x_discrete(position = "top") +
scale_y_continuous(position = "right")
公眾號後臺回復關鍵字即可學習
回復 R R語言快速入門免費視頻
回復 統計 統計方法及其在R中的實現
回復 用戶畫像 民生銀行客戶畫像搭建與應用
回復 大數據 大數據系列免費視頻教程
回復 可視化 利用R語言做數據可視化
回復 數據挖掘 數據挖掘算法原理解釋與應用
回復 機器學習 R&Python機器學習入門