天天看點

python 氣泡圖 聚類_R可視化 | 氣泡圖

氣泡圖

氣泡圖是一種多變量圖表,是散點圖的變體,也可以認為是散點圖和百分比區域圖的組合[1]。氣泡圖最基本的用法是使用三個值來确定每個資料序列,和散點圖一樣。氣泡圖通過氣泡的位置及面積大小,可分析資料之間的相關性。

本文可以看作是《R語言資料可視化之美》的學習筆記。前兩部分可見(跳轉):

該書對氣泡圖的繪制并不是非常詳細,小編将内容進行了大量拓展。下面的例子将一步步帶你完成氣泡圖的繪制。本文内容豐富,希望大家都能學到自己想要的内容。

下面的例子将一步步帶你完成氣泡圖的繪制。本文内容豐富,希望大家都能學到自己想要的内容。

本文架構

python 氣泡圖 聚類_R可視化 | 氣泡圖

資料介紹

資料集來源gapminder包中,包含了1704行和6個變量。其中6個變量含義分别為:

country 國家142個水準

continent 大陸5個水準

year 1952年-2007年(間隔為5年)

lifeExp 出生預期壽命,以年計數

pop 人口數

gdpPercap 人均國内生産總值(扣除通貨膨脹因素後的美元)

由于資料過多,我們感興趣的是年份為2007年的資料,是以使用dplyr包進行資料處理,具體資料處理案例可見我寫的另一篇推送:[R資料科學]tidyverse資料清洗案例詳解。資料縮略版如下:

python 氣泡圖 聚類_R可視化 | 氣泡圖

手把手繪制

geom_point()函數建構

氣泡圖是添加了第三次元的散點圖:附加數值變量的值通過點的大小表示。(來源:data-to-viz[2])。使用ggplot2,可以通過geom_point()函數建構氣泡圖。aes()設定至少三個變量:x、y和size。其實就是散點圖繪制的更新版吧,aes()中多了一個參數。

ggplot(data, aes(x=gdpPercap, y=lifeExp, size = pop)) +

geom_point(alpha=0.7)

python 氣泡圖 聚類_R可視化 | 氣泡圖

上圖展示了世界各國的預期壽命(y)與人均國内生産總值(x)之間的關系。每個國家的人口用圓的大小表示。但是這個圖不是非常美觀,而且圓的大小并不是很直覺,大家都差不多大。接下來對圓的大小進行設定。

scale_size()控制圓的大小

scale_size()允許使用range參數設定最小和最大的圓的大小,用name改變圖例名稱(scale_size(range = c(0.1, 24), name="Population (M)"))。

圖中可以看到,有些圓圈重疊了。k可将點的透明度進行調整(geom_point(alpha=0.5))

為了避免在圖表頂部出現大的圓圈,可以将資料集進行排序(arrange(desc(pop))),代碼如下。

data %>%

arrange(desc(pop)) %>%

mutate(country = factor(country)) %>%

ggplot(aes(x=gdpPercap, y=lifeExp, size = pop)) +

geom_point(alpha=0.5) +

scale_size(range = c(.1, 24), name="Population (M)")

python 氣泡圖 聚類_R可視化 | 氣泡圖

現在圖可讀性有所提高,但如果資料集中還有一個變量想加入圖中該怎麼辦呢?

添加第四個次元:顔色

這裡可以用每個國家的洲來控制圓圈的顔色(aes(x=gdpPercap, y=lifeExp, size=pop, color=continent)):

data %>%

arrange(desc(pop)) %>%

mutate(country = factor(country, country)) %>%

ggplot(aes(x=gdpPercap, y=lifeExp, size=pop, color=continent)) +

geom_point(alpha=0.5) +

scale_size(range = c(.1, 24), name="Population (M)")

python 氣泡圖 聚類_R可視化 | 氣泡圖

該圖基本可以滿足我們日常生活的氣泡圖的可視化了。相信大家通過前面的詳細的介紹,應該可以自行繪制,隻要換個資料,懂得各個代碼的含義即可。後面是圖表美化的過程,參考thr R Graph Gallery: Bubble plot with ggplot2[3]。

美化氣泡圖

一些經典的改進

使用viridis包的調色闆:(scale_fill_viridis(discrete=TRUE, guide=FALSE, option="A"))

使用hrbrthemes包的theme_ipsum()

使用xlab和ylab自定義軸标題

為圓添加描邊:将形狀改為21,并指定顔色(描邊)和填充

library(hrbrthemes)

library(viridis)

# Most basic bubble plot

data %>%

arrange(desc(pop)) %>%

mutate(country = factor(country)) %>%

ggplot(aes(x=gdpPercap, y=lifeExp, size=pop, fill=continent)) +

geom_point(alpha=0.5, shape=21, color="black") +

scale_size(range = c(.1, 24), name="Population (M)") +

scale_fill_viridis(discrete=TRUE, guide=FALSE, option="A") +

theme_ipsum() +

theme(legend.position="bottom") +

ylab("Life Expectancy") +

xlab("歡迎關注:莊閃閃的成長手冊 \nq Gdp per Capita") +

theme(legend.position = "none")

python 氣泡圖 聚類_R可視化 | 氣泡圖

帶資料标簽

這裡使用ggrepel包中的(geom_text_repel()),可以給每個點自動加入标簽,我這裡是加入了各個國家名字,其他可以根據你實際需求進行設定。

library(ggrepel)

data1 = data %>%

mutate(country = factor(country)) %>% head(20)

attach(data1)

ggplot(data1,aes(x=gdpPercap, y=lifeExp, size=pop, fill=continent)) +

geom_point(alpha=0.5, shape=21, color="black") +

scale_size(range = c(.1, 24), name="Population (M)") +

geom_text_repel(label = country,size=5)+

scale_fill_viridis(discrete=TRUE, guide=FALSE, option="A") +

theme_ipsum() +

theme(legend.position="bottom") +

ylab("Life Expectancy") +

xlab("歡迎關注:莊閃閃的成長手冊 \nq Gdp per Capita") +

theme(legend.position = "none")

python 氣泡圖 聚類_R可視化 | 氣泡圖

如果不喜歡圓形的氣泡圖,可以将代碼中的shape=21進行更改,正方形是shape=22,得到的圖如下:

python 氣泡圖 聚類_R可視化 | 氣泡圖

拓展知識

其他擴充可自行學(小編做推送的時候已經學過啦,但是篇幅有限,就沒繼續整理下去了)

GOplot包

[4]提供了直接做氣泡圖的方法,函數是:GOBubble。

python 氣泡圖 聚類_R可視化 | 氣泡圖

BUBBLE PLOT理論定義

[5]

python 氣泡圖 聚類_R可視化 | 氣泡圖

plotly包

[6]繪制可以互動的氣泡圖

python 氣泡圖 聚類_R可視化 | 氣泡圖

參考資料

[1]

R語言資料可視化之美: R語言資料可視化之美

[2]

data-to-viz: https://www.data-to-viz.com/graph/bubble.html

[3]

thr R Graph Gallery: Bubble plot with ggplot2: https://www.r-graph-gallery.com/320-the-basis-of-bubble-plot.html

[4]

GOplot包: https://wencke.github.io/

[5]

BUBBLE PLOT理論定義: https://www.data-to-viz.com/graph/bubble.html

[6]

plotly包: https://plotly.com/r/bubble-charts/