散點圖簡介
散點圖通常是用來表述兩個連續變數之間的關係,圖中的每個點表示目標資料集中的每個樣本。
同時散點圖中常常還會擬合一些直線,以用來表示某些模型。
繪製基本散點圖
本例選用如下測試資料集:
繪製方法是首先呼叫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:該示例中我們在文字繪製函式中重定義了美學特徵集。之後文字繪製函式將使用新的美學特徵集,但其他繪製函式的不變。