虽然现在ggplot 的优雅的图像语法已经非常多了。可还是偶有base 绘图的使用场景:
技多不压身~~
我们直接使用R 中自带的数据框 mtcars 进行处理:
Format:
A data frame with 32 observations on 11 (numeric) variables.
[, 1] mpg Miles/(US) gallon
[, 2] cyl Number of cylinders
[, 3] disp Displacement (cu.in.)
[, 4] hp Gross horsepower
[, 5] drat Rear axle ratio
[, 6] wt Weight (1000 lbs)
[, 7] qsec 1/4 mile time
[, 8] vs Engine (0 = V-shaped, 1 = straight)
[, 9] am Transmission (0 = automatic, 1 = manual)
[,10] gear Number of forward gears
[,11] carb Number of carburetors
> str(mtcars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
使用attach 方便对该数据框的调用,结束处理后不要忘记detach一下。
attach(mtcars)
> length(wt)
[1] 32
让我们初次尝试一下吧~
> plot(wt, mpg) # 散点图,wt~mpg 作图
> abline(lm(mpg~wt)) # 添加直线,为两个变量拟合结果
> title("Our first plot") # 添加标题
image.png
plot() # 散点图
hist() # 直方图
barplot() # 条形图
boxplot() # 箱线图
通过type,我们可以让散点图中的点连接起来:
> plot(1:5, 1:5, type = 'b')
image.png
我们可以通过图形参数par 统一修改一幅图形的多个特征(字体、颜色、坐标、标签等)。文档中的介绍:
?par
Description:
‘par’ can be used to set or query graphical parameters.
Parameters can be set by specifying them as arguments to ‘par’
in ‘tag = value’ form, or by passing them as a list of tagged
values.
在每一句的开头我们可以保存默认的图形参数设置,这样以便于还原初始的图形参数:
opar = par(no.readonly = TRUE)
# 结束绘图后再恢复
par(opar)
我们可以修改par 中的参数来对图形进行修改:
cex # 图形属性的缩放倍数,默认为1,如1.5 为原来的1.5倍。
# 1.符号和线条
lty # 线条类型,如2 为虚线
lwd # 线条的宽度,如1 为最粗
pch # 点符号类型,如17 为实心三角
# 2. 颜色
col # 默认绘图颜色,如 col = c('red', 'blue')
col.axis # 坐标轴刻度的颜色
col.lab # 坐标轴的名字颜色
col.main # 标题的名字颜色
col.sub # 副标题的名字颜色
fg # 图形的前景色
bg # 图形的后景色
# 3. 文本属性
cex.axis # 同cex,只是控制坐标轴刻度文字的缩放倍数。
cex.lab # 坐标轴名称缩放。
cex.main # 标题的缩放。
cex.sub # 副标题的缩放。
font # 整数。指定绘图使用的字体样式。1=常规,2=粗体,3=斜体,5=符号字体 Adobe 编码。
font.axis # 坐标轴刻度字体
font.lab # 坐标轴名称..
font.main
font.sub
ps # 字体磅值,一磅约1/72英寸,文本最终大小为ps*cex。
family # 绘制文本时使用的字体族。
# 标准取值为serif,sans,momo。
# 4. 图形尺寸和边界
pin # 以英寸表示的图形尺寸(宽和高)
mai # 以数值向量表示的边界大小,顺序为下、左、上、右,单位为英寸;如c(1,1,1,1)。
mar # 同上,单位为英分。(十二分之一英寸)
在R 中,对于颜色,我们还可以通过颜色下标、十六进制的颜色值、RGB值及HSV值来设定。如 col = 1, col = 'white', col = '#FFFFFF', col = (1, 1, 1),col = hsv(0,0,1) 都是表示白色。
我们可以通过如函数colors() 获得所有可用的颜色,如果想要了解更多有关颜色的信息,可以参考:https://www.yuque.com/mugpeng/rr/tuien8/
对于字体族来说,三种标准取值的映射和设备有关,即Windows 和mac 中结果可能会有不同。mac os 中的serif 字体:
另外我们也可以使用自定义的映射创建,如mac 中,使用函数quartzFonts() 创建:
quartzFonts(
A=quartzFonts("Arial Black"),
B=quartzFonts("Bookman Old Style"),
C=quartzFonts("Comic Sans MS")
)
在windows中则使用函数windowsFonts(),之后就可以给famliy 赋值使用ABC中的字体了。
如果是生成图片时自定义字体,可以在保存时添加参数,如pdf:
pdf(file = "name.pdf", family = "Bookman Old Style")
就可以保存为指定格式字体,而无需创建映射了。
需要注意的是,在绘图画板上修改,必须创建映射,否则无法对family 进行赋值,出现字体无法显示情况。
通过图形参数部分的内容,我们不难发现,除了通过图形函数par 外,许多绘图函数本身也可以设置图形参数:
plot(1:5,2:6, col = c('red'), type = 'b', lty = 6)
image.png
同样的,对于文本、坐标轴、图例这些选项,也可以自行在绘图函数中设定参数。
title(),有以下参数:
main # 标题
col.main # 标题颜色
sub # 副标题
col.sub # 副标题颜色
xlab # x轴
ylab # y轴
col.lab # 坐标轴名字颜色
# 颜色部分可以在图形参数中记忆,方便记忆
axis(),有以下参数:
side # 整数,表示图形哪边绘制坐标轴,1下,2左,3上,4右。
at # 数值向量,自定义坐标轴的刻度。
labels # 字符型向量,指定刻度线上的文字标签,默认下使用at 的数字直接注释。
pos # 坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值)。
las # 标签是否平行,0;或者垂直,2,于坐标轴。
tck # 刻度线的长度,相对于绘图区域的大小分数表示(负值表示在图形外,正表示在图形内,0为禁用,1 为绘制网格线)
范例:
> plot(1:5, ann = F, las = 2)
> axis(side = 1, tck = 1, las = 2)
image.png
abline(),可以在指定的x或y 轴位置添加参考线,其中h 添加水平实线,v 添加竖直实线:
> plot(1:5)
> abline(h=seq(1,10,2))
image.png
另外,我们可以添加自定义的线段,如开始前
中举例的拟合的线段:
> abline(lm(mpg~wt)) # 添加直线,为两个变量拟合结果
legend(),常用选项包括:
x,y # 指定图例所在的坐标位置,坐标可以通过locator 函数获取。
# 也可以直接指定位置,有bottom, bottomleft, top, topleft, center 等。
title # 图例标题的字符串
legend # 图例的名字
horiz # 默认F,T则会水平放置图例
text() 或mtext() 可以添加文本到图形上,其中text() 会将文本添加到图形上,而mtext() 则是向图形的四个边界添加文本。
如果你是在具有图形界面的系统中使用R,则可以通过下面的函数,在图形界面上选择某个点,获取其坐标:
> locator(1)
# 点一下你的绘图Quartz界面
$x
[1] 1.634064
$y
[1] 4.05972
一般来说,绘图函数如barplot等,都已经包含了默认的标题和标签,我们可以重置它们:
par(ann = FALSE)
看看哪里不同了~
这么做的主要一个目的就是,如果我们按照默认设置,它可能会给图像画一些我们不想要的东西,比如坐标轴的名称,这时候如果我们不注意,再添加一个名字,则会造成图形堆叠,这个还需要额外的处理,比较麻烦:
> plot(1:5)
> title(xlab = 'ruok')
image.png