Notes-ggplot2

ggplot2是一个用来绘制统计图形的package.

gg即为Grammar of Graphics,直译就是绘图的语法。

核心思路

ggplot2就像PS一样,逐图层叠加,最后组成目标绘图。

它的优势:

  • 用户能在更抽象层面上控制图形,使创造性绘图更容易
  • 采用图层的设计方式,使其更具灵活性
  • 图形美观,同时避免繁琐细节
  • 将常见的统计变换融入到了绘图中

几个概念

  • 数据(Data)和映射(Mapping):将数据映到图像
  • 几何对象(Geometric):代表在图中看到的实际元素,如点、线、多边形等
  • 统计变换(Statistics):对数据进行某种汇总,如直方图,或将二维关系用线性模型解释
  • 标度(Scale):将数据的取值映射到图形空间,例如用:颜色、大小、形状表示不同取值
  • 坐标系(Coordinate):数据如何映射到图形所在平面,提供作图所需的坐标轴和网格线
  • 分面(Facet):将数据分解为子集,进行联合展示
  • 图层(Layer):对所需的绘图操作进行一层一层叠加,最终得到所需图形

绘图示例

散点图

library(ggplot2)
p <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy, colour = factor(year)))
p + geom_point()

  首行反应对应关系,指定数据集合+横纵坐标,后面用p+geom_point的方式指定绘图方式,即散点图

  colour为分组数据上色,分组依据为year年份

p + geom_point() + stat_smooth()

  stat表示的是statistical transformation,统计学变换。因为我们需要用插值的方法来绘制拟合直线,并且附带置信区间。

p + geom_point(aes(colour = factor(year),
                   size = displ), alpha = 0.5) +
  stat_smooth() + scale_size_continuous(range = c(4, 10))

  用alpha指定透明度,α∈(0,1).

p + geom_point(aes(colour = class, size = displ), alpha=0.5) +
  stat_smooth() + scale_size_continuous(range = c(4, 10)) +
  facet_wrap(~ year,ncol = 1) +
  labs(y = '每加仑高速公路行驶距离', x = '每加仑城市公路行驶距离',
       title = '汽车油耗与型号', size = '排量', colour = '车型') +
  theme(text = element_text(family = "STHeiti"),
        plot.title = element_text(hjust = 0.5))

这次变化的内容其实有点多,我们来细细捋一捋,首先是分层。

其实分层操作用起来非常的简单,就一行代码:facet_wrap(~ year, ncol = 1),facet_wrap()是关键,facet与wrap两个词组合,就是逐面地包起来。里面我们选择按照year这个变量来分层,就可以将1999与2008分开。一定要注意!这里在year前面有个~,回归中的用法。而最后的ncol = 1代表着我们的小窗口是1列,指定了1列之后,默认就是两行啦。(因为年份一共只有两种)如果不加这句,会默认横着排列,或者想要指定几行,则使用nrow = 1。

第二个修改的地方是colour = class。同样的,class也是数据集中的一个变量,代表不同种类的汽车,而因为汽车的种类非常多,所以颜色也就变的很多了。

第三个修改点是:添加了scale_size_continuous(range = c(4, 10)),也就是指定我们size的变化范围。在本图中,就是控制点的绝对大小的范围。

labs()修改的是我们标签的名称。我们前面在aes()中用了x =,y =,size =以及colour =,这些都是会有标签名称的,默认都是前面显示的一些英文。而这里,我们只需要在labs()中,写上其对应的名称即可。另外我们还附送一个title =,就是我们图像的标题。

theme()更偏向于格式的修改。text = element_text(family = "STHeiti")是对字体进行修改,变为黑体。Windows系统的各位,可以不添加这行,一样会显示前面labs()中设定的中文。而如果是Mac或者Linux系统,由于字体的缺失,会显示成一个一个的框框,在图像上显示不了中文字。

第二行plot.title = element_text(hjust = 0.5)是调整标题的位置,不加这行,标题会居左,加上才会居中。hjust = 0.5其实就是左右移动的意思,0.5表示居中。

直方图

p1 + geom_histogram(aes(fill = factor(year), y = ..density..),
                    alpha = 0.3, colour = 'black') +
  stat_density(geom = 'line', position = 'identity', size = 1.5,
               aes(colour = factor(year))) +
  facet_wrap(~ year, ncol = 1)

这里不再用前面的变量p,而是变成p1,其映射是不需要y的,只需要指定x =数据集中的一个变量即可。然后+ geom_histogram()会使用默认的参数进行直方图的绘制。

这里又进行了很多操作,下面将其进行分解。

首先是facet_wrap(~ year, ncol = 1)按年分层,这里不再详述。我们来聊聊geom_histogram()中的参数。

fill = factor(year) 放在aes() 中表示按年进行填充颜色。为什么不用前面说到的colour = ?这是ggplot绘图中一个非常重要的点!(敲黑板!)对于线与点这种面积为0的结构,它的颜色就直接使用colour =进行指定,而对条形图,柱状图,扇形图(特殊的柱状图),箱线图等等有面积的图形,其面积的颜色,我们需要用fill =来指定。

添加y = ..density.. 是将原本的频数直方图变成频率密度直方图,目的是为了在直方图上添加密度曲线,两者可以同时在一张图上展现。

alpha = 0.3 是指定填充颜色的透明度, colour = 'black'则是强制指定柱状图边框的颜色为黑色。注意这两个参数是放在aes()外面,就是强制设定的意思。

stat_density()表示添加统计学中的密度曲线,进行密度估计。geom = 'line'指定为线形, position = 'identity'表示一个一一映射, size = 1.5 是强制修改线的尺寸,为原先的1.5倍。最后的aes(colour = factor(year))为修改拟合密度曲线的颜色,这里就是用的colour =而不是fill =

条形图

并立条形图

p3 <- ggplot(mpg, aes(class, fill = factor(year)))
p3 + geom_bar(position = 'dodge')

添加参数position = 'dodge'fill = factor(year)说明用什么变量来并立,这里是年份

堆叠条形图

p3 + geom_bar(position = 'stack')

分面条形图

p3 + geom_bar(aes(fill = class)) + facet_wrap(~ year)

  

饼形图

p4 <- ggplot(mpg, aes(x = factor(1), fill = factor(class))) +
  geom_bar(width = 1)
p4 + coord_polar(theta = "y")

首先x轴,只有一个柱子,柱子的宽度我们设置为1,geom_bar(width = 1),也就是铺满整个图,而柱子按照class变量来分类,并且是堆叠的(默认是堆叠条形图)。这时的图,也就是p4是一个“千层饼”。然后我们按照y轴为原点,用coord_polar(theta = "y"),就成了我们的饼图了。

箱线图

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

  

小提琴图

p5 + geom_violin(alpha = 0.3) + geom_jitter(shape = 21)

  

使用geom_violin()绘制小提琴图,同样改变透明度。小提琴图相比于箱线图多了各个类别分布的信息,是图像变得更加漂亮。

然后我们用geom_jitter()添加扰动点,其实就是将数据点等间隔的排列,显得更加高大上。其中的shape = 21指定的是扰动点的形状,我们用21号,也就是空心点(默认是实心点)。

格式调整

# 底色调整
p5 <- ggplot(mpg, aes(class, hwy, fill = class))
p6 <- p5 + geom_boxplot()
p6 + theme_bw()

  

# 网格线
p6 + theme_bw() + theme(panel.grid = element_blank())

  

# 刻度标签
p6 + theme_bw() + theme(panel.grid = element_blank(),
                        axis.text = element_blank())

  

# 刻度线
p6 + theme_bw() + theme(panel.grid = element_blank(), 
                        axis.text = element_blank(),
                        axis.ticks = element_blank())

  

# xy轴标题
p6 + theme_bw() + theme(panel.grid = element_blank(), 
                        axis.text = element_blank(),
                        axis.ticks = element_blank(),
                        axis.title = element_blank())

  

# 外层边框
p6 + theme_bw() + theme(panel.grid = element_blank(), 
                        axis.text = element_blank(),
                        axis.ticks = element_blank(),
                        axis.title = element_blank(),
                        panel.border = element_blank())

  

# 不要图例
p7 <- p6 + theme_bw() + theme(panel.grid = element_blank(), 
                              axis.text = element_blank(),
                              axis.ticks = element_blank(),
                              axis.title = element_blank(),
                              panel.border = element_blank(),
                              legend.position = "none")
p7

  

函数 图形 选项
geom_bar() 条形图 color,fill,alpha
geom_boxplot() 箱线图 color,fill,alpha,notch,width
geom_density() 密度图 color,fill,alpha,linetype
geom_histogram() 直方图 color,fill,alpha,linetype,binwidth
geom_hline() 水平线 color,alpha,linetype,size
geom_jitter() 抖动点 color,alpha,size,shape
geom_line() 线图 color,alpha,linetype,size
geom_point() 散点图 color,alpha,size,shape
geom_rug() 地毯图 color,sides
geom_smooth() 拟合曲线 method,formula,color,fill,linetype,size
geom_text() 文字注解
geom_violin() 小提琴图 color,fill,alpha,linetype
geom_vline() 垂线 color,alpha,linetype,size
... ... ...

猜你喜欢

转载自www.cnblogs.com/zoeding/p/10143187.html