散点图可以用来描述两个连续变量之间的关系,一般在做数据探索分析时会使用到,通过散点图发现变量之间的相关性强度、是否线性关系等。
1.绘制简单的散点图
library(ggplot2)
set.seed(123)
x <- rnorm(100,mean = 2,sd = 3)
y <- 1.5+2*x+rnorm(100)
df <- data.frame(x = x,y = y)
ggplot(df,aes(x = x,y = y))+geom_point()
2.绘制分组的散点图
可将分组变量(因子或字符变量)赋值给颜色或形状属性,实现分组散点图的绘制
set.seed(112)
x <- rnorm(100,mean = 2,sd = 3)
y <- 1.5+2*x+rnorm(100)
z <- sample(c(0,1),size = 100,replace = TRUE)
df <- data.frame(x = x,y = y,z = z)
# 将数值型变量转换为因子型变量
df$z <- factor(df$z)
#分组变量赋值给颜色属性
ggplot(df,aes(x = x,y = y,colour = z))+
geom_point(size = 3)
#分组变量赋值给形状属性
ggplot(df,aes(x = x,y = y,shape = z))+
geom_point(size = 3)
# 分组变量同时赋给颜色属性和形状属性
ggplot(df,aes(x = x,y = y,shape = z,colour = z))+
geom_point(size = 3)+
scale_color_brewer(palette = "Accent")+
scale_shape_manual(values = c(2,16))
注意点的形状,21-25之间的点的形状,既可以赋值边框颜色,又可以赋值填充色。
3.将离散型变量或因子映射给颜色属性或形状属性
x <- c(10,13,11,15,18,20,21,22,24,26)
y <- c(76,60,70,58,55,48,44,40,26,18)
z <- c(100,120,300,180,80,210,30,95,145,420)
df <- data.frame(x = x,y = y,z = z)
# 将连续型变量映射给颜色属性
ggplot(df,aes(x = x,y = y,colour = z))+
geom_point(size = 3)
图例上,颜色越深而对应的值越小,如何将值的大小与颜色的深浅保持一致?只需要人为的设置色阶,从低到高设置不同的颜色即可
# 将连续型变量映射给颜色属性,同时设置双色梯度
ggplot(df,aes(x = x,y = y,colour = z))+
geom_point(size = 3)+
scale_colour_gradient(low = "lightblue",high = "darkblue")
# 将连续变量映射给大小属性
ggplot(df,aes(x = x,y = y,size = z))+
geom_point()
# 将连续型变量赋给颜色属性或大小属性,自定义双色梯度,色阶间隔顺序由低到高
ggplot(df,aes(x = x,y = y,fill = z))+
geom_point(shape = 21,size = 3)+
scale_fill_gradient(low = "lightblue",high = "darkblue",breaks = c(100,150,200,300,350,400))
# 自定义球大小的间隔
ggplot(df,aes(x = x,y = y,size = z))+
geom_point()+
scale_size_continuous(breaks = c(100,150,200,250,300,350,400),guide = guide_legend())
# scale_size(breaks = c(100,150,200,250,300,350,400))结果一样
# 将连续变量值的大小与球的大小成比例
ggplot(df,aes(x = x,y = y,size = z))+
geom_point()+
scale_size_area(max_size = 10)
# scale_size_area()可以确保数值0映射为0,max_size保证映射最大的点的大小
4.重叠点的处理
当数据点非常多时,可能会导致数据点重叠严重,处理方法如下:
1)使用半透明的点
2)数据分箱,并用矩形表示{stat_bin2d()}
3)数据分箱,并用六边形表示{stat_binhex()}
4)使用二维密度估计,并将等高线添加到散点图中{stat_density2d()}
5)向散点图中添加边际地毯
set.seed(112)
x <- rnorm(10000)
y <- rnorm(10000,0,2)
df <- data.frame(x = x,y = y)
# 不作任何处理
ggplot(df,aes(x = x,y = y))+
geom_point()
# 使用透明度处理点的重叠问题
ggplot(df,aes(x = x,y = y))+
geom_point(alpha = 0.1)
# 分箱,并用矩阵表示
ggplot(df,aes(x = x,y = y))+
stat_bin2d()
默认情况下,stat_bin2d()函数将x轴和y轴的数据点各分位30段,即参数900个箱子;用户还可以自定义分段个数,以及箱子在垂直和水平方向上的宽度。
# 设置bins为50,
ggplot(df,aes(x = x,y = y))+
stat_bin2d(bins = 50)+
scale_fill_gradient(low = "steelblue",high = "darkred",limits = c(0,100),breaks = c(0,25,50,100))
分箱的具体做法是,将点分箱,并统计每个箱中点的个数,然后通过某种方法可视化这个数量。
# 分箱,用六边形表示,箱子水平和竖直方向的宽度各为0.2,0.3;
# 图例标度范围0-100,显示在图例上的值(0,25,50,100)
ggplot(df,aes(x = x,y = y))+
stat_bin_hex(binwidth = c(0.2,0.3))+
scale_fill_gradient(low = "lightgreen",high = "darkred",limits=c(0,100),breaks = c(0,25,50,100))
# 使用stat_density2d作二维密度估计,并将等高线添加到散点图中
ggplot(df,aes(x = x,y = y))+
geom_point()+
stat_density2d()
#使用大小与分布密度成正比例的点,不添加等高线
ggplot(df,aes(x = x, y = y)) +
stat_density2d(geom = 'point', aes(size = ..density..),
contour = FALSE) +
scale_size_area()
#使用瓦片图展示数据分布密度情况
ggplot(df,aes(x = x, y = y)) +
stat_density2d(geom = 'tile',aes(fill = ..density..),
contour = FALSE)
#向散点图中添加边际地毯(轴须线)
ggplot(faithful,aes(x = eruptions, y = waiting)) +
geom_point() + geom_rug()
#通过边际地毯,可以快速查看每个坐标轴上数据的分布密疏情况。还可以通过向边际地毯线的位置坐标添加扰动并设定size减少线宽,从而减轻边际地毯线的重叠程度。
ggplot(faithful, aes(x = eruptions, y = waiting)) +
geom_point() +
geom_rug(position = 'jitter', size = 0.1)
6.如果一个变量为离散变量,另一个变量为连续变量时,如何绘制散点图?
set.seed(1234)
x <- rep(1:5, each = 1000)
y <- c(rnorm(1000),rnorm(1000,1,2),rnorm(1000,3,4),rt(1000,2),rt(1000,4))
df <- data.frame(x = x, y = y)
df$x <- factor(df$x)
#不作任何处理的散点图
ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point()
上图中也出现了严重的重叠,有以下两种处理方法:
1)使用扰动图(位置调整)
2)使用箱线图(适用于一个或两个变量为离散变量)
# 给数据点添加随机扰动
ggplot(df,aes(x = x,y = y)) +
geom_point(position = "jitter")
默认情况下,扰动函数在每个方向(水平和垂直)上添加的扰动值为数据点最小精度的40%,
当然也可以通过width和height参数自定义扰动量。
# 只在水平方向上添加50%的扰动量
ggplot(df,aes(x = x,y = y))+
geom_point(position = position_jitter(width = 0.5,height = 0))
# 绘制箱线图
ggplot(df,aes(x = x,y = y))+
geom_boxplot(aes(group = x),fill = "steelblue")
这里需要注意的是,横坐标为数值型变量时,必须要将其转换为因子,并在geom_boxplot()函数的属性中将因子映射给group,否则产生的效果图将是错误的。
如何在散点图的基础上再添加拟合曲线呢?下文将逐一介绍几种拟合线。
#不添加任何拟合线
ggplot(iris,
aes(x = Petal.Length, y = Petal.Width, colour = Species)) +
geom_point()
#添加线性拟合线
ggplot(iris,aes(x = Petal.Length, y = Petal.Width, colour = Species)) +
geom_point() +
geom_smooth(method = 'lm')
# stat_smooth(method = "lm") 结果一样
# 添加局部加权多项式曲线
ggplot(iris,aes(x = Petal.Length,y = Petal.Width,colour = Species))+
geom_smooth(method = "loess")
# 添加逻辑斯特曲线
library(MASS)
b <- biopsy # 载入数据集
# 绘制logistic曲线必须将因变量强制转换为0-1
b <- transform(b,class_trans = ifelse(class == "benign",0,1))
ggplot(b,mapping = aes(x = V1, y = class_trans))+
geom_point(position = position_jitter(width = 0.3,height = 0.6),
alpha = 0.4,shape = 21,size = 2)+
geom_smooth(method = glm,method.args=list(family = "binomial"),se = FALSE)
# glm模型必须指定参数family = "binomial",R内部才会调用逻辑斯特回归模型。
7.如果两个变量均是离散变量,该如何绘制散点图?实质上,这样的散点图我们称作气泡图。一般可以将这种图应用到价值转移中。
value1 <- rep(c('高价值','中价值','低价值'), each = 3)
value2 <- rep(c('高价值','中价值','低价值'), times = 3)
nums <- c(500,287,123,156,720,390,80,468,1200)
df <- data.frame(value1 = value1, value2 = value2, nums = nums)
df$value1 <- factor(df$value1, levels = c('高价值','中价值','低价值'), order = TRUE)
df$value2 <- factor(df$value2, levels = c('低价值','中价值','高价值'), order = TRUE)
ggplot(df,aes(x = value1, y = value2, size = nums)) +
geom_point(colour = 'steelblue') +
scale_size_area(max_size = 30, guide = FALSE) +
geom_text(aes(label = nums), vjust = 0, colour = 'black', size = 5)
8.Cleveland点图和散点图矩阵
set.seed(1234)
names <- letters
Score <- runif(26, min = 55, max = 90)
df <- data.frame(names = names, Score = Score)
# 条形图
ggplot(df,aes(x = reorder(names,Score), y = Score)) +
geom_bar(stat = 'identity', fill = 'steelblue', colour = 'black') +
xlab('Name') +
geom_text(aes(label = round(Score)), vjust = 1)
# Cleveland 点图
ggplot(df,aes(x = reorder(names,Score), y = Score)) +
geom_point(size = 5, shape = 21, fill = 'steelblue',
colour = 'black') +
xlab('Name')
#使用pairs()函数绘制散点图矩阵
data(tips, package = "reshape")
pairs(tips[,1:3])
#使用GGally包中的ggpairs()函数绘制散点图矩阵
library(GGally)
ggpairs(tips[, 1:3])