ggplot2 | ggplot2作图语法入门

ggplot2是R语言中最流行的绘图工具包,其风格与基础绘图系统差别很大,且彼此的函数也不能兼容:

  • 通过前面的推文介绍可以看出,基础绘图系统主要是通过一个主函数配合多个辅助函数来完成绘图,各个绘图函数一方面共享来自par函数的参数,另一方面又有各自专用的参数;

  • ggplot2工具包则是将绘图过程分为创建画布和导入数据、绘制图形、设置标度、要素美化等几个独立的任务,每个函数只完成其中一项任务,然后通过+连接各个类型的函数来完成一幅图形的绘制,具体地,

  • ggplot函数:创建绘图画布和导入供全局函数使用的数据集;

  • geom_*系列函数:专门的图形绘制函数或导入仅供该函数使用的数据集;

  • scale_*系列:专门控制各类要素标度的函数;

  • theme函数:专门对各类要素进行美化修饰的函数。

ggplot2工具包虽然对各类函数采取了统一的命名方式,但相比基础绘图系统,其函数数量还是显得特别庞大,短时间内很难完全掌握。本篇推文目的在于通过一个绘图案例对ggplot2绘制图形的过程进行一个入门性的介绍。示例数据来自mtcars数据集:

library(ggplot2)
data <- mtcars
head(data)

##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

1 ggplot函数

ggplot函数主要有两个功能:一是创建绘图画布,代表着绘图的开始;二是导入绘图所需的数据。它有两个参数:

ggplot(data = NULL, mapping = aes())
  • data:绘图变量所在的数据框;

  • mapping:绘图所需的变量或其他用于映射的变量。

  • mapping参数是通过aes函数来赋值的,该函数为映射函数,它的参数赋的值只能是数据框中的变量名。

如以wt变量为横坐标,drat变量为纵坐标:

ggplot(data = data,
       mapping = aes(x = wt, y = drat)) -> p
p
  • ggplot函数没有默认的绘制图形;

  • 输出图形可以作为对象赋值给变量,并且该变量还可以打印出图形,这是基础绘图系统所不具备的功能。

2 绘制图形的函数

ggplot2包中专门用于绘制图形的函数均以geom_开头进行命名,如geom_point用于绘制散点图、geom_line绘制折线图,geom_bar绘制条形图,geom_boxplot绘制箱型图,还有geom_hlinegeom_vline分别用于绘制水平和垂直的直线,等等。这些函数的后缀基本上和基础绘图系统相应的函数一致。

以散点图和折线图为例,通过+可以很便捷地实现不同图形的叠加:

p +
  geom_line() +
  geom_point()
  • geom_*系列的函数能自动继承ggplot设置的数据框和绘图变量信息;

  • 图层叠加的规则是+后的函数绘制的图形在+前的函数绘制的图形之上。

geom_*函数也可以自定义自己所需的绘图变量:

p +
  geom_line() +
  geom_point(aes(x = wt, y = mpg))
  • 需要注意的是,geom_*系列函数的第一个参数是mapping,第二个参数是data,和ggplot函数是相反的。

在该类函数内可以通过一些参数对图形要素进行美化:

p +
  geom_line(linetype = 2, size = 1.2, col = "blue") +
  geom_point(shape = 21, size = 3, col = "red", fill = "blue")

还可以通过某个变量对要素进行分组美化,需要使用映射函数aes,如通过cyl变量进行分组:

data$cyl = factor(data$cyl)
p <- ggplot(data, aes(wt, drat))

p +
  geom_line(aes(col = cyl, linetype = cyl), size = 1.2) +
  geom_point(aes(shape = cyl), size = 3, col = "red", 
             fill = "blue", alpha = 0.5)
  • 分组变量的数据类型需要是因子类型;

  • 修改后的数据框需要重新赋值给ggplot函数的参数。

使用映射函数对要素进行分组美化是ggplot2的一大特色,如果使用基础绘图系统的绘制思路会很繁琐,仅以折线图为例:

p +
  geom_line(data = data[data$cyl == 4,], size = 1.2, linetype = 2, col = "red") +
  geom_line(data = data[data$cyl == 6,], size = 1.2, linetype = 3, col = "blue") +
  geom_line(data = data[data$cyl == 8,], size = 1.2, linetype = 4, col = "green")

如果觉得使用折线图不能很好地反映变化趋势,可以使用geom_smooth函数绘制平滑曲线:

p +
  geom_point(aes(shape = cyl, col = cyl), size = 3, 
             fill = "blue", alpha = 0.5) +
  geom_smooth(aes(col = cyl), method = lm) -> p2
p2
  • geom_smooth默认的平滑方法是loess,通过methodformula等参数可以进行修改。

使用facet_*函数可以分组绘制子图:

p + 
  geom_line(linetype = 2, size = 0.8, col = "blue") +
  geom_point(shape = 21, size = 3, col = "red", fill = "blue") +
  facet_wrap(~ cyl, scales = "free")

3 标签函数

xlabylabggtitlelabs等函数可以添加图形标签:

  • xlabylab只有label一个参数,用于添加横、纵坐标的标签;

  • ggtitle函数用于添加图形标题;

  • labs函数是全能的标签函数。

p2 +
  xlab("wt(mtcars)") +
  ggtitle(label = "drat ~ wt") +
  labs(y = "drat(mtcars)", caption = "R语言学堂") +
  ylim(2, 5.5) -> p3
p3

4 标度函数

标度函数主要用于控制各类要素的属性,该类函数一般采取三级命名方法,之间使用下划线隔开,其中第一级均为scale,第二级有如下几种:

  • scale_alpha_*:透明度标度;

  • scale_color_*:颜色标度

  • scale_fill_*:填充颜色标度;

  • scale_linetype_*:线型标度;

  • scale_shape_*:点的形状标度;

  • scale_size_*:点的大小和线的粗细标度;

  • scale_x_*:横坐标轴标度;

  • sclae_y_*:纵坐标轴标度。

该类函数是ggplot2包中最复杂的一类函数。前文使用cyl变量将散点的颜色分为三组,这里使用scale_color_manual函数手动指定每组的颜色,使用scale_x_continuous调整横坐标轴的刻度:

p3 +
  scale_color_manual(values = c("red", "blue", "green")) +
  scale_x_continuous(breaks = seq(1.5, 5.5, 0.5)) -> p4
p4

5 theme函数

theme函数用于对图形要素进行美化,它拥有丰富的参数,命名方式也是遵循逐级命名的规则:

theme(
  line,
  rect,
  text,
  title,
  aspect.ratio,
  
  axis.title, axis.title.x, axis.title.x.top, ...,
  
  legend.background, legend.margin, legend.spacing, ...,
  
  panel.background, panel.border, panel.spacing,...,
  
  plot.background, plot.title, plot.title.position, ...,
 
  strip.background, strip.background.x, strip.background.y, ...,
  
  ...,
  complete = FALSE,
  validate = TRUE
)
  • 该函数参数较多,这里每类只列举前三个,其余使用省略号表示。

theme函数是如何通过一个参数就对某个要素的颜色、形状、大小等诸多属性进行设置的呢?其实它是使用element_*系列函数进行赋值的,而该类函数又包含若干参数:

element_*系列主要包含四个函数,除element_blank外,其余三个分别针对线状、矩形和文本类要素进行设置:

  • element_blank: draws nothing, and assigns no space.

如将绘图背景设置为空白:

theme(panel.background = element_blank())
  • element_line: lines.

element_line(
  colour = NULL,
  size = NULL,
  linetype = NULL,
  lineend = NULL,
  color = NULL,
  arrow = NULL,
  inherit.blank = FALSE
)

如将横坐标轴的刻度线设置为红色:

theme(axis.ticks.x = element_line(colour = "red"))
  • element_rect: borders and backgrounds.

element_rect(
  fill = NULL,
  colour = NULL,
  size = NULL,
  linetype = NULL,
  color = NULL,
  inherit.blank = FALSE
)

如对图形的背景边框进行调整:

theme(panel.border = element_rect(fill = NA, size = 0.3))
  • element_text: text.

element_text(
  family = NULL,
  face = NULL,
  colour = NULL,
  size = NULL,
  hjust = NULL,
  vjust = NULL,
  angle = NULL,
  lineheight = NULL,
  color = NULL,
  margin = NULL,
  debug = NULL,
  inherit.blank = FALSE
)

如对横坐标的标签进行调整:

theme(axis.text.x = element_text(size = 10))
p4 +
  theme( axis.line = element_line(color = "black", size = 0.2),
         axis.title = element_text(size = 12),
         axis.text = element_text(size = 10),
         axis.ticks = element_line(colour = "grey"),
         
         legend.position = "right",
         legend.direction = "vertical",
         
         panel.background = element_blank(),
         panel.border = element_rect(fill = NA, size = 0.3),
         panel.grid.major = element_line(linetype = 2, colour = "grey", size = 0.5),
         
         plot.title = element_text(size = 12, hjust = 0.5)) -> p5
p5

6 保存图形到本地

ggplot2工具包输出图形的函数是ggsave,该函数重要的参数有以下四个:

  • filename:保存地址和文件名;

  • width和height:输出图形尺寸;

  • dpi:输出图片分辨率。

默认保存最后一幅由ggplot2语法绘制的图形:

ggsave(filename = "G:/ggplot.jpeg",
       width = 8, height = 5, dpi = 600)

也可以指定保存已经命名的图形对象:

ggsave(p4, filename = "G:/ggplot2.jpeg",
       width = 8, height = 5, dpi = 600)

最后附上一幅ggplot2函数的参数清单图:


  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值