一、简介

  上一篇中我们介绍了ggplot2的基本语法规则,为了生成各种复杂的叠加图层,需要了解ggplot2中一些基本的几何图形的构造规则,本文便就常见的基础几何图形进行说明;

二、各基础图形

2.1 abline()、hline()与vline()

  在R的基础绘图系统中我们可以在已绘制的图床上通过abline来添加线条,在ggplot2中当然也有类似的方法:

geom_abline():

  我们主要使用两个参数控制线条的位置,slope控制斜率,intercept控制截距,下面是一个简单的例子,我们在散点图层上叠加截距为20,斜率为2的直线:

library(ggplot2)

p <- ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
geom_abline(intercept = ,slope = )
p

geom_vline():

  如果你想添加的直线垂直于x轴,则可以使用geom_vline()来快捷地添加垂直线条,xintercept传入的参数即为线条在x轴上的位置,若传入向量则可同时添加多条线条:

library(ggplot2)

p <- ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
geom_vline(xintercept = )
p

p <- ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
geom_vline(xintercept = :)
p

geom_hline():

  同样的,我们通过在geom_hline()中传入参数yintercept来绘制垂直于y轴的线条:

p <- ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
geom_hline(yintercept = )
p

p <- ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
geom_hline(yintercept = :)
p

2.2 area()

  面积图也是一种很常用的图,多用于表现某些水平或比例类指标随时间的变化情况,下面是一个朴素的例子,以huron湖水水平变化数据为例:

library(ggplot2)

p <- ggplot(huron,aes(x=year,y=level))+
geom_area(fill='springgreen')
p

  实际上面积图最有表现力的类型是堆积面积图,下面以美国5个消费指标上5个年份的数据为例绘制堆积面积图:

library(ggplot2)
library(reshape2) #将原数据转置以处理成行对应一个年份的形式
data <- data.frame(t(USPersonalExpenditure))
#添加年份变量
data$year <- as.numeric(row.names(data))
#利用reshape2中的melt函数按照year列将原数据集伸展为“年份、变量名、对应数值”的形式
data <- melt(data, id='year') h <- ggplot(data, aes(x=year, y=value))+
geom_area(aes(fill=variable),position = 'fill')+
theme(legend.position = 'bottom')+
labs(title='堆积面积图')+
theme(plot.title = element_text(hjust=0.5))
h

  这样得到的图就比较具有美感和表现力,当然我们更改position参数也可以得到真实的水平逐年变化情况:

h <- ggplot(data, aes(x=year, y=value))+
geom_area(aes(fill=variable),position = 'identity')+
theme(legend.position = 'bottom')+
labs(title='堆积面积图')+
theme(plot.title = element_text(hjust=0.5))
h

2.3 bar()

  基础的条形图我们前面一篇中已经涉及到了,所以这里我们只与上述的堆积面积图进行对比,这里注意,geom_bar()默认的统计变换为count,即计算频数,我们这里想展示真实数值需要将geom_bar()中的stat设置为'identity',即不做任何变换:

library(ggplot2)
library(reshape2) data <- data.frame(t(USPersonalExpenditure))
data$year <- row.names(data)
data <- melt(data, id='year') p <- ggplot(data, aes(x=year,y=value))+
geom_bar(aes(fill=factor(variable)),stat = 'identity')+
labs(title='消费水平')+
theme(plot.title=element_text(hjust=0.5))
p

  可以看出这时我们的堆叠条形图便而可以看作离散的堆积面积图;

2.4 bin2d()

  二维热图也是一种非常实用的图像,我们可以用来一览数据的某两个变量上的指标分布情况:

library(ggplot2)

d <- ggplot(diamonds, aes(x, y))+
geom_bin2d()+
labs(title='钻石长宽分布')+
theme(plot.title=element_text(hjust=0.5))
d

  我们还可以利用bin2d()来直观的了解数据集的缺失情况:

library(ggplot2)
library(reshape2) #载入数据
data <- airquality
#统计缺失值位置并保存为矩阵
na.count <- is.na(data[,-]) #用1表示缺失,0表示未缺失
na.count[na.count == T] <-
na.count[na.count == F] <- #将Day按列与na.count拼接并转为数据框
na.count <- data.frame(cbind(na.count,data[,]))
names(na.count) <- names(airquality)
#利用melt以Day为b
na.count <- melt(na.count,id='Day')
#绘制数据集缺失情况概括图,以变量名为分面依据
p <- ggplot(na.count,aes(x=Day,y=value))+
geom_bin2d()+
facet_grid(facets = .~variable)
p

2.5 density()与density2d()

  很多时候当我们获取的数据集样本数量足够时,通常我们可以绘制密度估计图来大致描述数据集数据的分布,ggplot2中当然提供了这类方法,我们先从一维的说起:
geom_density():

  和R基本绘图系统中的密度曲线绘制方法很接近:

library(ggplot2)

data <- data.frame(matrix(rnorm(),nrow=))
v <- ggplot(data, aes(x=X1))+
geom_density(alpha=0.3,fill='springgreen',colour='springgreen')
v

geom_density2d():

  和density()类似,只是我们可以通过density2d来绘制二维变量的概率密度分布:

v <- ggplot(data, aes(X1, X2))+
geom_point()+
stat_density2d(aes(colour=..level..))
v

  也可以不绘制等高线,将..density..作为fill的传入参数,注意这里一定要设置contour为F:

# 密度图函数,通过fill设置填充颜色数据为密度,geom设置绘制栅格图
p <- ggplot(data, aes(x = X1, y = X2)) +
stat_density2d(aes(fill = ..density..), geom = "raster", contour = F)
p

  或是在透明度alpha上动手脚:

# 密度图函数:alpha设置填充透明度数据为密度,geom设置绘制栅格图
p <- ggplot(data, aes(x = X1, y = X2)) +
geom_point() +
stat_density2d(aes(alpha = ..density..), geom = "raster", contour = FALSE)
p

2.6 boxplot()

  在统计学描述数据分布的图形中,箱线图是非常有代表性的,它通过图形表现五数概括的情况,在数据基本的描述性统计中具有重要意义,而ggplot2中必然可以绘制箱线图,而且可以绘制得非常精美,下面先看一个最朴素的分组箱线图形式:

p <- ggplot(mpg, aes(class, hwy)) +
geom_boxplot()
p

我们为其赋以分组依据以配上颜色:

p <- ggplot(mpg, aes(class, hwy, fill=factor(class)))
p + geom_boxplot()

为我们的填充设置透明度,并将边框也赋以对应的颜色:

p <- ggplot(mpg, aes(class, hwy, fill=factor(class), colour=factor(class)))+
geom_boxplot(alpha=0.55)
p

  还可以将散点图与箱线图结合起来(这里施加jitter随机扰动以组织样本点重合):

p <- ggplot(mpg, aes(class, hwy, fill=factor(class), colour=factor(class)))+
geom_boxplot(alpha=0.55)+
geom_point(position = 'jitter')
p

2.7 histogram()

  关于直方图,因为前面也说过,这里就举几个由朴素的直方图扩展开的示例:

library(ggplot2)

p <- ggplot(diamonds, aes(carat)) +
geom_histogram()
p

p <- ggplot(diamonds, aes(carat,fill=cut)) +
geom_histogram()
p

p <- ggplot(diamonds, aes(carat, fill=cut)) +
geom_histogram()+
facet_grid(facets = .~cut)
p

2.8 curve()与segment()

  有时候我们需要在已绘制的图形中添加线段、曲线、小箭头之类的注解,这时候就可以用到ggplot2中的geom_curve()与geom_segment(),他们的主要参数类似,需要在aes()中定义起点坐标x、y,以及终点坐标xend、yend,如需要线段或曲线上带有小箭头,则额外定义参数arrow即可,箭头方向由之前的起点终点决定:

data <- data.frame(x=c(,,,),y=c(,,,))

p <- ggplot(data,aes(x,y))+
geom_point()
p p + geom_curve(data=data,aes(x=x[],y=y[],xend=x[],yend=y[],colour='曲线'))

在原有图形基础上添加线段并带上小箭头:

p + geom_curve(data=data,aes(x=x[],y=y[],xend=x[],yend=y[],colour='曲线'))+
geom_segment(data=data,aes(x=x[],y=y[],xend=x[],yend=y[],colour='直线'),
arrow = arrow(length = unit(0.02, 'npc')))

2.9 text()与label()

  有些时候我们需要在已绘制的图形上添加文本类标签,这种时候就需要用到text()和label()了,下面以不同的示例来说明其常见用法:

用对应每一个样本的文本标签代替散点

p <- ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars)))

p + geom_text()

对出现标签遮挡的情况进行抹除(不建议使用):

p + geom_text(check_overlap = TRUE)

使用别致的标签:

p + geom_label()

改变文本标签的大小:

p + geom_text(size = )

调整文字标签位置:

p + geom_point() + geom_text(hjust = , nudge_x = 0.05)

调整文字标签位置:

p + geom_point() + geom_text(vjust = , nudge_y = 0.5)

调整文本标签位置:

p + geom_point() + geom_text(angle = )

更精致的标签类型:

p + geom_label(aes(fill = factor(cyl)), colour = "white", fontface = "bold")

在图床指定位置添加文本标签:

df <- data.frame(
x = c(, , , , 1.5),
y = c(, , , , 1.5),
text = c("bottom-left", "bottom-right", "top-left", "top-right", "center")
)
ggplot(df, aes(x, y)) +
geom_text(aes(label = text))

可以看出,落入四角的标签因为其中心对应坐标点,导致部分内容伸出边界,这里我们令vjust = "inward", hjust = "inward"使得它自适应的调整位置以显示全部信息:

ggplot(df, aes(x, y)) +
geom_text(aes(label = text), vjust = "inward", hjust = "inward")

2.10 violin()

  小提琴图是一种功能和箱线图类似,但增加了核密度估计功能的图形,且更为美观,ggplot2可以绘制出与seaborn中的小提琴图同样优美的图形,因为涉及的内容比较复杂,我准备在之后单独开一篇来介绍,下面仅展示一张简单的小提琴图:

library(ggplot2)

data <- mtcars

p <- ggplot(data, aes(factor(cyl), mpg))+
geom_violin(aes(fill = cyl,colour=cyl))
p

  以上就是ggplot2中常规图形的简单介绍,其中比较重要且比较复杂的几种将会在之后单独开文章详细介绍,如有笔误,望指出。

(数据科学学习手札38)ggplot2基本图形简述的更多相关文章

  1. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

  2. (数据科学学习手札57)用ggplotly()美化ggplot2图像

    一.简介 经常利用Python进行数据可视化的朋友一定用过或听说过plotly这样的神器,我在(数据科学学习手札43)Plotly基础内容介绍中也曾做过非常详细的介绍,其渲染出的图像以浏览器为载体,非 ...

  3. (数据科学学习手札42)folium进阶内容介绍

    一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...

  4. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

  5. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  6. (数据科学学习手札47)基于Python的网络数据采集实战(2)

    一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...

  7. (数据科学学习手札44)在Keras中训练多层感知机

    一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...

  8. (数据科学学习手札40)tensorflow实现LSTM时间序列预测

    一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...

  9. (数据科学学习手札36)tensorflow实现MLP

    一.简介 我们在前面的数据科学学习手札34中也介绍过,作为最典型的神经网络,多层感知机(MLP)结构简单且规则,并且在隐层设计的足够完善时,可以拟合任意连续函数,而除了利用前面介绍的sklearn.n ...

随机推荐

  1. ES6 Map遍历、filter()筛选对象

    目录: -------- 1.map() -------- 2.filter(): ------------- 2.1.filter函数可以看成是一个过滤函数,返回符合条件的元素的数组 ------- ...

  2. CodeIgniter框架学习要点

    以下内容从兄弟连的CI教学视频中摘抄: http://codeigniter.org.cn/tutorials/ ------------------------------------------- ...

  3. Mutual Training for Wannafly Union #2

    codeforces 298A. Snow Footprints 分类讨论三种情况: ①..RRRRRR…  ②..LLLLLLL… ③..RRRLLLL.. //AC by lwq: #includ ...

  4. BZOJ 2818 GCD 【欧拉函数 || 莫比乌斯反演】

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=2818 2818: Gcd Time Limit: 10 Sec  Memory Limit ...

  5. 如何选择PHP项目的开发方案?

    我说的项目开发方案并不是谈论到底用不用PHP去开发的问题,而是当你遇到一个项目,已经决定了用PHP,然后才来看的问题:用PHP的什么开发方案. 基本上有这么几种方案.各有各的说法,良莠不齐,我就谈谈我 ...

  6. JDBC(4)PreparedStatement

    PreparedStatement: 是一个预编译对象 是Statement的子接口 允许数据库预编译SQL 执行SQL的时候,无需重新传入SQL语句,它们已经编译SQL语句 执行SQL语句 :exe ...

  7. resnet densenet

    1.resnet的skip connection是通过eltwise相加的 2.resnet做detection的时候是在conv4_x的最后一层(也就是stage4的最后一层),因为这个地方stri ...

  8. VC++读写*.ini配置文件

    ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息.ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Ke ...

  9. ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)

    ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了, ...

  10. Xcode-push到远程仓库不能使用邮箱名,需使用昵称

    1.Xcode-push到远程仓库不能使用邮箱 2.Xcode-push到远程仓库需使用昵称