[置顶]R语言 ggplot2包

  R语言  ggplot2包的学习
 

分析数据要做的第一件事情,就是观察它。对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测?

ggplot2图形之基本语法:

ggplot2的核心理念是将绘图与数据分离,数据相关的绘图与数据无关的绘图分离
ggplot2是按图层作图
ggplot2保有命令式作图的调整函数,使其更具灵活性
ggplot2将常见的统计变换融入到了绘图中。
ggplot的绘图有以下几个特点:第一,有明确的起始(以ggplot函数开始)与终止(一句语句一幅图);其二,图层之间的叠加是靠“+”号实现的,越后面其图层越高。
ggplot图的元素可以主要可以概括如下:最大的是plot(指整张图,包括background和title),其次是axis(包括stick,text,title和stick)、legend(包括backgroud、text、title)、facet这是第二层次,其中facet可以分为外部strip部分(包括backgroud和text)和内部panel部分(包括backgroud、boder和网格线grid,其中粗的叫grid.major,细的叫grid.minor)。
ggplot2里的所有函数可以分为以下几类:
用于运算(我们在此不讲,如fortify_,mean_等)
初始化、展示绘图等命令(ggplot,plot,print等)
按变量组图(facet_等)
真正的绘图命令(stat_,geom_,annotate),这三类就是实现一个函数一个图层的核心函数。
微调图型:严格意义上说,这一类函数不是再实现图层,而是在做局部调整。
aes : 同样适用于修改geom_XXX() aes参数控制了对哪些变量进行图形映射,以及映射方式
图形属性(aes) 横纵坐标、点的大小、颜色,填充色等

完整公式总结:

ggplot(data = , aes(x = , y = )) +
geom_XXX(...) + ... + stat_XXX(...) + ... +
annotate(...) + ... + labs(...) +
scale_XXX(...) + coord_XXX(...) + guides(...) + theme(...) +
facet_XXX(...)
#完整ggplot2绘图示意:
library(ggplot2)
attach(iris)
p <- ggplot(data=iris,aes(x = Sepal.Length,y = Sepal.Width))
p + geom_point(aes(colour = Species)) + stat_smooth() + 
labs(title = "Iris of Sepal.length \n According to the Sepal.Width") +
theme_classic() + theme_bw() +annotate("text",x=7,y=4,parse = T,label = "x[1]==x[2]",size=6, family="serif",fontface="italic", colour="darkred")

geom :表示几何对象,它是ggplot中重要的图层控制对象,因为它负责图形渲染的类型。
几何对象(geom_) 上面指定的图形属性需要呈现在一定的几何对象上才能被我们看到,这些承载图形属性的对象可能是点,可能是线,可能是bar

stat :统计变换 比如求均值,求方差等,当我们需要展示出某个变量的某种统计特征的时候,需要用到统计变换

annotate:添加注释 #由于设置的文本会覆盖原来的图中对应的位置,可以改变文本的透明度或者颜色 例: annotate(geom='text')会向图形添加一个单独的文本对象 annotate("text",x=23,y=200,parse=T,label = "x[1]==x[2]")


labs : labs(x = "这是 X 轴", y = "这是 Y 轴", title = "这是标题") ## 修改文字

scale_: 标度是一种函数,它控制了数学空间到图形元素空间的映射。一组连续数据可以映射到X轴坐标,也可以映射到一组连续的渐变色彩。一组分类数据可以映射成为不同的形状,也可以映射成为不同的大小,这就是与aes内的各种美学(shape、color、fill、alpha)调整有关的函数。

coord_:调整坐标,控制了图形的坐标轴并影响所有图形元素. 调整坐标 coord_flip()来翻转坐标轴。使用xlim()和ylim()来设置连续型坐标轴的最小值和最大值 coord_cartesian(xlim=c(0,100),ylim=c(0,100))

guides:调整所有的text。

theme:调整不与数据有关的图的元素的函数。theme函数采用了四个简单地函数来调整所有的主题特征:element_text调整字体,element_line调整主题内的所有线,element_rect调整所有的块,element_blank清空。theme(panel.grid =element_blank()) ## 删去网格线

facet :控制分组绘图的方法和排列形式
# 不指定数据集时,data = NULL
一个图形对象就是一个包含数据,映射,图层,标度,坐标和分面的列表,外加组件options
ggplot(数据, 映射) geom_xxx(映射, 数据) stat_xxx(映射, 数据)

# 通过“+”实现不同图层的相应累加,且越往后的图层表现在上方
点(point, text):往往只有x、y指定位置,有shape但没有fill
线(line,vline,abline,hline,stat_function等):一般是基于函数来处理位置
射(segment):特征是指定位置有xend和yend,表示射线方向
面(tile, rect):这类一般有xmax,xmin,ymax,ymin指定位置
棒(boxplot,bin,bar,histogram):往往是二维或一维变量,具有width属性
带(ribbon,smooth):透明是特征是透明的fill
补:包括rug图,误差棒(errorbar,errorbarh)
然后,就是按照你的需要一步步加图层了(使用“+”)。

*********************

基本语法:

数据(data):将要展示的数据;

映射(mapping):数据中的变量到图形成分的映射;

几何对象(geom):用来展示数据的几何对象,如geom_point,geom_bar,geom_abline;

图形属性(aes):图形属性决定了图形的外观,如字体大小、标签位置及刻度线;

标度(scale):决定了变量如何被映射到图形属性上;

坐标(coordinate):数据如何被映射到图中。如coord_cartesian:笛卡尔坐标、coord_polar:极坐标、coord_map:地理投影;

统计变换(stat):对数据进行汇总,如箱线图:stat_boxplot、线图:stat_abline、直方图:stat_bin

分面(facet):用来描述数据如何被拆分为子集,以及对不同子集是如何绘制的。

位置调整(position):对图形位置做精细控制。

创建ggplot对象:使用ggplot函数:

ggplot(data,mapping=aes(),...,environment=globalenv())

 

参数 描述 默认值
data 要绘图的数据框  
mapping 一系列图形属性的映射 aes()
environment 图形属性参数所在的环境 globalenv()
...    

几何对象:

为了指定图形类型,必须加入图层,可采用layer()函数。可以使用“point”等短名称来指定几何对象。layer函数允许将几何对象作为名称和值的配对,这样就不需要指出函数全名,而只需要geom_后面的部分。几何对象如下:

 

几何对象函数 描述
geom_abline 线图,由斜率和截距指定
geom_area 面积图(即连续的条形图)
geom_bar 条形图
geom_bin2d 二维封箱的热图
geom_blank 空的几何对象,什么也不画
geom_boxplot 箱线图
geom_contour 等高线图
geom_crossbar crossbar图(类似于箱线图,但没有触须和极值点)
geom_density 密度图
geom_density2d 二维密度图
geom_errorbar 误差线(通常添加到其他图形上,比如柱状图、点图、线图等)
geom_errorbarh 水平误差线
geom_freqpoly 频率多边形(类似于直方图)
geom_hex 六边形图(通常用于六边形封箱)
geom_histogram 直方图
geom_hline 水平线
geom_jitter 点、自动添加了扰动
geom_line 线
geom_linerange 区间,用竖直线来表示
geom_path 几何路径,由一组点按顺序连接
geom_point
geom_pointrange 一条垂直线,线的中间有一个点(与Crossbar图和箱线图相关,可以用来表示线的范围)
geom_polygon 多边形
geom_quantile 一组分位数线(来自分位数回归)
geom_rect 二维的长方形
geom_ribbon 彩虹图(在连续的x值上表示y的范围,例如Tufte著名的拿破仑远征图)
geom_rug 触须
geom_segment 线段
geom_smooth 平滑的条件均值
geom_step 阶梯图
geom_text 文本
geom_tile 瓦片(即一个个的小长方形或多边形)
geom_vline 竖直线

统计变换

统计变换函数 描述
stat_abline 添加线条,用斜率和截距表示
stat_bin 分割数据,然后绘制直方图
stat_bin2d 二维密度图,用矩阵表示
stat_binhex 二维密度图,用六边形表示
stat_boxplot 绘制带触须的箱线图
stat_contour 绘制三维数据的等高线图
stat_density 绘制密度图
stat_density2d 绘制二维密度图
stat_function 添加函数曲线
stat_hline 添加水平线
stat_identity 绘制原始数据,不进行统计变换
stat_qq 绘制Q-Q图
stat_quantile 连续的分位线
stat_smooth 添加平滑曲线
stat_spoke 绘制有方向的数据点(由x和y指定位置,angle指定角度)
stat_sum 绘制不重复的取值之和(通常用在三点图上)
stat_summary 绘制汇总数据
stat_unique 绘制不同的数值,去掉重复的数值
stat_vline 绘制竖直线

 

标度函数

 

标度函数 描述
scale_alpha alpha通道值(灰度)
scale_brewer 调色板,来自colorbrewer.org网站展示的颜色标度
scale_continuous 连续标度
scale_data 日期
scale_datetime 日期和时间
scale_discrete 离散值
scale_gradient 两种颜色构建的渐变色
scale_gradient2 3中颜色构建的渐变色
scale_gradientn n种颜色构建的渐变色
scale_grey 灰度颜色
scale_hue 均匀色调
scale_identity 直接使用指定的取值,不进行标度转换
scale_linetype 用线条模式来展示不同
scale_manual 手动指定离散标度
scale_shape 用不同的形状来展示不同的数值
scale_size 用不同大小的对象来展示不同的数值

 

坐标系

 

 

坐标函数 描述
coord_cartesian 笛卡儿坐标
coord_equal 等尺度坐标(斜率为1)
coord_flip 翻转笛卡儿坐标
coord_map 地图投影
coord_polar 极坐标投影
coord_trans 变换笛卡儿坐标

 

分面

 

 

分面函数 描述
facet_grid 将分面放置在二维网格中
facet_wrap 将一维的分面按二维排列

 

位置

 

 

 

定位函数 描述
position_dodge 并列
position_fill 填充
position_identity 不对位置进行处理
position_jitter 扰动处理
position_stack 堆叠处理

 

Chap1. R 基础

## 加载文件

  1. 默认情况下,数据集中的字符串(String)会被视为因子(Factor)处理,此时可以设置stringAsFactors = FALSE,将文本变量视为字符串表示。
  2. 读取xlsx和xls文件:packagexlsx(Java)和gdata(Perl)
  3. foreign:read.spss;read.octave;read.systat;read.xport;read.dta

Chap2. 快速探索数据(略)

## 概述 qplot()函数的语法与基础绘图系统类似,简短易输入,通常用于探索性数据分析。qplot(x,y,data,geom=c(xx,xx))

条形图

  1. barplot()第一个向量用来设定条形的高度,第二个向量用来设定每个条形对应的标签(可选)。
  2. 变量值条形图: 两个输入变量,x为分类变量,y表示变量值
  3. 频数条形图:一个输入变量,需要注意连续x轴和离散x轴的差异。

直方图

与条形图不同的地方在于,x为连续型变量

箱线图

  1. 需要传递两个向量:x和y
  2. 在x轴上引入两变量的交互:interaction()
  3. Question:基础绘图系统和ggplot2的箱线图略有不同。

绘制函数图像

ggplot(data.frame(x=c(0,20)), aes(x=x)) + stat_function(fun=myfun, geom = "line") 

Chap3. 条形图

重要细节:条形图的高度表示的是数据集中变量的频数,还是表示变量取值本身

## 概述 条形图通常用来展示不同的分类下(x轴)某个数值型变量的取值(y轴),其条形高度既可以表示数据集中变量的频数,也可以表示变量取值本身。

参数

  1. fill:改变条形图的填充色;colour:添加边框线;position:改变条形图的类型;linetype:线型
  2. scale_fill_brewer()scale_fill_manual()设置颜色
  3. scale_fill_brewer(palette="Pastell")

条形图

  1. 频数条形图:只需要一个输入变量,当变量为连续型变量时,等价于直方图。
  2. 颜色映射在aes()内部完成,而颜色的重新设定在aes()外部完成。
  3. 排序:ggplot(upc, aes=(x=reorder(Abb, Change)), y =Change, fill = Region)
  4. 正负条形图着色:首先,创建一个对取值正负情况进行标示的变量,然后参数设定为position='identity',这可以避免系统因对负值绘制堆积条形而发出的警告信息。
  5. guide=FALSE删除图例
  6. width调整条形图的条形宽度;position_dodge(0.7)调整条形间距(中心距离)
  7. 堆积条形图:geom_bar(stat='identity')默认情况
  8. 更改图例颜色顺序:guides(fill = guide_legend(reverse=TRUE))
  9. 调用调色板 scale_fill_brewer(palette='Pastell')和手动:scale_fill_manual()
  10. 百分比堆积图:首先利用plyr包种的ddply()转化数据,然后再绘图.
  11. 添加 数据标签:geom_text(aes(y = label_y, label=Weight),vjust=xxx)其中y用来控制标签的位置
  12. 绘制Cleveland点图:通常都会设置成根据x轴对应的连续变量的大小取值对数据进行排序。
  13. reorder(x,y):先将x转化为因子,然后根据y对其进行排序。
  14. 主题系统(Theming System):theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())

汇总好的数据集绘制条形图:

  1. <- c('A','B','C','D','E')
  2. <- c(13,22,16,31,8)
  3. df <- data.frame(x= x, y = y)
  4. ggplot(data = df, mapping = aes(= x, y = y)) + geom_bar(stat= 'identity')

对于条形图的y轴就是数据框中原本的数值时,必须将geom_bar()函数中stat(统计转换)参数设置为’identity’,即对原始数据集不作任何统计变换,而该参数的默认值为’count’,即观测数量。

使用明细数据集绘制条形图:

  1. set.seed(1234)
    x <- sample(c('A','B','C','D'), size = 1000, replace= TRUE, prob = c(0.2,0.3,0.3,0.2))
    y <- rnorm(1000) * 1000 
    df = data.frame(x= x, y = y)
    ggplot(data = x = x, mapping = aes(x = factor(x), y = ..count..))+ geom_bar(stat = 'count')

数据集本身是明细数据,而对于统计某个离散变量出现的频次时,geom_bar()函数中stat(统计转换)参数只能设置为默认,即’count’。

当然,如果需要对明细数据中的某个离散变量进行聚合(均值、求和、最大、最小、方差等)后再绘制条形图的话,建议先使用dplyr包中的group_by()函数和summarize()函数实现数据汇总,具体可参见:

http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=402687811&idx=1&sn=fb4ada05aef7bf34b9fc35f97221d55f#rd

从x轴的数据类型来看:有字符型的x值也有数值型的x值

上面的两幅图对应的x轴均为离散的字符型值,如果x值是数值型时,该如何正确绘制条形图?

  1. set.seed(1234)
  2. <- sample(c(1,2,4,6,7), size = 1000, replace = TRUE,prob = c(0.1,0.2,0.2,0.3,0.2))
  3. ggplot(data = data.frame(= x), mapping= aes(= x, y = ..count..)) + geom_bar(stat = 'count')

如果直接使用数值型变量作为条形图的x轴,我们会发现条形图之间产生空缺,这个空缺其实对应的是3和5两个值,这样的图形并不美观。为了能够使条形图之间不存在类似的空缺,需要将数值型的x转换为因子,即factor(x),如下图所示:

  1. ggplot(data = data.frame(= x), mapping = aes(= factor(x), y = ..count..))+ geom_bar(stat = 'count')

上面几幅图的颜色均为灰色的,显得并不是那么亮眼,为了使颜色更加丰富多彩,可以在geom_bar()函数内通过fill参数可colour参数设置条形图的填充色和边框色,例如:

  1. ggplot(data = data.frame(= x), mapping = aes(= factor(x), y = ..count..))+ geom_bar(stat = 'count', fill = 'steelblue', colour = 'darkred')

关于颜色的选择可以在R控制台中输入colours(),将返回657种颜色的字符。如果想查看所有含红色的颜色值,可以输入colours()[grep(‘red’,
colours())]返回27种红色。

绘制簇条形图

以上绘制的条形图均是基于一个离散变量作为x轴,如果想绘制两个离散变量的条形图即簇条形图该如何处理呢?具体见下方例子:

  1. <- rep(1:5, each = 3)
  2. <- rep(c('A','B','C'),times = 5)
  3. set.seed(1234)
  4. <- round(runif(min = 10, max = 20, n = 15)) df <- data.frame(x= x, y = y, z = z)
  5. ggplot(data = df, mapping = aes(= factor(x), y = z,fill = y)) + geom_bar(stat = 'identity', position = 'dodge')

对于簇条形图只需在ggplot()函数的aes()参数中将其他离散变量赋给fill参数即可。这里的position参数表示条形图的摆放形式,默认为堆叠式(stack),还可以是百分比的堆叠式。下面分别设置这两种参数,查看一下条形图的摆放形式。

堆叠式:

  1. ggplot(data = df, mapping = aes(= factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', position = 'stack')

发现一个问题,条形图的堆叠顺序(A,B,C)与图例顺序(C,B,A)恰好相反,这个问题该如何处理呢?很简单,只需再添加guides()函数进行设置即可,如下所示:

  1. ggplot(data = df, mapping = aes(= factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', position = 'stack') + guides(fill = guide_legend(reverse= TRUE))

guides()函数将图例引到fill属性中,再使图例反转即可。

百分比堆叠式:

  1. ggplot(data = df, mapping = aes(= factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', position = 'fill')

颜色配置:

同样,如果觉得R自动配置的填充色不好看,还可以根据自定义的形式更改条形图的填充色,具体使用scale_fill_brewer()和scale_fill_manual()函数进行颜色设置。

scale_fill_brewer()函数使用R自带的ColorBrewer画板

ggplot(data = df, mapping = aes(x = factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', position = 'dodge') + scale_fill_brewer(palette = 'Accent')

具体的调色板颜色可以查看scale_fill_brewer()函数的帮助。

scale_fill_manual()函数允许用户给指定的分类水平设置响应的色彩,个人觉得这个比较方便

  1. col <- c('darkred','skyblue','purple')
  2. ggplot(data = df, mapping =aes(= factor(x), y = z, fill = y)) + geom_bar(stat = 'identity', colour= 'black', position = 'dodge') + scale_fill_manual(values = col, limits= c('B','C','A')) + xlab('x')

a <- ggplot(mpg, aes(x=hwy)) a + stat_bin(aes(fill=..count.., color=-1*..ndensity..), binwidth = 1)

统计方法有输入,有输出。通常输入为x和y。输出值会以例的形式追加到当前操作的数据拷贝中。比如上例中的stat_bin函数,就会生成四列新数据,分别为count, density, ncount以及ndensity。在访问这些新列的时候,使用..name..的方式

 该如何绘制有序的条形图?

  1. #不经排序的条形图,默认按x值的顺序产生条形图
  2. x <- c('A','B','C','D','E','F','G')
  3. <-c('xx','yy','yy','xx','xx','xx','yy')
  4. <- c(10,33,12,9,16,23,11) 
  5. df<- data.frame(= x, y = y, z = z)
  6. ggplot(data = df, mapping = aes(x= x, y = z, fill = y)) + geom_bar(stat = 'identity')

按z值的大小,重新排列条形图的顺序,只需将aes()中x的属性用reorder()函数更改即可。

  1. ggplot(data = df, mapping = aes(= reorder(x, z), y = z, fill = y)) +geom_bar(stat = 'identity') + xlab('x')

关于条形图的微调

如何y轴的正负值区分开来,并去除图例

  1. set.seed(12)
    x <- 1980 + 1:35
    y <- round(100*rnorm(35))
    df <- data.frame(x = x,y = y)
    # 判断y是否为正值
    df <- transform(df,judge = ifelse(y>0,"YES","NO"))
    # 去除图例用theme()主题函数
    ggplot(df,aes(x = x,y = y,fill = judge))+
    geom_bar(stat = "identity")+
    theme(legend.position= "")+
    xlab("Year")+
    scale_fill_manual(values = c("darkred","blue"))

stat参数和position参数均设置为identity,目的是图形绘制不要求对原始数据做任何的变换,包括统计变换和图形变换,排除图例可以通过scale_fill_manual()函数将参数guide设置为FALSE,同时该函数还可以自定义填充色,一举两得。

ggplot(data = df, mapping = aes(x = x, y = y, fill = judge))+ 
geom_bar(stat = 'identity', position = 'identity')+ 
scale_fill_manual(values = c('blue','red'), guide = FALSE)+ 
xlab('Year')

调整条形图的条形宽度和条形间距

geom_bar()函数可以非常灵活的将条形图的条形宽度进行变宽或变窄设置,具体通过函数的width参数实现,width的最大值为1,默认为0.9。

x <- c("A","B","C","D","E")
y <- c(10,20,15,22,18)
df <- data.frame(x = x,y = y)
# 不作任何条形宽度的调整
ggplot(df,aes(x = x,y = y))+
geom_bar(stat = "identity",fill = "steelblue",colour = "black") 

# 使条形宽度变宽
ggplot(df,aes(x = x,y = y))+geom_bar(stat = "identity",fill = "steelblue",colour = "black",width = 1)

对于簇条形图来说,还可以调整条形之间的距离,默认情况下,条形图的组内条形间隔为0,具体可通过函数的position_dodge参数实现条形距离的调整,为了美观,一般将条形距离设置的比条形宽度大一点。

  1. x <- rep(1:5,each = 3)
    y <- rep(c("A","B","C"),times = 5)
    set.seed(12)
    z <- round(runif(min = 10,max = 20,n = 15))
    df <- data.frame(x = x,y = y,z = z)
    # 不做任何条形宽度和条形距离的调整
    ggplot(df,aes(x = factor(x),y = z,fill = y))+
    geom_bar(stat = "identity",position = "dodge")

调整条形宽度和条形距离

  1. ggplot(data = df, mapping = aes(= factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', width = 0.5, position = position_dodge(0.7))

添加数据标签

geom_text()函数可以方便的在图形中添加数值标签,具体微调从几个案例开始:

  1. # 添加标签
    ggplot(df,aes(x = interaction(x,y),y = z,fill = y))+
    geom_bar(stat = "identity")+
    geom_text(aes(label = z))

除此之外,还可以调整标签的大小、颜色、位置等。

  1. ggplot(data = df, mapping = aes(= interaction(x,y), y = z, fill = y))+ geom_bar(stat = 'identity') + ylim(0,max(z)+1) + geom_text(mapping =aes(label = z), size = 8, colour = 'orange', vjust = 1)

ylim设置条形图中y轴的范围;size调整标签字体大小,默认值为5号;colour更换标签颜色;vjust调整标签位置,1为分界线,越大于1,标签越在条形图上界下方,反之则越在条形图上上界上方。

 

# vjust 调整标签竖直位置,越大,标签越在条形图的上界下方;0.5时,则在中间。
# hjust 调整标签水平位置,越大,标签越在条形图的上界左边;0.5时,则在中间。

 

对于水平交错的簇条形图,必须通过geom_text()函数中的position_dodge()参数来调整标签位置,hjust=0.5将标签水平居中放置。

  1. ggplot(data = df, mapping = aes(= x, y = z, fill = y)) + geom_bar(stat
  2. = 'identity', position = 'dodge') + geom_text(mapping = aes(label = z),
  3. size = 5, colour = 'black', vjust = 1, hjust = .5, position = position_dodge(0.9))

这里的图形位置与标签位置摆放必须一致,即图形位置geom_bar()函数中的position = 'dodge'参数,标签位置geom_text()函数中的position
= position_dodge(0.9)参数。

对于堆叠的簇条形图,必须通过geom_text()函数中的position_stack()参数来调整标签位置,hjust将标签水平居中放置。

  1. ggplot(data = df, mapping = aes(= x, y = z, fill = y)) + geom_bar(stat
  2. = 'identity', position = 'stack') + geom_text(mapping = aes(label = z),
  3. size = 5, colour = 'black', vjust = 3.5, hjust = .5, position = position_stack())

这里的图形位置与标签位置摆放必须一致,即图形位置geom_bar()函数中的position = 'stack'参数,标签位置geom_text()函数中的position
= position_stack()参数。

补充:统计变换 
若x轴变量为连续的,则用sta = bin; 
若离散型的,可用stat = “count”或stat = “identity”

参考资料

R数据可视化手册

R语言_ggplot2:数据分析与图形艺术

Chap4. 折线图

概述

折线图可以反映某种现象的趋势。通常折线图的横坐标是时间变量,纵坐标则是一般的数值型变量。当然,折线图也允许横纵坐标为离散型和数值型。

折线图通常用来对两个连续变量之间的相互依存关系进行可视化。其中x也可以是因子型变量。

简单折线图

geom_line()
  1. 对于因子型变量,必须使用aes(group=1)以确保ggplot()知道这些数据点属于同一个分组,从而应该用一条折线连在一起。
  2. 数据标记相互重叠:需要相应地左移或者右移连接线以避免点线偏离。geom_line(position=position_dodge(0.2))
  3. 参数:线型(linetype),线宽(size),颜色(colour):边框线
  4. aes()函数外部设定颜色、线宽、线型和点型等参数会将所有目标对象设定为同样的参数值。
  5. 面积图:geom_area(),alpha调节透明度
  6. 堆积面积图:geom_area()基础上,映射一个因子型比那里给填充色(fill)即可
  7. 添加置信域:geom_ribbon(),然后分贝映射一个变量给ymin和ymax。geom_ribbon(aes(ymin=xx,ymax=xx), alpha = 0.2)

一、绘制单条折线图

library(ggplot2)
library(lubridate) #处理日期时间相关的R包,非常有用,强烈推荐
Year <- year(seq(from = as.Date('2006-01-01'), to = as.Date('2015-01-01'), by = 'year'))
Weight <- c(23,35,43,57,60,62,63,66,61,62)
df <- data.frame(Year = Year, Weight = Weight)
ggplot(data = df, mapping = aes(x = factor(Year), y = Weight, group = 1)) + geom_line() + xlab('Year')

有关离散变量的折线图 

type <- c('A','B','C','D','E')
quanlity <- c(1,1.1,2.1,1.5,1.7)
df <- data.frame(type = type, quanlity = quanlity)
ggplot(data = df, mapping = aes(x = type, y = quanlity, group = 1)) + geom_line()

有关连续变量的折线图 

set.seed(1234)

times <- 1:15

value <- runif(15,min = 5,max = 15)

df <- data.frame(times = times, value = value)

ggplot(data = df, mapping = aes(x = times, y = value)) + geom_line()

善于发现的你,可能会注意到上面三段代码有一个重要的不同之处,那就是第一段和第二段代码中含有‘group = 1’的设置这样做是因为横坐标的属性设置为了因子,即将连续型的年份和离散型的字符转换为因子,如果不添加‘group = 1’这样的条件,绘图将会报错。故务必需要记住这里的易犯错误的点!

往折线图中添加标记(点) 当数据点密度比较小或采集分布(间隔)不均匀时,为折线图做上标记将会产生非常好的效果。处理的方法非常简单,只需在折线图的基础上再加上geom_point()函数即可。

set.seed(1234)

year <- c(1990,1995,2000,2003,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015)

value <- runif(15, min = 10, max = 50)

df <- data.frame(year = year, value = vlaue)

ggplot(data = df, mapping = aes(x = year, y = value)) + geom_line() + geom_point()

 

从图中就可以非常明显的看出,刚开始采集的点分布非常散,而后面采集的点就比较密集,这也有助于对图的理解和应用。

二、绘制多条折线图 上面绘制的都是单条这折线图,对于两个或两个以上的折线图该如何绘制呢?也很简单,只需将其他离散变量赋给诸如colour(线条颜色)和linetype(线条形状)的属性即可,具体参见下文例子。

基于颜色的多条折线图

set.seed(1234)
year <- rep(1990:2015, times = 2)
type <- rep(c('A','B'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, colour = type)) + geom_line()

基于形状的多条折线图

ggplot(data = df, mapping = aes(x = year, y = value, linetype= type)) + geom_line()

同样需要注意的是,在绘制多条折线图时,如果横坐标为因子,必须还得加上‘group=分组变量’的参数,否则报错或绘制出错误的图形。

以上绘制的折线图,均采用默认格式,不论是颜色、形状、大小还是透明度,均没有给出自定义的格式。其实ggplot2包也是允许用户根据自己的想法设置这些属性的。

自定义线条或点的颜色—scale_color_manual()

自定义线条类型—scale_linetype_manual()

自定义点的形状—scale_shape__manual()

自定义点的大小或线条的宽度—scale_size__manual()

自定义透明度—scale_alpha__manual()

综合的例子:


ggplot(data = df, mapping = aes(x = year, y = value, linetype = type, colour = type, shape = type, fill = type))

+ geom_line() + geom_point() #绘制线图和点图

+ scale_linetype_manual(values = c(1,2)) #自定义线条类型

+ scale_color_manual(values = c('steelblue','darkred')) #自定义颜色

+ scale_shape_manual(values = c(21,23)) #自定义点形状

+ scale_fill_manual(values = c('red','black')) #自定义点的填充色

虽然这幅图画的优点夸张,目的是想说明可以通过自定义的方式,想怎么改就可以怎么改。前提是aes()属性的内容与自定义的内容对应上。

三、绘制堆积面积图

绘制堆叠的面积图只需要geom_area()函数再加上一个离散变量映射到fill就可以轻松实现,先忙咱小试牛刀一下。

set.seed(1234)
year <- rep(1990:2015, times = 2)
type <- rep(c('A','B'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area()

一幅堆叠的面积图就轻松绘制成功,但我们发现,堆叠的顺序与图例的顺序恰好相反,不用急,只需要加一句命令即可:

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area() + guides(fill = guide_legend(reverse = TRUE))

如果需要为每一块面积图的顶部加上一条直线,可以通过如下两种方式:

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(colour = 'black', size =1, alpha = .7) + guides(fill = guide_legend(reverse = TRUE))

其中,colour设置面积图边框的颜色;size设置边框线的粗细;alpha设置面积图和边框线的透明度。

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

该方法是通过添加堆叠线条(必须设置geom_line()中position参数为‘stack’,否则只是添加了两条线,无法与面积图的顶部重合)。这两幅图的区别在于第二种方式没有绘制面积图左右边框和底边框。在实际应用中,建议不要在面积图中绘制边框线,因为边框的存在可能产生误导

四、绘制百分比堆积面积图

在面积图中,也可以方便快捷的绘制出百分比堆积面积图,具体操作如下:

set.seed(1234)
year <- rep(1990:2015, times = 4)
type <- rep(c('A','B','C','D'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5), runif(26, min = 1.5,max = 2), runif(26, min = 2,max = 2.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(position = 'fill', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

但通过这种方式(设置面积图的positon='fill')存在一点点小缺陷,即无法绘制出百分比堆积面积图顶部的线条,该如何实现呢?这里只需要对原始数据集做一步汇总工作,让后按部就班的绘制面积图即可。

 library(dplyr)

df_by_type <- group_by(.data = df, year)

df_summarize <- mutate(.data = df_by_type, value2 = value/sum(value))

有关dplyr包的用法可参考: 

强大的dplyr包实现数据预处理

ggplot(data = df_summarize, mapping = aes(x = year, y = value2, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

哈哈,大功告成,就这么简单。

Chap5. 散点图

概述

散点图通常用来刻画两个连续型变量之间的关系。

散点图

geom_point()
  1. 参数值:shape(),size=2,colour()
  2. 更改配色与点形:scale_colour/shape_brewer/manual()
  3. 尽量将不需要高精度的变量映射给图形的大小和颜色属性。
  4. 调用scale_size_area()函数使数据点的面积正比于变量值。
  5. 处理图形重叠问题(overplotting):
    • 使用半透明的点
    • 将数据分箱(bin),并用矩形表示(适用于量化分析)stat_bin2d()
    • 将数据分箱(bin),并用六边形表示stat_binhex(packages:”hexbin”)
    • 使用箱线图
    • 离散x:调用geom_point(position_jitter())函数给数据点增加随机扰动。
  6. 添加回归模型拟合线:stat_smooth(method=lm,level=0.95)
  7. 添加自己构建的模型拟合线:geom_line(data=predicted,size=1)
  8. dlply()ldply()函数:切分数据,对各个部分执行某一函数,并对执行结果进行重组。
  9. 散点图中添加模型系数:+ annotate(parse = TRUE)函数添加文本。利用expression()检验输出结果
  10. 添加边际地毯(Marginal rugs):geom_rug()
  11. 添加标签:geom_text(aes(label=xxx),size=xx,x=xx+0.1)
    • vjust=1:标签文本的顶部与数据点对齐
    • vjust=0:标签文本的底部与数据点对齐
    • hjust=1/0:右对齐/左对齐
    • 通常先设定hjust()vjust()的值为0或1,然后再调整x或y的值来调整文本标签的位置.
    • 对数坐标轴:需令x或者y乘以一个数值才可以。
    • 去掉不需要的标签:将不需要刻画出来的标签赋值为NA
  12. 绘制气泡图:geom_point()scale_size_area(max_size=15)
  13. 散点图矩阵:base基础绘图系统,pairs()

散点图通常用来刻画两个连续型变量之间的关系,数据集中的每一条观测都由散点图中的一个点来表示。在散点图中也可以加入一些直线或曲线,用来表示基于统计模型的拟合。当数据集记录很多时,散点图可能会彼此重叠,这种情况往往需要一些预处理操作。

1 基本散点图

散点图可以用来描述两个连续变量之间的关系,一般在做数据探索分析时会使用到,通过散点图发现变量之间的相关性强度、是否线性关系等。 

使用geom_point()绘制散点图,并分别映射一个变量到x和y。

可以使用shape和size分别指定点型和点的大小,如果点型包括填充和描边的话,可用fill和color分别指定填充色和描边色。

2 基于类别型变量分组

可将分组变量(因子或字符变量)赋值给颜色或形状属性,实现分组散点图的绘制

可以将因子和字符串等类别型变量映射到散点的颜色或形状。

 

set.seed(112)
x <- rnorm(100,mean = 2,sd = 3)
y <- 1.5+2*x+rnorm(100)
z <- sample(c(0,1),size = 100,replace = TRUE)
df <- data.frame(x = x,y = y,z = z)
# 将数值型变量转换为因子型变量
df$z <- factor(df$z)

#分组变量赋值给颜色属性
ggplot(df,aes(x = x,y = y,colour = z))+
geom_point(size = 3)

#分组变量赋值给形状属性
ggplot(df,aes(x = x,y = y,shape = z))+
geom_point(size = 3)

# 分组变量同时赋给颜色属性和形状属性
ggplot(df,aes(x = x,y = y,shape = z,colour = z))+
geom_point(size = 3)+
scale_color_brewer(palette = "Accent")+
scale_shape_manual(values = c(2,16))

注意点的形状,21-25之间的点的形状,既可以赋值边框颜色,又可以赋值填充色。

将离散型变量或因子映射给颜色属性或形状属性

x <- c(10,13,11,15,18,20,21,22,24,26) y <- c(76,60,70,58,55,48,44,40,26,18) z <- c(100,120,300,180,80,210,30,95,145,420) df <- data.frame(x = x,y = y,z = z) # 将连续型变量映射给颜色属性 ggplot(df,aes(x = x,y = y,colour = z))+ geom_point(size = 3)

图例上,颜色越深而对应的值越小,如何将值的大小与颜色的深浅保持一致?只需要人为的设置色阶,从低到高设置不同的颜色即可

3 基于连续型变量映射

当然,还可以将连续型变量映射到散点的颜色或大小等存在渐变的属性上,从而呈现三个连续型变量之间的关系。其中人眼对于x轴和y轴所对应变量的变化更为敏感,而对颜色和大小的变化则不那么敏感。 

同时映射类别型变量和连续型变量,并设置散点的面积正比于连续型变量的大小,默认为非线性映射。

  • 26
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值