网站首页 > 基础教程 正文
ggplot2并不是R绘制图形的唯一方法。要快速探索数据,有时使用R基础包中的绘图函数会很有用。这些函数随R软件默认安装,无需另行安装附加包。它们简短易输入,处理简单问题时使用方便,且运行速度极快。
如果你想绘制较为复杂的图形,那么,转用ggplot2包通常是更好的选择。部分原因在于ggplot2提供了一个统一的接口和若干选项来替代基础绘图系统中对图形的修修补补和各种特例。一旦掌握了ggplot2的工作机制,你就可以应用这些知识来绘制从散点图、直方图到小提琴图和地图等各种统计图形了。
本文介绍的技巧演示了用基础绘图系统绘制统计图形的方法,也对如何用ggplot2中的qplot()函数绘制同样的图形做出了说明。qplot()函数的语法与基础绘图系统类似,对于每一个由qplot()函数绘制的图形,技巧中也提供了用更强大的ggplot()函数来绘图的等价解决方案。
如果你已经知道如何使用基础图形系统,那么当你想绘制更复杂的图形时,可以将这些例子放在一起进行对比以帮助你过渡到ggplot2系统。
1 绘制散点图
问题
如何绘制散点图?
方法
使用plot()函数可绘制散点图(见图1),运行命令时依次传递给plot()函数一个向量x和一个向量y。
plot(mtcars$wt,mtcars$mpg)
对于ggplot2系统,可用qplot()函数得到相同的绘图结果(见图2):
library(ggplot2)
qplot(mtcars$wt, mtcars$mpg)
如果绘图所用的两个参数向量包含在同一个数据框内,则可以运行下面的命令:
qplot(wt,mpg,data=mtcars)
#这与下面等价
ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point()
2 绘制折线图
问题
如何绘制折线图?
方法
使用plot()函数绘制折线图(见图3左图)时需向其传递一个包含x值的向量和一个包含y值的向量,并使用参数type="l":
plot(pressure$temperature, pressure$pressure, type="l")
如果要向图形中添加数据点或者多条折线(见图3右图),则需先用plot()函数绘制第一条折线,再通过points()函数和lines()函数分别添加数据点和更多折线:
plot(pressure$temperature, pressure$pressure, type="l")
points(pressure$temperature,pressure$pressure)
lines(pressure$temperature, pressure$pressure/2, col="red")
points(pressure$temperature, pressure$pressure/2, col="red")
在ggplot2中,可以使用qplot()函数并将参数设定为geom="line"得到类似的绘图结果(见图4):
library(ggplot2)
qplot(pressure$temperature, pressure$pressure, geom="line")
如果函数的两个参数向量已包含在同一个数据框中,则可以运行下面的语句:
qplot(temperature,pressure, data=pressure, geom="line")
# 这等价于下面的命令
ggplot(pressure, aes(x=temperature, y=pressure)) + geom_line()
# 添加数据点
qplot(temperature, pressure, data=pressure, geom=c("line", "point"))
# 这等价于下面的命令
ggplot(pressure, aes(x=temperature, y=pressure)) + geom_line() + geom_point()
3 绘制条形图
问题
如何绘制条形图?
方法
对变量的值绘制条形图(见图5左图),可以使用barplot()函数,并向其传递两个向量作为参数,第一个向量用来设定条形的高度,第二个向量用来设定每个条形对应的标签(可选)。
如果向量中的元素已被命名,则系统会自动使用元素的名字作为条形标签:
barplot(BOD$demand, names.arg=BOD$Time)
有时候,“条形图”表示的是分组数据中各个元素的频数(见图5右图)。这种条形图跟直方图有些类似,不过,其用离散取值的x轴替代了直方图中连续取值的x轴。要计算向量中各个类别的频数,可以使用table()函数。
table(mtcars$cyl)
4 6 8
11 7 14
# 值为4的频数为11,6的为7,8的为14
只需将上面的表格结果传递给barplot()函数即可绘制频数条形图:
# 生成频数表
barplot(table(mtcars$cyl))
对于ggplot2系统,可以使用qplot()函数得到类似的绘图结果(见图6)。绘制变量值的条形图时需将参数设定为geom="bar"和stat="identity"。注意变量x分别为连续取值和离散取值时输出结果的差异。
library(ggplot2)
qplot(BOD$Time, BOD$demand, geom="bar", stat="identity")
# 将x转化为因子型变量,令系统将其视作离散值
qplot(factor(BOD$Time), BOD$demand, geom="bar", stat="identity")
图6 左图:qplot()函数绘制的连续变量x的变量值条形图 右图:将变量x转化为因子型变量(注意,横坐标上没有6这个类别)
qplot()函数也可以用来绘制分组变量的频数条形图(见图7),事实上,这是ggplot2绘制条形图的默认方式,它比绘制变量值条形图的命令更简短。再提醒一次,注意连续x轴和离散x轴的差异。
# cyl是连续变量
qplot(mtcars$cyl)
# 将cyl转化为因子型变量
qplot(factor(mtcars$cyl))
图7 左图:qplot()函数绘制的连续变量x的频数条形图 右图:将cyl转化为因子型变量
如果参数向量包含在同一个数据框内,则可以运行下面的语句:
# 变量值条形图,这里用BOD数据框中的Time列
# 和demand列分别作为x和y参数
qplot(Time, demand, data=BOD, geom="bar", stat="identity")
# 这与下面的语句等价
ggplot(BOD, aes(x=Time, y=demand)) + geom_bar(stat="identity")
# 频数条形图
qplot(factor(cyl), data=mtcars)
# 这与下面的语句等价
ggplot(mtcars, aes(x=factor(cyl))) + geom_bar()
4 绘制直方图
问题
如何绘制直方图来查看一维数据的分布特征?
方法
可以使用hist()函数绘制直方图(见图8),使用时需向其传递一个向量:
hist(mtcars$mpg)
# 通过breaks参数指定大致组距
hist(mtcars$mpg,breaks=10)
图8 左图:基础绘图系统绘制的直方图 右图:使用更多分组。注意:由于组距变小,每组对应的样本数有所减少
对于ggplot2包,可以使用qplot()函数得到同样的绘图结果(见图9):
qplot(mtcars$mpg)
图9 左图:ggplot2中qplot()函数绘制的直方图,组距为默认值 右图:组距更大的直方图
如果参数向量在同一个数据框内,则可以使用下面的语句:
library(ggplot2)
qplot(mpg, data=mtcars, binwidth=4)
# 这等价于
ggplot(mtcars, aes(x=mpg)) + geom_histogram(binwidth=4)
5 绘制箱线图
问题
如何绘制箱线图以对不同分布进行比较?
方法
使用plot()函数绘制箱线图(见图10)时向其传递两个向量:x和y。当x为因子型变量(与数值型变量对应)时,它会默认绘制箱线图:
plot(ToothGrowth$supp, ToothGrowth$len)
当两个参数向量包含在同一个数据框中时,也可以使用公式语法。公式语法允许我们在x轴上使用变量组合,如图 10 所示。
# 公式语法
boxplot(len ~ supo, data = ToothGrowth)
# 在x轴上引入两变量的交互
boxplot(len ~ supp + dose, data = ToothGrowth)
图10 左图:基础绘图系统绘制的箱线图 右图:基于多分组变量的箱线图
对于ggplot2包,你可以使用qplot()函数绘制同样的图形(见图11),使用时将参数设定为geom="boxplot":
library(ggplot2)
qplot(ToothGrowth$supp, ToothGrowth$len, geom="boxplot")
图11 左图:qplot()函数绘制的箱线图 右图:基于多分组变量的箱线图
当两个参数向量在同一个数据框内时,则可以使用下面的语句:
qplot(supp, len, data=ToothGrowth, geom="boxplot")
# 这等价于
ggplot(ToothGrowth, aes(x=supp,y=len)) + geom_boxplot()
使用interaction()函数将分组变量组合在一起也可以绘制基于多分组变量的箱线图,如图11右图所示。本例中,dose变量是数值型,因此,我们必须先将其转化为因子型变量,再将其作为分组变量:
# 使用三个独立的向量参数
qplot(interaction(ToothGrowth$supp, ToothGrowth$dose), ToothGrowth$len,geom="boxplot")
# 也可以以数据框中的列作为参数
qplot(interaction(supp, dose), len, data=ToothGrowth, geom="boxplot")
# 这等价于
ggplot(ToothGrowth, aes(x=interaction(supp, dose), y=len)) + geom_boxplot()
你可能会注意到基础绘图系统绘制的箱线图与ggplot2略有不同。这是因为两者在绘图过程中调用的计算分位数的方法略有差异。运行?geom_boxplot和?boxplot.base命令可以得到更多关于两者差异的细节信息。
6 绘制函数图像
问题
如何绘制函数图像?
方法
可以使用curve()函数绘制函数图像,如图12左图所示。使用时需向其传递一个关于变量x的表达式:
curve(x^3 - 5*x, from=-4, to=4)
你可以绘制任何一个以数值型向量作为输入且以数值型向量作为输出的函数图像,包括你自己定义的函数,如图12右图所示。
图12 左图:基础绘图系统绘制的函数图像 右图:绘制用户自定义的函数
将参数设置为add=TRUE可以向已有图形添加函数图像:
# 绘制用户自定义的函数图像
myfun <- function(xvar) {
1/(1 + exp(-xvar + 10))
}
curve(myfun(x), from=0, to=20)
# 添加直线
curve(1-myfun(x), add = TRUE, col ="red")
对于ggplot2,可以使用qplot()函数绘制得到同样的结果(见图13)。使用时需设定stat="function"和geom="line",并向其传递一个输入和输出皆为数值型向量的函数:
library(ggplot2)
# 将x轴的取值范围设定为0到20
qplot(c(0, 20), fun=myfun, stat="function", geom="line")
# 这等价于
ggplot(data.frame(x=c(0, 20)), aes(x=x)) + stat_function(fun=myfun, geom="line")
本文节选自《R数据可视化手册》
内容简介
R具有强大的统计计算功能和便捷的数据可视化系统。本书重点讲解R的绘图系统,指导读者通过绘图系统实现数据可视化。书中提供了快速绘制高质量图形的150多种技巧,每个技巧用来解决一个特定的绘图需求。读者可以通过目录快速定位到自己遇到的问题,查阅相应的解决方案。同时,作者在大部分的技巧之后会进行一些讨论和延伸,介绍一些总结出的绘图技巧。
本书侧重于解决具体问题,是R数据可视化的实战秘籍。本书中绝大多数的绘图案例都是以强大、灵活制图而著称的R包ggplot2实现的,充分展现了ggplot2生动、翔实的一面。从如何画点图、线图、柱状图,到如何添加注解、修改坐标轴和图例,再到分面的使用和颜色的选取等,本书都有清晰的讲解。虽然本书的大多数技巧使用的是ggplot2,但是并不仅仅局限于ggplot2的介绍。作者的理念是用合适的工具来完成合适的绘图任务,读者也可以学到许多其他有用的绘图函数和工具,来适应各种复杂的需求。
本书是学习R中丰富的数据可视化方法的权威手册,非常适合对R语言有基本的了解的读者阅读。
- 上一篇: Python操作Redis,你要的都在这了!
- 下一篇: 如何消除多重共线性 如何消除多重共线性?
猜你喜欢
- 2024-10-12 R数据分析:倾向性评分匹配实例操作
- 2024-10-12 要为学习神经网络奠定基础,你需要认真读读R深度学习
- 2024-10-12 怎样快速入门Arduino?(二十三)—TCS3200颜色传感器
- 2024-10-12 把数据输入R之后,如何进行简单的操作(一)
- 2024-10-12 聚类分析5—物种集合-数量生态学:R语言的应用 第四章
- 2024-10-12 一文读懂R中的探索性数据分析(附R代码)
- 2024-10-12 从0开始自制解释器——添加对括号的支持
- 2024-10-12 常见编程语言:Go:Go语言函数与方法
- 2024-10-12 Python基础之变量、循环、函数(二)
- 2024-10-12 R语言中使用scan函数从键盘获取数据的方法
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)