全栈 - 13 ggplot2 在R中进行可视化

这是全栈数据工程师养成攻略系列教程的第十三期:13 ggplot2 在R中进行可视化。

我们已经具备了一定的代码基础,现在不妨来了解下数据可视化,从生动的图形中更好地感受数据之美。R是一门统计分析语言,和Python一样,语法简单并且有非常丰富的功能包,其中的ggplot2包便可以用简洁的语法绘制出美观多样的图形。

下载和安装

如果没有R的话需要去下载并安装,在R的官网中找到下载链接,选择最近的镜像地址下载即可,https://www.r-project.org/。安装完毕后即可运行R,软件如下图所示,界面比较简单,提供的用户图形化接口十分有限。

因此可以再安装一个叫作RStudio的软件,它基于R的内核提供了更佳丰富的用户图形化操作界面,使用起来更方便,用户体验更好。可以在RStudio的官网找到下载链接,下载并安装RStudio,https://www.rstudio.com/。安装完毕后运行RStudio,软件界面如下图所示。

左上角的两个按钮分别用于新建各种文件和打开已有文件,左边是一个交互命令行,可以交互式地执行代码。右边上半部分是环境窗口(Environment)和历史窗口(History),分别可以查看当前编程环境中已有的变量,以及查看历史命令记录。右边下半部分包括文件(Files)、绘图(Plots)、包(Packages)、帮助(Help)等标签页,分别用于查看文件目录、查看绘图结果、查看引用的包、查看帮助文档。

例如,在左边的交互命令行中输入?plot并回车,即可在右边的Help中查看plot函数的使用文档。再输入a <- 1并回车,即可在右边的Environment中看到已有的变量,同时在History中也可以看到之前执行的两条命令记录。

R基础

安装包和加载包

R和Python一样,功能之所以强大是因为它具备丰富多样的功能包。在R中使用以下命令即可安装一个新的包,例如ggplot2,包的名字需要用引号括起来。

install.packages("ggplot2")

功能包安装完毕之后,即可加载并使用其提供的数据集、函数和功能,使用以下命令加载一个功能包,包的名字不需要用引号括起来。

library(ggplot2)

数据结构

R中的数据结构主要有向量、矩阵、数组、数据框、因子和列表。

向量是用于存储数值型、字符型或逻辑型数据的一维数组,单个向量中的数据必须拥有相同的类型或模式,即要么都是数值型,要么都是字符型,要么都是逻辑型。可以发现,R中的赋值使用箭头符号<-,而不是其他语言常用的=

# 数值型
a <- c(1, 2, 5, 3, 6, -2, 4)
# 字符型
b <- c("one", "two", "three")
# 逻辑型
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)

用方括号可以访问向量中的元素,例如访问向量a中的第二个和第四个元素,可以用a[c(2, 4)]。向量也支持支持冒号语法,a[2:6]将返回a的第二至第六个元素。所以向量的用法和Python中list有相似又不同,Python中list的下标从0开始,而且冒号语法只包括开始下标但不包括结束下标。另外Python中负号下标表示从后往前数,而向量中负号表示排除,例如a[-1]返回向量a中除了第一个以外的其他全部元素。

矩阵是一个二维数组,每个元素都拥有相同的类型,必须都为数值型、字符型或逻辑型,可通过函数matrix创建矩阵。

mymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=FALSE, dimnames=list(rownames, colnames))

其中vector向量包含了全部矩阵元素,nrow和ncol为行数和列数,byrow默认为FALSE表示按列填充,否则TRUE为按行填充,dimnames为行名和列名。使用时,只有前三个参数是必须的。

y <- matrix(1:20, nrow=5, ncol=4)
cell <- c(1, 26, 24, 68)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cell, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames))
mymatrix <- matrix(cell, nrow=2, ncol=2, byrow=FALSE, dimnames=list(rnames, cnames))

x[i,]表示矩阵x中的第i行,x[,j]表示矩阵x中的第j列,x[i, j]表示矩阵x中的第i行第j个元素,或者使用数值型向量代替i、j以同时选择多行或多列。

数组和矩阵类似,但是维度可以大于2,通过array函数创建。

myarray <- array(vector, dimensions, dimnames)

其中vector包含数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,dimnames可选,以向量形式指定各个维度的名称。

dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z <- array(1:24, c(2, 3, 4), dimnames=list(dim1, dim2, dim3))

数据框可以理解成数据库中的表,即每一行表示一条记录,每一列表示一项字段。不同列可以包含不同类型,例如某一列为数值型而另一列为字符型,但每列所有行的数据类型必须相同。数据框通过data.frame创建,是R中最为重要的一种数据结构。

patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)

访问数据框中的数据可以通过以下三种方式:

# 访问第一列和第二列
patientdata[1:2]
# 按列名访问,使用方括号和向量
patientdata[c("diabetes","status")]
# 按列名访问,使用$
patientdata$age

无序类别型变量和有序类别型变量在R中都称为因子。简单来说,因子就是一种离散值,例如性别只能是male和female,对应两个字符型因子,或者分别用0和1来表示,对应两个数值型因子。如果因子的不同水平之间存在排序关系,则称为有序因子。以下代码中,diabetes对于不同的人只能取Type1或Type2,因此是一个因子。

diabetes <- factor(c("Type1", "Type2", "Type1", "Type1"))

以下代码中,status对于不同的人只能取Poor、Improved或Excellent
,同时三者之间存在排序关系,因此使用orderded=TRUE指定为一个有序因子。

status <- factor(c("Poor", "Improved", "Excellent", "Poor"), ordered=TRUE)
# 或者手动指定排序的顺序
status <- factor(c("Poor", "Improved", "Excellent", "Poor"), ordered=TRUE, levels=c("Poor", "Improved", "Excellent"))

列表和向量一样,同样是多个元素的排列,但每个元素可以是以上提及的任何数据结构,甚至是其他列表的组合,即嵌套列表。使用list定义一个列表,并可以为各个元素进行命名。

g <- "My First List"
h <- c(25, 26, 18, 39)
j <- matrix(1:10, nrow=5)
k <- c("one", "two", "three")
mylist <- list(title=g, ages=h, j, k)
mylist

可以看到mylist包括四个元素,使用mylist[[2]]mylist$age或者mylist[["ages"]]访问其中的第二个元素。

最后需要注意的是,R中的变量名、行名、列名等名称,都尽量使用纯英文,避免使用中文导致错误。

数据集

R中提供了很多数据集,安装包也会提供一些额外的数据集,这些数据集大多以数据框的形式给出,例如mtcars数据集提供了32款车型的11项参数值,所有参数值都为数值型。

head(mtcars)
nrow(mtcars)
names(mtcars)
summary(mtcars)

另外,也可以从csv、txt等文件中读取数据为数据框,使用data.table包的fread()函数读取数据,例如之前提供的douban_movie_clean.txt。读取之前需要在Files标签页中找到数据文件,然后点击齿轮中的Set As Working Directory,将当前目录设为工作路径。

# 没有包则安装
# install.packages("data.table")
library(data.table)
douban_movie_clean <- fread("douban_movie_clean.txt", header=TRUE, sep="^", encoding="UTF-8")

R脚本

除了在交互命令行中编写R代码,一种更方便的选择是使用R脚本,就如同新建一个.py代码,在Sublime中编辑完毕后再运行一样。点击左上角的新建文件按钮,选择R Script,在新建的R脚本中可以自由地编写多行代码。编写完毕后,选中全部或者部分代码,点击R脚本右上方的Run按钮,即可运行选中的代码。

ggplot2

ggplot2是R中的一个功能包,可以用简洁统一的语法绘制出美观多样的图形。安装好ggplot2之后,让我们通过一个简单的例子感受下ggplot2的魅力。

# 如果没有则安装
# install.packages("ggplot2")
# 加载包
library(ggplot2)
ggplot(douban_movie_clean) + geom_histogram(aes(x=length))

以上代码对豆瓣电影数据集的片长这一字段绘制直方图,横轴为电影片长,纵轴为每个片长区间的电影数量。绘图结果将显示在Plots标签页中,可以点击Zoom按钮放大图像,可以发现大多数电影的片长集中在90至120分钟之间。

R学习笔记

如果对R感兴趣、希望进一步了解更多内容,可以访问我的博客,http://zhanghonglun.cn/blog/tag/r/,以上链接以r为标签搜索相关文章,搜索结果中会有一个《R学习笔记》系列,共14篇文章,可作为进一步学习R的参考资料。

视频链接:在R中进行可视化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容