R绘图系列-ggplot2中50个最常用的图

这篇文章是从Top 50 ggplot2 Visualizations - The Master List (With Full R Code)选出了我自己之前比较少用,但是又挺有实际意义的图,这里记录学习一下。

背景

今天看到了这篇文章:Top 50 ggplot2 Visualizations - The Master List (With Full R Code),感觉里面有些解释和有些图也挺实用的,这里mark一下并挑选几个进行学习。


整数散点图重叠

散点图是绘图中很常用的一种图,其可以在很直观地显示变量之间相关关系的同时保留原始的数据特征。但是在对整数类型的数据进行散点图绘制中存在的问题是:数据点之间存在重叠,这样的话很多散点信息其实就被隐藏了(重叠的数据点在散点图上只表现为单个散点)。解决这种数据重叠的方法有两种:

  • Jitter Plot:给点增加扰动,使点与点之间分开
  • Counts Chart:点的大小表示数据点的密度

Jitter Plot

对每个点的位置添加了随机的变异.

It adds a small amount of random variation to the location of each point, and is a useful way of handling overplotting caused by discreteness in smaller datasets.

使用geom_jitter替换原始的geom_point

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
library(ggplot2)
library(gridExtra)
# 数据
data(mpg, package="ggplot2")

# 设置主题背景
theme_set(theme_bw()) # pre-set the bw theme.
# 普通的散点图
p1 <- ggplot(mpg, aes(cty, hwy)) +
geom_point() +
geom_smooth(method="lm", se=F) +
labs(subtitle="mpg: city vs highway mileage",
y="hwy",
x="cty",
title="Scatterplot with overlapping points",
caption="Source: midwest")

# 加了jitter
p2 <- ggplot(mpg, aes(cty, hwy)) +
geom_jitter(width = 0.5) +
geom_smooth(method="lm", se=F) +
labs(subtitle="mpg: city vs highway mileage",
y="hwy",
x="cty",
title="Jittered Points")
grid.arrange(p1,p2,nrow=1)

top_50_jitter_R.png

jitter图明显比原始的散点图点更多(扰动之后点分开了)。jitterwidth参数是控制点的离散程度的width值越大,那么图中的点与原始点之间的距离就越大。


Counts Chart

前面使用jitter解决整数数据散点图重叠有一个很大的问题就是改变了原始数据的值,虽然只是在原始点附近随机扰动,并不影响最终的结果,但这对于强迫症来说可能有点难受。这里给出另一种解决方案就是修改点的大小,如果多个点重叠在同一个位置,那么画的点就大一些,这样也能很好的区分。

使用geom_count替换geom_point

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
library(ggplot2)
library(gridExtra)
data(mpg, package="ggplot2")
# 设置主题背景
theme_set(theme_bw()) # pre-set the bw theme.
# 原始的散点图
p1 <- ggplot(mpg, aes(cty, hwy)) +
geom_point() +
geom_smooth(method="lm", se=F) +
labs(subtitle="mpg: city vs highway mileage",
y="hwy",
x="cty",
title="Scatterplot with overlapping points",
caption="Source: midwest")
# count chart
p3 <- ggplot(mpg, aes(cty, hwy)) +
geom_count(col="tomato3", show.legend=F) +
geom_smooth(method="lm", se=F) +
labs(subtitle="mpg: city vs highway mileage",
y="hwy",
x="cty",
title="Counts Plot")
grid.arrange(p1,p3,nrow=1)

top_50_count_R.png


选中部分画圈

选中部分的数据点,在图中将其圈起来(使用多边形圈起来,不是圆或者椭圆)。这个可以适用于PCA选中不同群的点以及其他任意想要圈起来的

这部分需要使用的是一个ggplot2插件:ggalt。所谓插件的意思就是可以在原有ggplot2图形的基础上添加语法即可完成想要的图。

安装

1
2
3
4
5
# 先安装proj
# 可以直接使用conda安装
conda install -c conda-forge proj
# proj安装完成之后再安装ggalt
install.packages("ggalt")

任意部分画圈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
library(ggplot2)
library(ggalt)
# 得到选中的区域
midwest_select <- midwest[midwest$poptotal > 350000 &
midwest$poptotal <= 500000 &
midwest$area > 0.01 &
midwest$area < 0.1, ]

# 画多边形将上面选中的圈起来
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")

常用参数:

  • expand:画的多边形向外扩的大小
  • color:多边形圈的颜色
  • size线的宽度

scatter_circle.png


PCA部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
library(ggplot2)
library(ggalt)
library(ggfortify)
theme_set(theme_classic())

# Compute data with principal components ------------------
df <- iris[c(1, 2, 3, 4)]
pca_mod <- prcomp(df) # compute principal components

# Data frame of principal components ----------------------
df_pc <- data.frame(pca_mod$x, Species=iris$Species) # dataframe of principal components
df_pc_vir <- df_pc[df_pc$Species == "virginica", ] # df for 'virginica'
df_pc_set <- df_pc[df_pc$Species == "setosa", ] # df for 'setosa'
df_pc_ver <- df_pc[df_pc$Species == "versicolor", ] # df for 'versicolor'

# Plot ----------------------------------------------------
ggplot(df_pc, aes(PC1, PC2, col=Species)) +
geom_point(aes(shape=Species), size=2) + # draw points
labs(title="Iris Clustering",
subtitle="With principal components PC1 and PC2 as X and Y axis",
caption="Source: Iris") +
coord_cartesian(xlim = 1.2 * c(min(df_pc$PC1), max(df_pc$PC1)),
ylim = 1.2 * c(min(df_pc$PC2), max(df_pc$PC2))) + # change axis limits
geom_encircle(data = df_pc_vir, aes(x=PC1, y=PC2)) + # draw circles
geom_encircle(data = df_pc_set, aes(x=PC1, y=PC2)) +
geom_encircle(data = df_pc_ver, aes(x=PC1, y=PC2))

pca_circle_ggplot.png


其他

其他有意思的图如分组之间连线(Slope Chart)哑铃图(Dumbbell Plot),具体可以直接看原文:Top 50 ggplot2 Visualizations - The Master List (With Full R Code),或者译文:50个ggplot2可视化案例




-----本文结束感谢您的阅读-----

本文标题:R绘图系列-ggplot2中50个最常用的图

文章作者:showteeth

发布时间:2019年10月23日 - 12:23

最后更新:2019年11月22日 - 11:17

原始链接:http://showteeth.tech/posts/59768.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%