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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM