本文转自《R友舍》公众号,关注R友舍,后台回复ggplot2,获取全文代码
什么类型的可视化用于什么类型的问题?本文可帮助您为特定分析目标选择正确的图表类型,以及如何使用ggplot2在R中实现它。
一个有效的图标:
- 在不歪曲事实的情况下传达正确的信息
- 简单而优雅的表达信息内容
- 通过美学表达信息,而不是掩盖信息
- 没有信息负载
下面介绍了八类常见的图表可视化情景。在绘图之前,请仔细考虑你准备如何通过可视化的方式表达统计事实或事件关系。也许就是这八类情景中的一个。
类型一:相关性
以及几个图用于检查两个变量见的相关性
散点图
散点图是数据分析过程中使用最多的图标之一。当你想了解两个变量间的相关性时,首先想到的就是散点图。
我们可以用ggplot2里的geom_point()绘制散点图。另外,还可以用geom_smooth来绘制平滑曲线,通过设置methon='lm’来绘制最佳拟合曲线。
options(scipen=999)
library(ggplot2)
theme_set(theme_bw())
data("midwest", package = "ggplot2")
# midwest <- read.csv("http://goo.gl/G1K41K")
# Scatterplot
gg <- ggplot(midwest, aes(x=area, y=poptotal)) +
geom_point(aes(col=state, size=popdensity)) +
geom_smooth(method="loess", se=F) +
xlim(c(0, 0.1)) +
ylim(c(0, 500000)) +
labs(subtitle="Area Vs Population",
y="Population",
x="Area",
title="Scatterplot",
caption = "Source: midwest")
plot(gg)
带有环绕的散点图
在展示结果时,有时可以将某个特殊的区域包围起来,从而达到突出展示的效果。
我们可以通过ggalt包里的geom_encircle()实现。
在geom_encircle()中,我们可以指定需要突出的数据集,此外还可以扩展曲线,以便在点之外传递;以及修改曲线的颜色及大小。
# install 'ggalt' pkg
# devtools::install_github("hrbrmstr/ggalt")
options(scipen = 999)
library(ggplot2)
library(ggalt)
midwest_select <- midwest[midwest$poptotal > 350000 &
midwest$poptotal <= 500000 &
midwest$area > 0.01 &
midwest$area < 0.1, ]
# Plot
ggplot(midwest, aes(x=area, y=poptotal)) +
geom_point(aes(col=state, size=popdensity)) + # draw points
geom_smooth(method="loess", se=F) +
xlim(c(0, 0.1)) +
ylim(c(0, 500000)) + # draw smoothing line
geom_encircle(aes(x=area, y=poptotal),
data=midwest_select,
color="red",
size=2,
expand=0.08) + # encircle
labs(subtitle="Area Vs Population",
y="Population",
x="Area",
title="Scatterplot + Encircle",
caption="Source: midwest")
Jitter图
我们看看先用一组新的数据绘制散点图。这次,我将使用mpg数据集来绘制城市里程(cty)与公路里程。
虽然我们能够从图中看出,两个变量存在相关性。但是不难发现,很多散点被隐藏了,因为数据存在重叠的问题。由于cty和hvy两个变量都是整数,所以数据重叠的现象更加严重。对于这类数据集的散点图,展示过程中应该格外小心。
那么应该如何解决一个问题呢?我们可以使用jitter_geom()对数据增加抖动,通过设置wigth,使得重叠的点在原始位置随机抖动。
计数图
第二种解决散点重叠的方法是使用计数图。当数据存在散点重叠时,我们可以用散点大小来表达数据重叠的程度。
气泡图
虽然散点图能够表示两个连续变量间的相关关系。但如果想在以下两个方面了解数据间的潜在关系时,气泡图会更有用:
1.基于分类变量,修改散点颜色
2.基于另一个连续变量,表示散点的大小
简单来说,如果你有一个四维变量的数据,两个连续变量,一个分类变量用以表示颜色,一个连续变量表示点的大小,那么气泡图就非常适合了。
比如下面这个例子,气泡图清楚地区分了制造商之间的差异以及最佳拟合曲线的斜率变化,从而能够更好的比较不同组群间的差异。
# load package and data
library(ggplot2)
data(mpg, package="ggplot2")
# mpg <- read.csv("http://goo.gl/uEeRGu")
mpg_select <- mpg[mpg$manufacturer %in% c("audi", "ford", "honda", "hyundai"), ]
# Scatterplot
theme_set(theme_bw()) # pre-set the bw theme.
g <- ggplot(mpg_select, aes(displ, cty)) +
labs(subtitle="mpg: Displacement vs City Mileage",
title="Bubble chart")
g + geom_jitter(aes(col=manufacturer, size=hwy)) +
geom_smooth(aes(col=manufacturer), method="lm", se=F)
动态气泡图
对于动态气泡图的实现,可以使用gganimate包。动态气泡图和普通气泡图的区别就在于使用第五维数据(一般是时间)来展示数据间的变化。
动态气泡图的处理方法和其它图形基本一致,不同的是需要在aes层指定动画展示的变量。构建绘图后,可以使用gganimate()通过设置动画的时间间隔。
# Source: https://github.com/dgrtwo/gganimate
# install.packages("cowplot") # a gganimate dependency
# devtools::install_github("dgrtwo/gganimate")
library(ggplot2)
library(gganimate)
library(gapminder)
theme_set(theme_bw()) # pre-set the bw theme.
g <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, frame = year)) +
geom_point() +
geom_smooth(aes(group = year),
method = "lm",
show.legend = FALSE) +
facet_wrap(~continent, scales = "free") +
scale_x_log10() # convert to log scale
gganimate(g, interval=0.2)
边缘分布的直方图/箱型图
如果你想在用一张图表中显示两个变量的关系以及分布,那么可以使用边缘分布直方图。它可以在散点图的X、Y周,显示变量的直方图。
边缘分布直方图可以通过ggExtra包的ggMarginal()函数实现。除了绘制直方图外,还支持绘制边缘分布的箱型图和密度函数。
# load package and data
library(ggplot2)
library(ggExtra)
data(mpg, package="ggplot2")
# mpg <- read.csv("http://goo.gl/uEeRGu")
# Scatterplot
theme_