查看原文
其他

吉林说R图系列|第一篇:如何绘制各类图形

2016-09-02 王吉林 R语言中文社区

引言

六月一个星期六的晚上,我静静地坐在顺德图书馆文筑书店的一张书台前看书,伸懒腰之际,无意间看到了龙应台的书籍(人生三本书),我随手拿起其中的一本——《目送》开始浏览,平实的文字却触动了我内心的灵魂。一种感伤的情绪在身体里慢慢沸腾,像吸了内功,走火入魔似的上蹿下跳。一晃毕业好多年了,离三十岁也仅有半年的时间。人们常说,三十而立,而我却像小孩子一样,无忧无虑的活着,工作生活井井有条,在别人眼里应该是一个非常幸福的人。偶尔做做饭、打打羽毛球、逛逛街也算得上充实。最近的半年,时不时会觉得生活少了些什么,却也不曾深度思考过。我没有什么炫酷的才艺,也没有华丽的外表,习惯了平凡的味道,脑海里平平淡淡、简简单单才是生活的根本,幸福的归宿。感慨流年之余,我也开始问自己,除了工作、做饭、羽毛球、逛街,我还能做点什么?

从那以后,我开始捡起久违的R语言,研究数据的可视化、研究网络爬虫、研究正则表达式、研究关联关系、研究中文分词、研究情感分析、研究数据挖掘等方面的应用。一段时间以来,我发现我有了小小的变化,我开始喜欢问为什么,喜欢去发现问题并且尝试解决它,喜欢给别人解答疑问,我认识了黄小伟同学,同时加入了R语言中文社区,成了问答导师。这是我继人大经济论坛高校板块版主之后,又一次与R打交道。虽然自己的能力有限,但是我觉得生活的天空又多了一道色彩,坚定的脚步下又多了一片快乐的沃土。

昨天一位北大的博士让我去做他的老师,跟我学习R语言,我内心是纠结的,也是高兴的。他是问答上问过我的第几位同学,我已经记不清楚了,我没有立即答应,也没有拒绝,我还在考虑,考虑的问题:一是我的能力,我只是个小硕;二是我还要工作学习,可能没有那么多连续的时间来教。

为了能够将我所学、所知、所感更好地和R爱好者交流,让初学R语言的人能够有效率的掌握相关知识,让R更好的帮助人们解决在实际工作生活遇到的问题,我特地咨询了我的小伙伴黎秀慧同学,决定写一个系列文章——吉林说R图。首先从可视化主题开始,主要是基于形象、具体、能够引起学习兴趣考虑。以后我会写不同主题的系列文章。

在介绍各种绘图功能之前,我们首先看一些图形参数代表的意义,这些参数可以帮助我们在以后绘图的过程中画出精美的并且符合预期的图形。

各图形参数含义

adj 控制关于文字的对齐方式,0是左对齐,0.5是居中对齐,1是右对齐,值> 1时对齐位置在文本右边的地方,取负值时对齐位置在文本左边的地方;如果给出两个值(例如c(0, 0)),第二个只控制关于文字基线的垂直调整

bg 指定背景色(例如bg="red", bg="blue"; 用colors()可以显示657种可用的颜色名)

bty 控制图形边框形状,可用的值为: "o", "l", "7", "c", "u" 和"]" (边框和字符的外表相像);如果bty="n"则不绘制边框

cex 控制缺省状态下符号和文字大小的值; 另外,cex.axis控制坐标轴刻度数字大小,cex.lab控制坐标轴标签文字大小,cex.main控制标题文字大小,cex.sub控制副标题文字大小

col 控制符号的颜色; 和cex类似, 还可用:col.axis, col.lab, col.main, col.sub

font 控制文字字体的整数(1: 正常,2: 斜体,3: 粗体,4: 粗斜体);和cex类似,还可用: font.axis, font.lab, font.main, font.sub

las 控制坐标轴刻度数字标记方向的整数(0: 平行于轴,1: 横排,2: 垂直于轴,3:竖排)

lty 控制连线的线型, 可以是整数(1: 实线,2: 虚线,3: 点线,4: 点虚线,5: 长虚线,6: 双虚线),或者是不超过8个字符的字符串(字符为从"0"到"9"之间的数字)交替地指定线和空白的长度,单位为磅(points)或象素,例如lty="44"和lty=2效果相同

lwd 控制连线宽度的数字

mar 控制图形边空的有4个值的向量c(bottom, left, top, right), 缺省值为c(5.1, 4.1, 4.1, 2.1)

mfcol c(nr,nc)的向量,分割绘图窗口为nr行nc列的矩阵布局,按列次序使用各子窗口

mfrow 同上,但是按行次序使用各子窗口

pch 控制符号的类型,可以是1到25的整数,也可以是""里的单个字符

ps 控制文字大小的整数,单位为磅(points)

pty 指定绘图区域类型的字符,"s": 正方形,"m":最大利用

tck 指定轴上刻度长度的值,单位是百分比,以图形宽、高中最小一个作为基数;如果tck=1则绘制grid

tcl 同上,但以文本行高度为基数(缺省下tcl=-0.5)

xaxt 如果xaxt="n"则设置x-轴但不显示(有助于和axis(side=1, ...)联合使用)

yaxt 如果yaxt="n"则设置y-轴但不显示(有助于和axis(side=2, ...)联合使用)

 

了解了一些绘图参数的意义后,我们来看各种图形的画法吧,这里主要做简单的展示,后续的文章将针对每一类图形给出实际应用的场景,敬请期待。

一、二维空间图形

(一)散点图

散点图表示因变量随自变量而变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。函数plot(x,y):其中x,y为向量。

> #散点图

> plot(cars,col=rainbow(7),pch=1:25,main="散点图_PLOT",

+      col.main='blue',cex.main=1.5,font=2,sub = "吉林说R图系列", col.sub =  "gray20",

+      cex.names = 1.5)


 

 

(二)直方图

直方图通过在X 轴上将值域分割为一定数量的组,在Y 轴上显示相应值的频数,展示了连续型变量的分布。函数hist(x,freq=FALSE, breaks = "Sturges"):其中x是一个由数据值组成的数值向量,参数freq=FALSE表示根据概率密度而不是频数绘制图形,参数breaks用于控制组的数量。在定义直方图中的单元时,默认将生成等距切分。

> hist(x, freq = FALSE, ylim = c(0, 0.2),main="直方图_hist",+ col.main='blue',cex.main=1.5,font=2,,sub = "吉林说R图系列", col.sub =  "gray20",

+      cex.names = 1.5)

> curve(dchisq(x, df = 4), col ='red', lty = 2, lwd = 2, add = TRUE)

 

(三)条形图

条形图通过垂直的或水平的条形展示了类别型变量的分布(频数)。函数barplot(height),其中的height是一个向量或一个矩阵。

> #条形图

> hh <- t(VADeaths)[, 5:1]

> mybarcol <- "gray20"

> mp <- barplot(hh, beside = TRUE,

+               col =rainbow(4),

+               legend = colnames(VADeaths), ylim = c(0,100),

+               main = "死亡率_barplot", font.main = 2,col.main='blue',

+               sub = "吉林说R图系列", col.sub =  "gray20",

+               cex.names = 1.5)

 

(四)饼图

饼图在商业世界中无所不在,然而多数统计学家,包括相应R文档的编写者却都对它持否定态度。相对于饼图,他们更推荐使用条形图或点图,因为相对于面积,人们对长度的判断更精确。也许由于这个原因,R中饼图的选项与其他统计软件相比十分有限。函数pie(x):其中x为非负向量。

> #饼图

> pie(pie.sales, col = c("purple", "violetred1", "green3",

+     "cornsilk", "cyan", "white"),

+     main = "销量_pie",  col.main='blue',cex.main=1.5,

+     font.main=2,sub = "吉林说R图系列", col.sub =  "gray20",+     cex.names = 1.5)

 

(五)箱线图

箱线图(又称盒子图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值,描述了连续型变量的分布。箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值,IQR表示四分位距,即上四分位数与下四分位数的差值)的观测。函数boxplot(x)

> #箱线图

> boxplot(len ~ dose, data = ToothGrowth,

+         boxwex = 0.25, at = 1:3 - 0.2,

+         subset = supp == "VC", col = "yellow",

+         main = "牙齿生长_boxplot",

+         col.main='blue',cex.main=1.5,

+         font.main=2,

+         xlab = "Vitamin C dose mg",

+         ylab = "tooth length",

+         xlim = c(0.5, 3.5), ylim = c(0, 35), yaxs = "i",

+         sub = "吉林说R图系列", col.sub =  "gray20",

+         cex.names = 1.5)

> boxplot(len ~ dose, data = ToothGrowth, add = TRUE,

+         boxwex = 0.25, at = 1:3 + 0.2,

+         subset = supp == "OJ", col = "orange")

> legend(2, 9, c("Ascorbic acid", "Orange juice"),

+        fill = c("yellow", "orange"))

 

(六)点图

点图提供了一种在简单水平刻度上绘制大量有标签值的方法。函数dotchart(x,labels=):其中x是一个数值向量,而labels则是由每个点的标签组成的向量。你可以通过添加参数groups来选定一个因子,用以指定x中元素的分组方式。如果这样做,则参数gcolor可以控制不同组标签的颜色,cex可控制标签的大小。

> #点图

> dotchart(VADeaths,col=rainbow(7) ,main = "1940年死亡率_dotchart",  col.main='blue',cex.main=1.5,

+ font.main=2,sub = "吉林说R图系列", col.sub =  "gray20",

+ cex.names = 1.5)

 

二、三维空间图形

(一)曲面图

1基于persp

> #曲面图

> par(bg = "white")

> x <- seq(-1.95, 1.95, length = 30)*10

> y <- seq(-1.95, 1.95, length = 35)*10

> z <- outer(x, y, function(a, b) a*b^2)

> nrz <- nrow(z)

> ncz <- ncol(z)

> # Create a function interpolating colors in the range of specified colors

> jet.colors <- colorRampPalette( c("blue", "green") )

> # Generate the desired number of colors from this palette

> nbcol <- 100

> color <- jet.colors(nbcol)

> # Compute the z-value at the facet centres

> zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz]

> # Recode facet z-values into color indices

> facetcol <- cut(zfacet, nbcol)

> persp(x, y, z, col = color[facetcol], phi = 30, theta = -30,

+       ltheta = 10, shade = 0.01, ticktype = "detailed",

+       xlab = "X", ylab = "Y", zlab="X*Y^2")

> title(main="曲面图_persp",

+       col.main='blue',cex.main=1.5,

+       font.main=2,sub = "吉林说R图系列",col.sub =  "gray20")

 

(二)地图

1.基于百度地图

>#地图

>install.packages("RJSONIO")

>install.packages("geosphere")

>install.packages("jpeg")

>install.packages("mapproj")

>install.packages("proto")

>install_github('badbye/baidumap')

>install_github('lchiffon/REmap')

>install.packages("ggmap")

>install.packages("dplyr")

>install.packages("tidyr")

> library(baidumap)

> library(ggmap)

> library(dplyr)

> library(RColorBrewer)

> library(tidyr)

> library(grid)

> mytheme<-theme_bw()+theme(legend.position="top",

+                           panel.border=element_blank(),

+                           panel.grid.major=element_line(linetype="dashed"),

+                           panel.grid.minor=element_blank(),

+                           plot.title=element_text(size=15,

+                                                   colour="#003087",

+                                                   family="CA"),

+                           legend.text=element_text(size=9,colour="#003087",

+                                                    family="CA"),

+                           legend.key=element_blank(),

+                           axis.text=element_text(size=10,colour="#003087",

+                                                  family="CA"),

+                           strip.text=element_text(size=12,colour="#EF0808",

+                                                   family="CA"),

+                           strip.background=element_blank()

+ )

> q <- getBaiduMap('石牌暨南大学', width=600, height=600, zoom=18, scale = 2, messaging=FALSE)

> ggmap(q,axes=NULL)+

+   labs(list(title="地图_ggmap", x = "吉林说R图系列",

+             y = NULL,col = "blue" ))+ mytheme


2.基于REmap

> #library(devtools)

> #install_github("Lchiffon/REmap")

> rm(list=ls())

> library(REmap)

> options(remap.js.web = T)

> library(maps)

> data=read.csv("cityvalue.csv",header = T)

> markline=data.frame(origin=rep("广州",10),des=c("广西","湖南","湖北","贵州","河南","江西","福建","北京","浙江","四川"))

> markpoint=data.frame(points=c("广西","湖南","湖北","贵州","河南","江西","福建","北京","浙江","四川"))

> remapC(data,markLineData = markline,markPointData = markpoint,title="人口迁徙_remapC",subtitle= "吉林说R图系列")


~~本文未完,鉴于篇幅限制,特殊图形绘制,请看第二篇


(小编提示,如果觉得很赞,就支持一下作者吧!!!)


【温馨提示】本文所有数据、word,请点击“阅读原文”,直接进入云盘下载哦!  访问密码 88f2

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存