1. 程式人生 > 其它 >使用ggplot2進行資料視覺化--案例

使用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))

#函式

geom_point() 向圖中新增一個點層,這樣就可以建立一張散點圖。ggplot2 中的每個幾何物件函式都有一個 mapping 引數。這個引數定義瞭如何將資料集中的變數對映為圖形屬性。mapping 引數總是與 aes() 函式成對出現,aes() 函式的 x 引數和 y引數分別指定了對映到 x 軸的變數與對映到 y 軸的變數。

結果分析:上圖顯示出引擎大小(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 顆鑽石的資訊,每顆鑽石具有 pricecaratcolorclarity cut 變數。下面的條形圖顯示了 diamonds 資料集中按照 cut 變數分組的各種鑽石的總數量。

ggplot(data = diamonds) +

geom_bar(mapping = aes(x = cut))

結果分析:高質量切割鑽石的數量要比低質量切割鑽石的數量多

繪圖時用來計算新資料的演算法稱為 statstatistical 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