散點圖簡介
散點圖通常是用來表述兩個連續變量之間的關系,圖中的每個點表示目標數據集中的每個樣本。
同時散點圖中常常還會擬合一些直線,以用來表示某些模型。
繪制基本散點圖
本例選用如下測試數據集:

繪制方法是首先調用ggplot函數選定數據集,並在aes參數中指明橫軸縱軸。然后調用散點圖函數geom_point()便可繪制出基本散點圖。R語言示例代碼如下:
# 基函數 ggplot(ah, aes(x = ageYear, y = heightIn)) + # 散點圖函數 geom_point()
運行結果:

基於顏色和點形對數據進行分組
本例選用如下測試數據集:

繪制方法是在基礎散點圖之上再在基函數的美學參數集里設置一個美學變量。可指定colour或者shape兩種參數,分別將不同分組以不同顏色/點形表述。R語言示例代碼(基於顏色分組)如下:
# 基函數:colour設置分組 ggplot(sah, aes(x = ageYear, y = heightIn, colour = sex)) + # 散點圖函數 geom_point()
運行結果:

R語言示例代碼(基於點形分組)如下:
# 基函數:shape設置分組 ggplot(sah, aes(x = ageYear, y = heightIn, shape = sex)) + # 散點圖函數 geom_point()
運行結果:

說明:可自定義點形,共有大概36種點形可供選擇。具體請參考R語言ggplot2手冊。
映射連續型變量
本例選用如下測試數據集:

上一個示例中,映射到分組的變量是離散型變量。而對於除了橫軸縱軸之外的連續型變量,也可以映射到散點圖的色深和點大小上。R語言示例代碼(綁定顏色)如下:
# 基函數:colour綁定連續變量 ggplot(sahw, aes(x = ageYear, y = heightIn, colour = weightLb)) + # 散點圖函數 geom_point()
運行結果:

R語言示例代碼(綁定大小)如下:
# 基函數:size綁定連續變量 ggplot(sahw, aes(x = ageYear, y = heightIn, size = weightLb)) + # 散點圖函數 geom_point()
運行結果:

處理散點重疊
本例選用如下測試數據集:

如果圖中的散點重疊現象比較嚴重,可以在散點圖中設置散點的透明度來進行可視化。R語言示例代碼如下:
# 基函數:size、colour分別綁定連續變量 ggplot(sahw, aes(x = ageYear, y = heightIn, size = weightLb, colour = sex)) + # 散點圖函數:alpha設置散點透明度 geom_point(alpha = .5) + # 使散點的面積正比與變量值 scale_size_area() + # 標尺函數:palette設置配色方案 scale_colour_brewer(palette = "Set1")
運行結果:

添加回歸模型擬合線
本例選用如下測試數據集:

如果需要網散點圖中添加回歸模型擬合線,最主要是調用stat_smooth()函數。R語言示例代碼如下:
# 基函數:sex綁定離散變量 ggplot(sah, aes(x = ageYear, y = heightIn, colour = sex)) + # 散點圖 geom_point() + # 標尺函數:palette設置配色方案 scale_colour_brewer(palette = "Set1") + # 擬合回歸線段以及置信域(默認0.95/通過level參數可自定義) geom_smooth()
運行結果:

線段為曲線是因為參與擬合模型為局部線性回歸模型。往geom_smooth()函數中加入"method = lm"即可擬合經典線性回歸。結果如下圖:

添加自定義模型擬合線
本例選用如下測試數據集:

上面一小節展示了用全局/局部回歸模型擬合樣本點並展示擬合線段,它使用ggplot2提供的geom_smooth()函數自動擬合並完成繪制。
但在更多時候,我們會使用其他包的模型(非ggplot2內置模型)擬合。針對這種情況,我們需要自定義一個函數。該函數接受模型、橫縱軸名、橫軸范圍、橫軸樣本點數量等參數,輸出一個包含預測變量和預測值的數據框。R語言實現代碼如下:
# 函數功能:輸出模型預測結果
# 參數說明:
# model: 模型變量
# xvar: 預測變量集
# yvar: 實際變量集
# xrange: 預測變量取值范圍
# samples: 預測變量個數
# 函數輸出:實際值 - 預測值數據集
predictvals = function(model, xvar, yvar, xrange = NULL, samples = 100, ...) {
# 模型為lm/glm/loess其中一種的話可自動生成xrange
if (is.null(xrange)) {
if (any(class(model) %in% c("lm", "glm")))
xrange = range(model$model[[xvar]])
else if (any(class(model) %in% "loess"))
xrange = range(model$x)
}
# 生成並返回實際值 - 預測值數據集
newdata = data.frame(x = seq(xrange[1], xrange[2], length.out = samples))
names(newdata) = xvar
newdata[[yvar]] = predict(model, newdata = newdata, ...)
newdata
}
在使用其他模型建模好之后,將新的模型等各參數傳遞進上述函數,便得到預測結果數據集。最后將新的數據集輸出為折線圖即可。
下面展示一個略微復雜的例子,它將數據集根據不同性別分為兩組,分別建立回歸模型並繪制其擬合線。R語言實現代碼如下:
# 建模函數:在這里設置模型
make_model = function(data) {
loess(heightIn ~ ageYear, data)
}
# 按性別切割數據集並返回模型列表
models = dlply(sah, "sex", .fun = make_model)
# 對不同數據集(男/女)進行預測
predvals = ldply(models, .fun = predictvals, xvar = "ageYear", yvar = "heightIn")
# 繪制數據集散點圖以及模型擬合線
ggplot(sah, aes(x = ageYear, y = heightIn, colour = sex)) +
geom_point() +
geom_line(data = predvals)
運行結果:

向散點圖添加邊際地毯
本例選用如下測試數據集:

方法很簡單,在原先散點圖繪制函數的基礎上增加邊際地毯函數就行。R語言實現代碼如下:
# 基函數 ggplot(faithful, aes(x = eruptions, y = waiting)) + # 散點圖函數 geom_point() + # 邊際地毯函數 geom_rug()
運行結果:

向散點圖添加標簽
本例選用如下測試數據集:

往散點圖中添加標簽的方法也很簡單,在原有散點圖函數的基礎上增加文本函數即可。R語言實現代碼如下:
# 基函數 ggplot(cty_1, aes(x = healthexp, y = infmortality)) + # 散點圖函數 geom_point() + # 文本函數:aes參數中:y將原有縱軸值向上偏移,label設置綁定文本 # 將y軸偏移的目的是為了讓文本展示在樣本點上方而不是中間 geom_text(aes(y = infmortality + .2, label = Name))
運行結果:

PS:該示例中我們在文本繪制函數中重定義了美學特征集。之后文本繪制函數將使用新的美學特征集,但其他繪制函數的不變。
