使用ggplot2進行資料視覺化--案例
使用ggplot2進行資料視覺化
1 mpg資料框
mpg 包含了由美國環境保護協會收集的 38 種車型的觀測資料。
mpg 中包括如下變數。
• displ:引擎大小,單位為升。
• hwy:汽車在高速公路上行駛時的燃油效率,單位為英里 / 加侖(mpg)。與燃油效率高
的汽車相比,燃油效率低的汽車在行駛相同距離時要消耗更多燃油。
1.1 建立ggplot圖形
為了繪製 mpg 的圖形,執行以下程式碼將 displ 放在 x 軸,hwy 放在 y 軸:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
#函式
結果分析:上圖顯示出引擎大小(displ)和燃油效率(hwy)之間是負相關關係。換句話說,大引擎汽車更耗油。
1.2 圖形屬性對映
可以向二維散點圖中新增第三個變數,比如 class,方式是將它對映為圖形屬性。圖形
屬性是圖中物件的視覺化屬性,其中包括資料點的大小、形狀和顏色。通過改變圖形屬
性的值,可以用不同的方式來顯示資料點。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = class))
#mpg 資料集中的 class 變數對汽車進行了分類,比如小型、中型和 SUV
結果分析:右側橙紅色那些離群點多數是雙座汽車,因為這些車不會是混合動力的,因為它們具有大引擎。
當然,class可以用同樣的方式將其對映為點的大小size,也可以將 class 對映為控制資料點透明度的 alpha 圖形屬性,還可以將其對映為點的形狀shape[ggplot2 只能同時使用 6 種形狀。預設情況下,當使用這種圖形屬性時,多出的變數值將不會出現在圖中
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, size = class))
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, alpha = class))
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, shape = class))
還可以手動為幾何物件設定圖形屬性。例如,我們可以讓圖中的所有點都為藍色:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy), color = "blue")
用數值進行標識的 R 的 25 種內建形狀
1.3 分面
要想通過單個變數對圖進行分面,可以使用函式 facet_wrap()。其第一個引數是一個公
式,建立公式的方式是在 ~ 符號後面加一個變數名。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_wrap(~ class, nrow = 2)
要想通過兩個變數對圖進行分面,需要在繪圖命令中加入函式 facet_grid()。這個函式的
第一個引數也是一個公式,但該公式包含由 ~ 隔開的兩個變數名。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(drv ~ cyl)
如果不想在行或列的維度進行分面,你可以使用 . 來代替變數名,例如 + facet_grid(. ~ cyl)。
1.4 幾何物件
幾何物件是圖中用來表示資料的幾何圖形物件。條形圖使用了條形幾何物件,折線圖使用了直線幾何物件,箱線圖使用了矩形和直線幾何物件。散點圖打破了這種趨勢,它們使用點幾何物件。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
#使用了點幾何物件
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
#使用了平滑曲線幾何物件
geom_smooth() 函式可以按照不同的線型繪製出不同的曲線,每條曲線對應對映到線型的
變數的一個唯一值:
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))
結果分析:根據表示汽車驅動系統的 drv 變數的值,這裡的 geom_smooth() 函式分別用 3 條曲線來表示汽車。一條線表示 drv 值為 4 的所有汽車,一條線表示 drv 值為 f 的所有汽車,另一條線表示 drv 值為 r 的所有汽車。其中 4 表示四輪驅動,f 表示前輪驅動,r 表示後輪驅動。
ggplot2 就會自動對資料進行分組來繪製多個幾何物件:
ggplot(data = mpg) +
geom_smooth(
mapping = aes(x = displ, y = hwy, color = drv,group = drv),
show.legend = TRUE
)
在同一張圖中顯示多個幾何物件,可以向 ggplot() 函式中新增多個幾何物件函式:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
geom_smooth(mapping = aes(x = displ, y = hwy))
可以在不同的圖層中顯示不同的圖形屬性:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(mapping = aes(color = class)) +
geom_smooth()
可以為不同的圖層指定不同的資料,下圖中的平滑曲線表示的只是 mpg 資料集的一個子集,即微型車。geom_smooth() 函式中的區域性資料引數覆蓋了 ggplot() 函式中的全域性資料引數,當然僅對這個圖層有效:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(mapping = aes(color = class)) +
geom_smooth(
data = filter(mpg, class == "subcompact"),#取出微型車
se = FALSE
)
1.5 統計變換
用 geom_bar() 函式就可以繪製的基本條形圖。diamonds 資料集是 ggplot2的內建資料集,包含大約 54 000 顆鑽石的資訊,每顆鑽石具有 price、carat、color、clarity 和 cut 變數。下面的條形圖顯示了 diamonds 資料集中按照 cut 變數分組的各種鑽石的總數量。
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))
結果分析:高質量切割鑽石的數量要比低質量切割鑽石的數量多。
繪圖時用來計算新資料的演算法稱為 stat(statistical transformation,統計變換)。通常來說,幾何物件函式和統計變換函式可以互換使用。例如,你可以使用 stat_count()替換 geom_bar() 來重新生成前面那張圖:
ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut))
我們將 geom_bar() 函式的統計變換從計數(預設值)修改為標識。這樣我們就可以將條形的高度對映為 y 軸變數的初始值。
demo <- tribble(
~a, ~b,
"bar_1", 20,
"bar_2", 30,
"bar_3", 40
)
ggplot(data = demo) +
geom_bar(
mapping = aes(x = a, y = b), stat = "identity"
)
想顯示一張表示比例(而不是計數)的條形圖:
ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, y = ..prop.., group = 1)
)
想要在程式碼中強調統計變換,可以使用 stat_summary() 函式將人們的注意力吸引到你計算出的那些摘要統計量上。stat_summary() 函式為 x 的每個唯一值計算 y 值的摘要統計:
ggplot(data = diamonds) +
stat_summary(
mapping = aes(x = cut, y = depth),
fun.ymin = min,
fun.ymax = max,
fun.y = median
)
1.6 位置調整
可以使用 color 或者 fill(這個更有用)圖形屬性來為條形圖上色:
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, color = cut))
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = cut))
如果將 fill 圖形屬性對映到另一個變數(如 clarity),那麼條形會自動分塊堆疊
起來。每個彩色矩形表示 cut 和 clarity 的一種組合。
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity))
這種堆疊是由 position 引數設定的位置調整功能自動完成的。如果不想生成堆疊式條形圖,你還可以使用以下 3 種選項之一:"identity"、"fill" 和 "dodge"。
• position = "identity" 將每個物件直接顯示在圖中。這種方式不太適合條形圖,因為條形會彼此重疊。為了讓重疊部分能夠顯示出來,我們可以設定 alpha 引數為一個較小的數,從而使得條形略微透明;或者設定 fill = NA,讓條形完全透明:
ggplot(
data = diamonds,
mapping = aes(x = cut, fill = clarity)
) +
geom_bar(alpha = 1/5, position = "identity")
ggplot(
data = diamonds,
mapping = aes(x = cut, color = clarity)
) +
geom_bar(fill = NA, position = "identity")
• position = "fill" 的效果與堆疊相似,但每組堆疊條形具有同樣的高度,因此這種條
形圖可以非常輕鬆地比較各組間的比例:
ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = clarity),
position = "fill"
)
• position = "dodge" 將每組中的條形依次並列放置,這樣可以非常輕鬆地比較每個條形
表示的具體數值:
ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = clarity),
position = "dodge"
)
通過將位置調整方式設為“抖動”,可以避免這種網格化排列。position = "jitter" 為每個資料點新增一個很小的隨機擾動,這樣就可以將重疊的點分散開來,因為不可能有兩個點會收到同樣的隨機擾動。可用geom_point(position = "jitter") 的一種快速實現方式:geom_jitter()。
ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy),
position = "jitter"
)
1.7 座標軸
預設的座標系是笛卡兒直角座標系,可以通過其獨立作用的 x 座標和 y 座標找到每個資料點。
• coord_flip() 函式可以交換 x 軸和 y 軸。當想要繪製水平箱線圖時,這非常有用。它也非常適合使用長標籤,但要想在 x 軸上不重疊地安排好它們是非常困難的:
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot()
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot() +
coord_flip()
• coord_quickmap() 函式可以為地圖設定合適的縱橫比。當使用 ggplot2 繪製空間資料時,這個函式特別重要。
nz <- map_data("nz")
ggplot(nz, aes(long, lat, group = group)) +
geom_polygon(fill = "white", color = "black") +
coord_quickmap()
• coord_polar() 函式使用極座標系。極座標系可以揭示出條形圖和雞冠花圖間的一種有
趣聯絡:
bar <- ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = cut),
show.legend = FALSE,
width = 1
) +
theme(aspect.ratio = 1) +
labs(x = NULL, y = NULL)
bar + coord_flip()
bar + coord_polar()
本文來自部落格園,作者:zhang-X,轉載請註明原文連結:https://www.cnblogs.com/YY-zhang/p/15576385.html