本期內(nèi)容
- 示例數(shù)據(jù)簡介
- ggplot2詳細用法介紹
示例數(shù)據(jù)介紹
本次我們使用著名的鳶尾花數(shù)據(jù)集(iris,R自帶數(shù)據(jù)集,直接調(diào)用即可)來進行演示,此數(shù)據(jù)集包括3個品種的鳶尾花,每種50個樣本。前4列分別為萼片的長、寬以及花瓣的長、寬,第5列為對應(yīng)的品種名稱。

數(shù)據(jù)概況如下:

用法詳細介紹
怎么調(diào)用?
先繪制一張簡單的圖
library(ggplot2)
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point()

如上我們可以看到,只需要簡單一行代碼即可輕松得到一幅散點圖,我們來拆解一下這行代碼
ggplot() 初始化ggplot對象,我們在這里指定讀入數(shù)據(jù)集iris (data = iris),那么之后疊加的圖層如果不是特別聲明的話,使用的都是該數(shù)據(jù)集
aes() 指定美學映射,比如這個例子中就是指定X和Y軸分別用哪列變量(x = Sepal.Length, y = Sepal.Width),此例中美學映射在ggplot()中初始化,之后的圖層如果不是特別指定的話,美學映射都不變
-
geom_point() 指定幾何對象,也就是你想要繪制什么圖,這里為散點圖
除了散點圖ggplot2可指定的幾何對象還有很多,常用的還有:
- geom_line() 折線圖
- geom_bar() 柱狀圖
- geom_boxplot() 箱線圖
- geom_violin() 小提琴圖
- geom_area() 面積圖
- geom_density() 密度圖
- geom_tile() 塊狀圖
通俗的講就是,你可以在ggplot()里預設(shè)好數(shù)據(jù)集,美學映射,之后添加的各個圖層可以不用再重復聲明(可以想象成默認設(shè)置):
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
p

如上,數(shù)據(jù)及映射已設(shè)置好,接下來只需要在此基礎(chǔ)上疊加幾何對象就行,添加散點圖:
p + geom_point()

添加折線圖:
p + geom_line()

也可以單獨在每個圖層進行設(shè)置(可以想象成個性化設(shè)置),如下,直接在散點圖的圖層里聲明數(shù)據(jù)集及坐標軸映射:
ggplot() + geom_point(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
或者,通用聲明數(shù)據(jù)集,在散點圖里單獨聲明坐標軸映射:
ggplot(data = iris) + geom_point(aes(x = Sepal.Length, y = Sepal.Width))
出來的結(jié)果都等同于第一幅圖的結(jié)果:

那么再疊加一層折線圖呢?我們用以上三種方式分別進行測試:
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() +
geom_line()
ggplot() + geom_point(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_line()
ggplot(data = iris) + geom_point(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_line()
分別得到以下結(jié)果:
第一種,正確出圖(ggplot()里提前聲明數(shù)據(jù)集及坐標軸,那么之后的圖層都直接按照此映射):

第二種,折線圖未顯示(因為沒有提前進行任何聲明,只在散點圖層里進行了獨立聲明,折線圖層找不到數(shù)據(jù)集及坐標軸映射,直接不顯示):

而第三種方式報錯(因為只提前聲明了數(shù)據(jù)集,在折線圖層里找不到坐標軸映射,有數(shù)據(jù)卻沒有映射直接報錯):

對于第二種和第三種問題,直接改成以下方式,即可成功出圖:
第二種:
ggplot() + geom_point(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_line(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
第三種:
ggplot(data = iris) + geom_point(aes(x = Sepal.Length, y = Sepal.Width)) + geom_line(aes(x = Sepal.Length, y = Sepal.Width))
所以,如果之后有多個圖層都是用到相同的映射,直接按第一種方式即可,簡單明了。
如何調(diào)整?
以上基本圖形出來了,想必你應(yīng)該也對如何映射有了一定的了解。接下來想要添加一下顏色,調(diào)整一下點的大小、形狀這些該怎么寫呢?如下:
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
p + geom_point(color = "#8283a7", size = 6, shape = 18)

可以看到所有的點都修改為了統(tǒng)一的顏色、大小、形狀,那如果想設(shè)置不同的值呢?總共150個點,現(xiàn)在我們來自定義這些點的顏色和大?。?/p>
mycolor <- rep(c("#167c80", "#f0cf61", "#371722"), each = 50) # 三個顏色每個重復50次,共150個顏色
mysize <- rep(c(6, 4, 2), each = 50) # 同上,生成三種大小
myshape <- rep(16:18, each = 50) # 同上,生成三種形狀
p + geom_point(color = mycolor, size = mysize, shape = myshape) # 按順序分別映射到每一個點上

如果不想自己一個個去映射,直接按照分組來設(shè)置呢?
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, size = Species, shape = Species)) + geom_point()
p

我們可以看到,顏色、大小、形狀都是按鳶尾花的品種來區(qū)分的,現(xiàn)在我們來自定義一下各個值,這里要引入ggplot2里的一個新元素------標度
scale_*_:
由于我們是按分組變量來區(qū)分,因此調(diào)用 scale_*_manual 即可
p + scale_color_manual(values = c("#167c80", "#f0cf61", "#371722")) + scale_size_manual(values = c(6, 4, 2)) + scale_shape_manual(values = 16:18)

現(xiàn)在的結(jié)果和之前每個點一一分配值是一樣的了,而且還自動生成了圖例!另外,我們不止可以根據(jù)分組,還可以根據(jù)一組連續(xù)的變量來映射顏色和大小,例如:
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Petal.Length, size = Petal.Width, shape = Species)) + geom_point()
p

這樣就根據(jù)Petal.Length的數(shù)值生成了一組漸變色,以及根據(jù)Petal.Width的值來改變點的大小。我們來修改一下顏色,由于用連續(xù)型變量,我們用到的標度需改為
scale_*_gradient :
p <- p + scale_color_gradient(low = "#f0cf61", high = "#371722") # 指定最小和最大值對應(yīng)的顏色,并生成漸變色
p

最大的點太大,怎么調(diào)整?只須重新設(shè)置一下大小的映射范圍,如下:
p <- p + scale_size_continuous(range = c(1, 4)) # 1和4分別對應(yīng)最小值和最大值的點的大小
p

到這里,點差不多設(shè)置好了,再來進行一下美化,背景、網(wǎng)格線、字體、圖例等都可以在theme()函數(shù)里進行設(shè)置,這里先去掉灰色背景:
p + theme(panel.background = element_rect(fill = "white", color = "grey50"), # 將繪圖區(qū)域背景顏色改為白色,加上深灰色邊框
legend.key = element_rect(fill = "white")) # 將圖例中圖標的背景改為白色

加上網(wǎng)格線:
p + theme(panel.background = element_rect(fill = "white", color = "grey50"), legend.key = element_rect(fill = "white"), panel.grid = element_line(color = "grey92"))

可以看到,theme里面定義各個元素都是用element_*系列函數(shù)
- element_blank() 不顯示
- element_rect() 邊框和背景
- element_line() 線條
- element_text() 文字
具體可以設(shè)置的內(nèi)容詳見幫助文檔。
如果嫌麻煩的話,ggplot2已經(jīng)自定義了一些主題如下(更多主題大家可以自己一一嘗試):
p + theme_bw() # 直接一行代碼實現(xiàn)上面的操作

p + theme_classic()

p + theme_dark()

更多主題,我們還可以安裝ggthemes包進行調(diào)用,這個我們會在之后的教程里進行介紹。
現(xiàn)在,我們加上標題,修改一下字體大?。?/p>
p + theme_bw() + # 切換背景主題
labs(x = "Sepal Length", y = "Sepal Width", title = "Iris Sepal") + # 修改X,Y軸標題,加上主標題
theme(plot.title = element_text(size = 15, face = "bold", hjust = 0.5), # 調(diào)整標題字體大小,改為粗體,使其居中對齊
axis.title = element_text(face = "bold"), # 將坐標軸標題字體加粗
legend.title = element_text(face = "bold"), # 將圖例字體加粗
axis.text = element_text(size = 13), # 修改坐標軸標簽字體大小
legend.text = element_text(size = 12)) # 設(shè)置圖例字體大小

如此,簡單的一幅圖就繪制完成了,總結(jié)一下,代碼如下:
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width,
color = Petal.Length, size = Petal.Width,
shape = Species)) +
geom_point() +
scale_color_gradient(low = "#f0cf61", high = "#371722") +
scale_size_continuous(range = c(1, 4)) +
theme_bw() +
labs(x = "Sepal Length", y = "Sepal Width", title = "Iris Sepal") +
theme(plot.title = element_text(size = 15, face = "bold", hjust = 0.5),
axis.title = element_text(face = "bold"),
legend.title = element_text(face = "bold"),
axis.text = element_text(size = 13),
legend.text = element_text(size = 12))
接下來,直接用ggsave保存到想要的路徑下:
ggsave("E:/Temp/Test.png", plot = p, width = 8, height = 5)
或者直接用Rstudio選擇想要的圖片格式導出:


最后
- 感謝支持,希望對您有幫助!
- 有不足的地方歡迎指正!
- 關(guān)注我們,及時獲取更多干貨!