今天继续分享生信分析中常见的图形 -- bubble
。与散点图相比,气泡图在点的大小上面增加了一个维度的信息,属于一种特别的散点图。如果再结合plotly
和htmlwidgets
包生成交互式的气泡图,那么能够呈现的信息就会更多。
示例数据
下面绘图使用的数据集 gapminder
来自 R 包gapminder
,如果安装了该包可以直接使用,没有安装的话可以直接从github上下载:https://github.com/jennybc/gapminder/blob/main/data/gapminder.rdata。本人还是直接下载数据来使用了。
load('gapminder.rdata')
data <- gapminder[gapminder$year==2007,]
data$gdpPercap <- round(data$gdpPercap,0)
data$pop <- round(data$pop/1000000,2)
data$lifeExp <- round(data$lifeExp,1)
data$text <- paste("Country: ", data$country, "\nPopulation (M): ", data$pop, "\nLife Expectancy: ", data$lifeExp, "\nGdp per capita: ", data$gdpPercap, sep="")
head(data)
# A tibble: 6 × 7
# country continent year lifeExp pop gdpPercap text
# <fct> <fct> <int> <dbl> <dbl> <dbl> <chr>
#1 Afghanistan Asia 2007 43.8 31.9 975 "Country: Afghanistan\nPo…
#2 Albania Europe 2007 76.4 3.6 5937 "Country: Albania\nPopula…
#3 Algeria Africa 2007 72.3 33.3 6223 "Country: Algeria\nPopula…
#4 Angola Africa 2007 42.7 12.4 4797 "Country: Angola\nPopulat…
#5 Argentina Americas 2007 75.3 40.3 12779 "Country: Argentina\nPopu…
#6 Australia Oceania 2007 81.2 20.4 34435 "Country: Australia\nPopu…
选取数据集中2007年的数据绘图,并对其中的数据小数保留精度做了一些调整。其中pop
转化为百万单位(M),并增加一列包含Country
、Population
、Life Expectancy
、Gdp per capita
信息,用于后面绘制交互式气泡图。
绘图
废话不多说,基础气泡图绘制代码如下:
library(ggplot2)
library(viridis)
p <- ggplot(data, aes(x=gdpPercap, y=lifeExp, size = pop, color = continent, text=text)) +
geom_point(alpha=0.7) +
scale_size(range = c(1.4, 19), name="Population (M)") +
scale_color_viridis(discrete=TRUE) +
theme_minimal() +
theme(legend.position="none")
p
结果如下:
绘图过程还是挺简单的,颜色美化依旧使用的是viridis
包的配色方案。气泡默认会根据数据的大小映射为不同的大小,但有时候默认映射不符合审美时,我们可以使用scale_size
函数来调整气泡的大小。
交互
将上面绘图的基础气泡图,变成交互式的动图,代码如下:
library(plotly)
library(htmlwidgets)
pp <- ggplotly(p, tooltip="text", height=5, width=7)
saveWidget(pp, file="ggplotlyBubble.html")
结果如下:
基础气泡图变成交互式气泡图后,鼠标移动到气泡上面时就会呈现出相应的信息(前面增加的一列信息)。交互式的图显然增加了展示的信息量,但其使用场景有所限制,多见于网页里面。
网友评论