|
数据可视化是将数据用图形等视觉效果展现出来的过程与方式,出现于计算机诞生之前更久远的年代。
最早的数据可视化使用统计图形将数据中蕴含的统计规律非常直观地展现出来,如折线图、直方图、饼图等。
基于图形的展示可以把枯燥数字背后的规律直观地呈现,更容易增强读者的理解与印象。计算机诞生之后,信息可视化逐渐成为一个学科分支,其最初的含义和统计图形有所区别,通常展现的是一些统计规律之外的信息,比如等高线图、大规模散点图等。
伴随现代信息技术的不断发展,信息可视化的范畴越来越广泛。无论是数值还是非数值的信息,都可以通过可视化的手段展现出来。传统的统计图形和现代的信息可视化相结合,使得数据可视化的发展达到了新的高度。
在大数据时代,数据的外延不断扩大,人们对数据的认知早已不再仅仅是结构化的数值数据,统计图形和信息可视化的区别越来越小,两个概念大有合二为一的趋势。
可视化为什么重要?
什么是安斯库姆Anscombe四重奏? - 知乎 https://www.zhihu.com/question/67493742
一个有用的Python可视化库yellowbrick-Anscombe's Quartet - civilpy的文章 - 知乎 https://zhuanlan.zhihu.com/p/78807533
什么是安斯库姆Anscombe四重奏? - 数据小兵的回答 - 知乎 https://www.zhihu.com/question/67493742/answer/2339920091
1973年,统计学家F.J. Anscombe构造出了四组奇特的数据。它告诉人们,数据分析之前,描绘数据所对应的可视化图形有多么的重要!
图形设备
在数据可视化领域,图形设备通常指代软件系统:它可以是某个软件的图形显示窗口,比如 SPSS的图形输出窗口,或者 Excel 的工作表;也可以是图形文件,比如 PDF、BMP、JPG 等。
在图形输出方面,最常见的文件格式分别是位图和矢量图。
位图也称为点阵图,简单来说就是由像素点组成的图。对于位图中的每个像素点,可以使用一套色彩模式来描述其颜 色,最常用的是 RGB 模式。
矢量图使用了另外一套图形描述机制,通过曲线和角 度来存储形状特征,无须通过像素。因此,矢量图无论如何放大都不会损失清晰度。
在 R 和 Python中,默认的交互界面自带了图形设备,可以通过执行基础绘图命令来自动调出。
以下的 R 代码可以画一个 X 轴坐标为 1、Y 轴左边也为 1 的散点,点的形状为“o”。 R 界面会自动弹出一个图形设备,就类似一块画布,每次更新图形都会重绘。
plot(1, 1, pch = "o")
# 准备工作
setwd("E:\\R语言资料\\Data-Science-in-Action-R-Tools-and-Case-Studies-master3\\R与千寻(代码+数据)")
#确定数据的读取路径,需要先把数据文件放在E盘
library(tmcn)
## Warning: package 'tmcn' was built under R version 4.0.5
## # tmcn Version: 0.2-13
library(readxl)
## Warning: package 'readxl' was built under R version 4.0.5
df1 <- read_excel(&#34;cellphone.xlsx&#34;) #读取数据集 ,见qq群
# df1<- read.csv(file = file.choose()) #图形化方式选择数据集文件
## Registered S3 methods overwritten by &#39;tibble&#39;:
## method from
## format.tbl pillar
## print.tbl pillarcellphone.xlsx
551.8K
· 百度网盘
df2 <- df1[df1$MSales > 0 & df1$Comments > 0, ] #取MSales和Comments大于0的数据
df2$MSales <- log(df2$MSales) #对MSales取对数
df2$Comments <- log(df2$Comments) #对Comments取对数
# 画出散点图并保存成pdf
pdf(file = &#34;vis_plot1.pdf&#34;, width=8, height=5)
plot(MSales ~ Comments, data = df2)
dev.off()
## png
## 2Python 绘图需要依赖第三方程序包,目前最常用的是matplotlib包,其也是很多 Python绘图包的基础。
import matplotlib.pyplot as plt
plt.plot(1, 1, marker = &#34;o&#34;)
plt.show()基础作图
在各种统计软件和编程语言中,统计图形的绘制流程都是类似的: >指定一个图形的类别,比如“散点图”“条形图”“直方图”等 >设定用于绘图的数据源 >设定所要选取的变量或者关系
在 R 和 Python的基础作图方式类似,通过函数和方法来指定图形类别,比如 R 语言中使用plot 函数绘制散点图,Python 中使用 scatter 方法绘制散点图。
两种软件都是用数据框定义数据源,通过data参数来指定。
R 语言用公式的形式来设定变量与关系,“~” 符号的左边表示因变量,右边表示自变量。Python 的绘图方法以字符串的形式指定变量(自变 量)和 y 变量(因变量)的名称。
# R 基础画图示例
plot(MSales ~ Comments, data = df2)
# Python 基础画图示例
#plt.scatter(&#39;MSales&#39;, &#39;Comments&#39;, data = df2)
# R 修改轴标签和图标题
plot(MSales ~ Comments, data = df2,main = &#34;Test&#34;, xlab = &#34;X&#34;, ylab = &#34;Y&#34;)
修改颜色和形状
对于统计图形来说,颜色、形状、大小是非常重要的参数。以散点图为例,点的颜色、形状和大小都可以使用图形参数进行精确控制。 以下代码把颜色设置成红色,形状设置成圆点,大小使用默认值。
# R 修改颜色和形状
plot(MSales ~ Comments, data = df2[1:20, ], col = &#34;red&#34;, #颜色为红
pch = 19, #形状为圆点
cex = 1) #大小为默认值
修改线型
线图是非常常用的图形,R 语言中通过 plot 将函数的参数 type 设置成 l 可以绘制线图。Python 中的 plot 函数用来展现数据的趋势变化,实际上也是线图。
R 中设置线型的参数是lty,用整数表示不同形状,设置线宽的参数是 lwd。Python 中设置线型的参数是 linestyle, 设置线宽的参数是 linewidth。
# 修改线型
pdf(file = &#34;vis_plot4.pdf&#34;, width=8, height=5)
plot(MSales ~ Comments, data = df2[1:20, ],
type = &#34;l&#34;, #确定画线图
lty = 2, #线型
lwd = 2, #宽度
col = &#34;red&#34;) #颜色
dev.off()
## png
## 2
pdf(file = &#34;vis_plot5.pdf&#34;, width=8, height=5)在一些图形中,可以用不同的颜色、大小、性状来描述不同的分类变量的组别,这是使用编程语言来绘图的一种便利方式。
R 可以直接使用向量作为参数,自动控制分组。Python 需要根据不同组别的数据分别作图,通过 label参数来标记组别,最后将图形叠加。
plot(MSales ~ Comments,
data = df2[df2$Place %in% c(&#34;广东 广州&#34;, &#34;浙江 杭州&#34;), ][1:20,],
col = factor(Place), #根据Place变量确定点的颜色
pch = 19)
dev.off()
## pdf
## 3
pdf(file = &#34;vis_plot6.pdf&#34;, width=8, height=5, family=&#34;GB1&#34;)添加图例
如果图形中进行了分组处理,研究者需要标注图例。 R语言的基础作图方式中直接通过设定坐标、点或者线的形状、颜色、标签等手工生产图例,Python 可以利用图形中的 label 标签直接生成图例。
plot(MSales ~ Comments,
data = df2[df2$Place %in% c(&#34;广东 广州&#34;, &#34;浙江 杭州&#34;), ][1:20,],
col = factor(Place), pch = 19)
# 加上图例
legend(0, 6, legend = c(&#34;广州&#34;, &#34;杭州&#34;), col = c(1, 2), pch = 19)
dev.off()
## pdf
## 3
pdf(file = &#34;vis_plot7.pdf&#34;, width=8, height=5, family=&#34;GB1&#34;)
plot(MSales ~ Comments,
data = df2[df2$Place %in% c(&#34;广东 广州&#34;, &#34;浙江 杭州&#34;), ][1:20,],
col = factor(Place), pch = 19)
legend(0, 6, legend = c(&#34;广州&#34;, &#34;杭州&#34;), col = c(1, 2), pch = 19)
# 加上文字
text(1, 2, expression(paste(mu, &#34;=100, &#34;, sigma, &#34;=15&#34;)))
dev.off()
## pdf
## 3 将R的输出结果导出到文件 - shixiang的文章 - 知乎 https://zhuanlan.zhihu.com/p/521993439
ggplot2
1999 年,Leland Wilkinson创造了一套专门用于图形编程的语法,并出版了经典著作《The Grammar of Graphics》。其摆脱了传统的基于点、线、面的统计作图方式,从数据的坐标系、 关系、统计变换等角度入手,用语法来描述数据的规律,同时可视化地进行展现。 2005 年,Hadley Wickham 基于 R 语言创造了 ggplot2,第一次完美实现了《The Grammar of Graphics》的理念。 此后,Python、MATLAB 以及一些互联网可视化平台都参照 ggplot2 实现了这种作图语法的可视化模块。
Hadley 在 R 语言圈是个如雷贯耳的名字,他创建并发布了很多流行的 R 包,近两年下载量超过 2 亿次。
2019 年 7 月 31 日,Hadley获得了统计领域的最高奖项——考普斯奖,主要表彰他开发的以ggplot2为代表的一些 R 语言统计包,这是该奖项历史上第一次颁发给业界应用领域的专家。
在 R 里,主要有两大底层图形系统,一是基础图形系统,二是 grid 图形系统。lattice 包与 ggplot2包正是基于 grid 图形系统构建的,而基础绘图函数由 graphics 包提供,它们都有自己独特的语法。R 语言基础安装中就包含 graphics、grid 和 lattice 三个包,无须另外下载。
ggplot2 包则基于一种全面的图形语法,提供了一种全新的图形创建方式,这套图形语法把绘图 过程归纳为数据(data)、转换(transformation)、度量(scale)、坐标系(coordinate)、元素(element)、 指引(guide)、显示(display)等一系列独立的步骤,通过将这些步骤搭配组合,来实现个性化的统 计绘图。于是,得益于该图形语法,Hadley Wickham 所开发的 ggplot2 包是如此人性化,不同于 R graphics 包的基础绘图和先前的 lattice 包那样参数繁多,而是摈弃了诸多烦琐细节,并以人性化的思 维进行高质量作图。在 ggplot2 包中,加号(+)的引入是革命性的,这个神奇的符号完成了一系列 图形语法叠加.
R 语言和 Python 中的 ggplot 工具都来自同一套语法,因此程序形式几乎可以通用。
ggplot2绘图三要素
1.data(通常为dataframe形式)
2.图形属性映射(用aes()函数添加,所绘制数据所对应的x,y轴、数据分组所用颜色等属性)
3.几何对象(用geom_someshape()添加。所绘制数据所使用的的几何形状,大小,颜色等属性)
#注意:如果color放在aes()中,所代表的是不同分组的颜色。aes可以通过标度将不同分类信息(如表一中:cut,color等)转化成color,shape,size等信息
R语言绘图(2)---ggplot2绘图三要素_flower先生的博客-CSDN博客
注意:ggplot2包需要提前安装,安装过程中如果弹出警告,需要安装Rtools工具,可以忽略。Rtools提供了一个适用于R的Windows平台工具链,它主要包括GNU make,GNU gcc和UNIX-ish平台上常用的其他实用程序。有的包是用c++源码写的,需要用到gcc工具链编译。这个ggplot2不需要。如果安装过程下载速度慢,可以换一个国内镜像试试。
讨厌的警告
如果不习惯警告,就安装一个Rtools
下载链接https://cran.r-project.org/bin/windows/Rtools/
有时候换一个镜像就可以
包依赖很重要,没有办法跳过,一个一个地下载安装
一定要看到成功字样
library(ggplot2)
p<-ggplot(diamonds,aes(carat,table))
p
diamonds
p+geom_point(color=&#39;red&#39;)
p+geom_point(aes(color=&#39;red&#39;))
ggplot(diamonds,aes(carat,price,color=cut))+geom_point()
分开看细节
p<-ggplot(diamonds,aes(carat,table))
p
p<-ggplot(diamonds,aes(carat,table))
diamonds
p<-ggplot(diamonds,aes(carat,table))
p+geom_point(color=&#39;red&#39;)
注意,红色并没有放在aes函数中,这时红色针对所有点
p<-ggplot(diamonds,aes(carat,table))
p+geom_point(aes(color=&#39;red&#39;))
ggplot(diamonds,aes(carat,price,color=cut))+geom_point()
基本实例
# ggplot示例
library(ggplot2)
## Warning: package &#39;ggplot2&#39; was built under R version 4.0.5
p <- ggplot(mtcars, aes(x = mpg, y = wt))
print(p) # 只显示画布
# 确定几何对象(点图)
p <- p + geom_point()
print(p) # 显示散点图
# 叠加图层(拟合曲线)
p <- p + geom_smooth(method = &#34;loess&#34;)
print(p) # 在散点图基础上呈现拟合曲线
## `geom_smooth()` using formula &#39;y ~ x&#39;
常容易地做出散 点图,而且可以直接画出平滑线并标示置信区间。
可视化与数据分析
数据可视化和分析建模一样,都要求研究者对数据有深入的理解并进行合理的假设。
研究者使用统计图形来分析数据、解释数据,需要深入了解数据的内在规律,包括层次结构、分布情况等,这样 才能找到合适的分析方法或者图形来匹配。
另一方面,作图的过程也是研究者探索和发现规律 的过程。研究者在进行数据分析和建模之前,使用统计图形来探索并理解数据,往往可以事半功倍。
单变量的分布
在数据分析中,不同尺度的数据需使用对应的统计量进行描述分析,如定类尺度使用众数、定序尺度使用中位数、定量尺度使用均值。
统计图形也和数据尺度有关,研究者通常使用直方图描述定量数据,使用条形图描述定性数据。
直方图是一种常用的统计图形,它能够帮助研究 者查看连续变量的分布情况,通过将数据分割后再统计每一组的数目,得到类似于分布密度图的统计图形,从而查看连续数据的分布特征。
可视化与数据分析
# 2.可视化与数据分析
df3 <- df2[df2$Place %in% c(&#34;广东 广州&#34;, &#34;浙江 杭州&#34;), ]
# 单变量的分布
# 画出连续型变量MSales的直方图
pdf(file = &#34;vis_ana1.pdf&#34;, width=8, height=5)
hist(df2[[&#39;MSales&#39;]], breaks = 20, main = &#34;&#34;, xlab = &#34;&#34;)
dev.off()
## png
## 2
每一根柱子的宽度代表了某个销售额的区间,而柱子的高度则为在该销售额区间内发生的次数。可以使用参数来设置柱子的数目,数值越大分得越细,但有可能越稀疏, 在 R 语言中通过参数 breaks 来控制,在 Python 中通过参数 bins 来控制。
直方图是一种常用的统计图形,它能够帮助研究 者查看连续变量的分布情况,通过将数据分割后再统计每一组的数目,得到类似于分布密度图的统计图形,从而查看连续数据的分布特征
如果变量是离散的,可以统计每一类包含的数目,类似于离散分布中的分布律,研究者通常用条形图来展示。
# 画出离散型变量Place的条形图
pdf(file = &#34;vis_ana2.pdf&#34;, width=8, height=5, family=&#34;GB1&#34;)
dffreq <- table(df3[[&#39;Place&#39;]])
barplot(dffreq)
dev.off()
## png
## 2可以看到杭州和广州的不同销售额。条形图是最早的统计图形,诞生于1786 年,可以非常方便地展示离散变量的各个类别及其数目,通常条形的长度来显示数目的多少,可以查看不同类别的数目是否均衡。
如果想查看比例关系,还可以使用饼图,和条形图的操作方式基本一样。
# 画出离散型变量Place的饼图
pdf(file = &#34;vis_ana3.pdf&#34;, width=8, height=5, family=&#34;GB1&#34;)
pie(dffreq)
dev.off()
## png
## 2饼图在表达比例关系的时候很常用。当类别数目不太多的时 候,可以一目了然地看清不同类别的数值和比例大小,是最为公众熟知的统计图形之一。 由于人类视觉对角度不太敏感,用饼图来展示比例不如条形图清晰,尤其是当类别过多时,应该尽量避免饼图。
两变量的关系
在数据分析中,研究者处理的变量分为连续变量和离散变量。如果不考虑顺序,两变量间可以构成三种关系:
>两个连续变量的关系
>连续变量和离散变量的关系
>两个离散变量的关系
两个连续变量之间的关系可以使用相关分析、回归分析等模型进行深入研究,也可以通过散点图来进行直观展现。
两个连续变量的关系是数据分析中最常见的关系,因此散点图也是被使用最多的统计图形。
连续变量和离散变量之间的关系在理论上应该有两类:
>当离散变量是因变量的时候,对应机器学习中的分类模型
>当连续变量是因变量的时候,相当于分析不同水平对因变量的影响,对应统计中的方差分析,也可以使用箱线图来直观展示。
# 两个连续变量的关系:散点图
# 连续变量和离散变量的关系
# 画出变量MSales在不同Place组中的箱线图
pdf(file = &#34;vis_ana4.pdf&#34;, width=8, height=5, family=&#34;GB1&#34;)
boxplot(MSales ~ Place, data = df3)
dev.off()
## png
## 2可以看出,离散变量的不同类别对应不同的箱子,在本例中即为“广 东 广州”和“浙江 杭州”。每个箱子体现了对应的连续变量的特征,在本例中代表月销量。
箱子体现了五个关键的值,上下的两根横线表示上下界,箱 子上下边缘表示上下四分位数,中间的粗线表示中位数。
由于数据中离散变量交叉组合后会产生不同组别的 频数,可使用列联表进行分析,例如 2检验。 研究者也可以使用马赛克图来直观地展 示这种关系。
# 两个离散变量的关系
# 画出马赛克图
pdf(file = &#34;vis_ana5.pdf&#34;, width=8, height=5, family=&#34;GB1&#34;)
df3$Freq <- 1
tab3 <- xtabs(Freq ~ Protection + Place, data = df3)
plot(tab3, main = &#34;&#34;)
dev.off()
## png ## 2
每一块面积代表一个交叉组的频数,面积越大说明改组越大,可以很直观地查看各组是否均匀以及是否存在明显的差异。
多变量的关系
在真实的数据科学项目中,要分析的变量数肯定不止两个。研究者第一次看到数据时,可以先查看每个变量的分布情况,进而通过相关系数矩阵图查看两两变量间的关系。
多变量的关系案例
#取第三个到第十一个变量
pdf(file = &#34;vis_ana6.pdf&#34;, width=8, height=6, family=&#34;GB1&#34;)
library(corrplot)
## Warning: package &#39;corrplot&#39; was built under R version 4.0.5
## corrplot 0.88 loaded
corr1 <- cor(d2)
#得到d2数据集的相关阵
corrplot(corr1) #画出相关矩阵图
dev.off()
## png
d1 <- read_excel(&#34;football.xlsx&#34;, sheet = &#34;数据统计&#34;) #QQ群里也有
d2 <- d1[, 3:11] #取第三个到第十一个变量
pdf(file = &#34;vis_ana6.pdf&#34;, width=8, height=6, family=&#34;GB1&#34;)
library(corrplot)
## Warning: package &#39;corrplot&#39; was built under R version 4.0.5
## corrplot 0.88 loaded
corr1 <- cor(d2) #得到d2数据集的相关阵
corrplot(corr1) #画出相关矩阵图
dev.off()
## png
## 2football.xlsx
24.7K
· 百度网盘
R 语言corrplot包的输出结果,其中圆圈越偏蓝色说明对应的两个变量之间的正相关越强,越偏红色说明负相关越强。
ggplot2其他应用
ggplot2 中的 gg 表示图形语法(grammar of graphic),这是一个通过使用“语法”来绘图的图形 概念。ggplot2 主张模块间的协调与分工.
主要特点如下所示。 (1)采用图层的设计方式,有利于结构化思维实现数据可视化。有明确的起始(ggplot()开始) 与终止,图层之间的叠加是靠“+”实现的,越往后,其图层越在上方。通常一条 geom_xxx()函数 或 stat_xxx)函数可以绘制一个图层。 (2)将表征数据和图形细节分开,能快速将图形表现出来,使创造性的绘图更加容易实现。而 且通过 stat_xxx()函数将常见的统计变换融入绘图中。 (3)图形美观,扩展包(extension package)丰富,有专门调整颜色(color)、字体(font)和主 题(theme)等辅助包。可以帮助用户快读定制个性化的图表.
R ggplot2 的 geom_xxx()系列函数,其基础的展示元素可以分成四类:点(point)、线(line)、 多边形(polygon)和文本(text),将表中 ggplot2 的常见函数归类为如表 1-6-2 所示。ggplot2 每个函数的具体参数可以通过在 RStudio 右下角的“help”中输入函数名查找,或者在左下角的 “Console”控制台中输入:?函数名,比如:??geom_point()。
ggplot2 常见函数的主要视觉通道映射
geom_*添加函数生成图形对象,它们的组合形式如下
ggplot(...)+
geom_* ( ..) +
geom_*(..)+...
在如上的语法格式中,有两方面需要说明:一方面,在ggplot2绘图过程甲均采用图层思想,将多个图形进行叠加和设置;另一方面,图层思想是通过代码中的加号(+)表现出来的。
#使用ggplot 函数初始化一个图形对象
ggplot( data = NULL, mapping= aes() ) data:指定绘图所需的原始数据,如果不指定,则必须在geom_*函数中指定。
mapping :通过aes的方式指定图形的属性(如x轴的变量,y轴的变量,颜色变量形状变量、填充色变量等)。
#绘制条形图的函数
geom bar( mapping= NULL, data =NULL, stat =&#34;count&#34;,
position =&#34;stack&#34; ,...,width= NULL, binwidth=NULL, na.rm= FALSE,show.legend= NA, inherit.aes= TRUE)stat: 借助于该参数控制绘图数据的统计变换,默认为&#39;count&#39;计数;
position::用于设置条形图的摆放位置,默认为&#39;stack&#39; ,表示绘制堆叠条形图;如果指定为&#39;dodge&#39; ,就表示绘制水平交错条形图;如果为&#39;fill&#39;,则表示绘制百分比堆叠条形图.
... :用于设置条形图的其他属性信息,如统一的边框色、填充色、透明度等。
width :用于设置条形图的宽度,默认为0.9的比例。
library(ggplot2)
library(gridExtra)
# 已汇总数据--单离散变量条形图的绘制
df <- data.frame(Province = c(&#39;北京&#39;,&#39;上海&#39;,&#39;天津&#39;,&#39;重庆&#39;),
GDP = c(28000,30133,18595,19530))
p1 <- ggplot(data = df, # 指定绘图数据
# 指定x轴和y轴的变量,并按GDP的大小降序排序
mapping = aes(x = Province, y = GDP)) +
# 绘制条形图
geom_bar(stat = &#39;identity&#39;, # y轴数据直接来自于原始数据框
color = &#39;black&#39;, # 边框色为黑色
fill = &#39;steelblue&#39; # 填充色为铁蓝色
) +
# 删除x轴的标题
labs(x = &#39;&#39;)
p2 <- ggplot(data = df,
# 要求x轴的省份按GDP的大小降序排序
mapping = aes(x = reorder(Province, -GDP), y = GDP)) +
geom_bar(stat = &#39;identity&#39;, color = &#39;black&#39;, fill = &#39;steelblue&#39;) +
labs(x = &#39;&#39;) +
# 添加数值标签
geom_text(mapping = aes(x = Province, y = GDP, label = GDP, vjust = -0.2)) +
# 添加水平参考线
geom_hline(yintercept = mean(df$GDP), color = &#39;red&#39;, lty = &#39;dashed&#39;)
# 合并p1和p2两幅图
grid.arrange(p1, p2, ncol = 2)
<hr/>
df<-read.csv(&#34;Facet_Data.csv&#34;, header = TRUE) # 数据见qq群Facet_Data.csv
15.4K
· 百度网盘
可以读入数据集 df,df 是总共有 4 列的数据集:tau、 SOD、age 和 Class(分三类数据 Control、Impaired 和 Uncertain),其数据框前 6 行
head(df)
## age tau Class SOD male
## 1 0.9876238 6.297754 Control 5.609472 0
## 2 0.9866667 6.270988 Control 5.723585 1
## 3 0.9867021 6.152733 Control 5.771441 0
## 4 0.9871630 6.623707 Control 5.655992 0
## 5 0.9854651 5.740789 Control 5.509388 1
## 6 0.9862637 4.871603 Control 4.532599 14 张图表使用的都是 geom_point()函数,其参数包括 x、y、alpha(透明度)、colour (轮廓色)、fill(填充颜色)、group(分组映射的变量)、shape(形状)、size(大小)、stroke(轮廓 线条的粗细)。图(a)是将离散数值型变量 age 映射到散点的大小(size),然后散点图转换成气 泡图,气泡的大小对应于 age 的数值;图(b)是将 age 映射到散点的大小(size)和填充颜色(fill), ggplot2 会自动将填充颜色映射到颜色条(colorbar);图 (c)是将离散类别型变量 Class 映射到散 点的填充颜色(fill),ggplot2 会自动将不同的填充颜色对应类别的数据点,从而绘制多数据系列的 散点图;图(d)是将离散数值型变量 age 和离散类别型变量 Class 分别映射到散点的大小(size) 和填充颜色(fill)
p1<-ggplot(df, aes(x=SOD,y=tau,size=age)) +
geom_point(shape=21,color=&#34;black&#34;,fill=&#34;#336A97&#34;,stroke=0.25)
p2<-ggplot(df, aes(SOD,tau,fill=age,size=age)) +
geom_point(shape=21,colour=&#34;black&#34;,stroke=0.25,
alpha=0.8)
p3<-ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour=&#34;black&#34;,stroke=0.25)
p4<-ggplot(df, aes(SOD,tau,fill=Class,size=age)) +
geom_point(shape=21,colour=&#34;black&#34;,stroke=0.25,
alpha=0.8)
library(gridExtra)
## Warning: package &#39;gridExtra&#39; was built under R version 4.0.5
grid.arrange(p1,p2,p3,p4, ncol = 2, nrow =2)
右上角的(b)图 age 映射到散点的大小(size)和填充颜色(fill)
左下角的(c)图 Class 映射到散点的填充颜色(fill)
右下角的(d)图 age 和 Class 分别映射到散点的大小(size)和 填充颜色(fill)
关键是,要学会合理地使用视觉通道映射参数,并调整合适的度量。可视化最基本的形式就是 简单地把数据映射成彩色图形。它的工作原理就是大脑倾向于寻找模式,你可以在图形和它所代表 的数字间来回切换。
我们能用到的视觉暗示通常有长度、面积、体积、角度、弧度、位置、方向、形状和颜色(色 相和饱和度)。所以正确地选择哪些视觉暗示就取决于你对形状、颜色、大小的理解,以及数据本身 和目标。不同的图表类型应该使用不同的视觉暗示,合理的视觉暗示组合能更好地促进读者理解图 表的数据信息。
频率多边形
作图前准备;
制作频率多边形;
增加一个分类变量。
频率多边形图使用的代码如下
# 1.载入ggplot2
library(ggplot2)
# 2.数据
data()
summary(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
# 3.频率多边形
ggplot(iris, aes(Sepal.Length)) +
geom_freqpoly()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# 函数geom_freqpoly()
ggplot(iris, aes(Sepal.Length)) +
geom_freqpoly(colour = &#34;pink2&#34;,
bins = 30, # 默认
size = 2) +
labs(title = &#34;bins = 30&#34;)
#添加分类变量
ggplot(iris, aes(Sepal.Length, colour = Species)) +
geom_freqpoly(bins = 10,
size = 2) +
theme_bw()
南丁格尔玫瑰图
战士 死亡率高达 42%。弗罗伦斯·南丁格尔主动申请,自愿担任战地护士。她率领 38 名护士抵达前线, 在战地医院服务。当时的野战医院卫生条件极差,各种资源极度匮乏,她竭尽全力排除各种困难, 为伤员解决必需的生活用品和食品问题,对他们进行认真的护理。仅仅半年左右,伤病员的死亡率 就下降到 2.2%。每个夜晚,她都手执风灯巡视,伤病员们亲切地称她为“提灯女神”。战争结束后, 南丁格尔回到英国,被人们推崇为民族英雄。 出于对资料统计的结果不受人重视的忧虑,她发展出一种色彩缤纷的图表形式,让数据能够更 加让人印象深刻。这种图表形式有时也被称作“南丁格尔的玫瑰”,是一种圆形的直方 图。南丁格尔自己常昵称这类图为鸡冠花(coxcomb)图,并且用以表达军队医院季节性的死亡率, 对象是那些不太能理解传统统计报表的公务人员。她的方法打动了当时的高层,包括军方人士和维 多利亚女王本人,于是医事改良的提案才得到支持. 绘制单数据系列南丁格尔玫瑰图 在 R 中,从直角坐标系转到极坐标系,只需要添加一条坐标系的 语句:coord_polar(theta = “x”,start=0),其中 theta 表示是将 X 轴或 Y 轴映射到极坐标系。下图的 X 轴坐标为时间序列型,所以就是根据 X 轴时间顺序展示数据的,其实现代码如下所示:
library(ggplot2)
mydata <- data.frame( a=c(&#34;Monday&#34;,&#34;Tuesday&#34;,&#34;Wednesday&#34;,&#34;Thursday&#34;,&#34;Friday&#34;,&#34;Saturday&#34;,&#34;Sunday&#34;),
b=c(50, 60, 70, 20,90,110,30))
myAngle <-seq(-20,-340,length.out =7) #设定坐标轴标签的角度,使之垂直于中心线
ggplot(mydata, aes(x=a, y=b, fill=factor(b))) +
geom_bar(width = 1,stat=&#34;identity&#34;,colour = &#34;black&#34;,fill=&#34;#F8766D&#34;) +
geom_text(aes(y = b-8,label = b),color=&#34;white&#34;) +
coord_polar(theta = &#34;x&#34;,start=0) +
ylim(c(0,120))+
theme_light()+
theme(axis.text.x=element_text(size = 13,colour=&#34;black&#34;,angle = myAngle))
## Warning: Vectorized input to `element_text()` is not officially supported.
## Results may be unexpected or may change in future versions of ggplot2.
## Warning in if (0 <= angle & angle < 90) {: 条件的长度大于一,因此只能用其第一元
## 素
## Warning in if (90 <= angle & angle < 180) {: 条件的长度大于一,因此只能用其第一
## 元素
## Warning in if (180 <= angle & angle < 270) {: 条件的长度大于一,因此只能用其第一
## 元素
## Warning in if (270 <= angle & angle < 360) {: 条件的长度大于一,因此只能用其第一
## 元素
## Warning in if (0 <= angle & angle < 90) {: 条件的长度大于一,因此只能用其第一元
## 素
## Warning in if (90 <= angle & angle < 180) {: 条件的长度大于一,因此只能用其第一
## 元素
## Warning in if (180 <= angle & angle < 270) {: 条件的长度大于一,因此只能用其第一
## 元素
## Warning in if (270 <= angle & angle < 360) {: 条件的长度大于一,因此只能用其第一
## 元素
注意:ggplot中theme函数的angle,设置标签旋转角度的,好像现在的版本不能用向量,所有的标签角度只能设置一个。把玫瑰图和雷达图代码中的angle都改成0就能运行了。
雷达图
雷达图(radar chart),又被称为蜘蛛图、极地图或星图。雷达图是用来比较多个定量变量的方 法,可用于查看哪些变量具有相似数值,或者每个变量中有没有任何异常值。此外,雷达图也可用 于查看数据集中哪些变量得分较高/低,是显示性能表现的理想之选。
每个变量都具有自己的轴(从中心开始)。所有的轴都以径向排列,彼此之间的距离相等,所有 轴都有相同的刻度。轴与轴之间的网格线通常只是作为指引用途。每个变量数值会画在其所属轴线 之上,数据集内的所有变量将连在一起形成一个多边形。
R中的fmsb 包提供了radarchart()函数,可以绘制标准的雷达图;使用 ggplot2包的geom_polygon() 函数或者 geom_path()函数,同时借助自制的辅助函数 coord_radar().
接下来以数据集 label_data 为例讲解雷达图的绘制方法:
label_data<-data.frame(car=c(&#34;Math&#34; , &#34;English&#34; , &#34;Biology&#34; , &#34;Music&#34; , &#34;R-Coding&#34; ), value=c(12 , 2 ,14 ,20, 18), id=c(1:5) )其中,car 和 vlaue 列是实际的 X 轴和 Y 轴变量,id 为辅助的绘图变量,为 1~N 的等差数列(N 为数据框的总行数)。
coord_radar <- function (theta = &#34;x&#34;, start = 0, direction = 1)
{ theta <- match.arg(theta, c(&#34;x&#34;, &#34;y&#34;))
r <- if (theta == &#34;x&#34;)
&#34;y&#34;
else &#34;x&#34;
ggproto(&#34;CoordRadar&#34;, CoordPolar, theta = theta, r = r, start = start,
direction = sign(direction),
is_linear = function(coord) TRUE)}
label_data<-data.frame(car=c(&#34;Math&#34; , &#34;English&#34; , &#34;Biology&#34; , &#34;Music&#34; , &#34;R-Coding&#34; ),
id=c(1:5) ,
value=c(12 , 2 ,14 ,20, 18))
#添加一行辅助数据到绘图数据
AddRow<-c(NA,nrow(label_data)+1, label_data [1,ncol(label_data)])
mydata<-rbind(label_data,AddRow)
#坐标轴标签的角度设定
angle0<- 360 * (label_data$id-1) /nrow(label_data)
myAngle<-ifelse(angle0 >angle0[1], 180-angle0, angle0)
ggplot(data=mydata,aes(x=id, y=value)) +
geom_polygon(color = &#34;black&#34;, fill= &#34;#E41A1C&#34;,alpha=0.1)+
geom_point(size=5,shape=21,color = &#39;black&#39;, fill= &#34;#E41A1C&#34;)+
#coord_polar() + #实现极坐标系下的圆形雷达图
coord_radar()+ #实现为雷达坐标系下的圆形雷达图
scale_x_continuous(breaks =label_data$id,labels=label_data$car)+
ylim(0,22)+
theme_light()+
theme(axis.text.x=element_text(size = 11,colour=&#34;black&#34;,angle = myAngle))
## Warning: Vectorized input to `element_text()` is not officially supported.
## Results may be unexpected or may change in future versions of ggplot2.
## Warning in if (0 <= angle & angle < 90) {: 条件的长度大于一,因此只能用其第一元
## 素
## Warning in if (0 <= angle & angle < 90) {: 条件的长度大于一,因此只能用其第一元
## 素
词云图
词云图(word cloud chart)是通过使每个字的大小与其出现频率成正比,显示不同单词在给定 文本中的出现频率,然后将所有的字词排在一起,形成云状图案,可以以任何格式排列:水平线、 垂直列或其他形状,如图 所示。其也可以用于显示获分配元数据的单词。在词云图上使用颜色 通常都是毫无意义的,主要是为了美观,但我们可以用颜色对单词进行分类或显示另一个数据变量。 词云图通常用于网站或博客上,以描述关键字或标签使用,也可用来比较两个不同的文本。
#install.packages(&#34;tm&#34;)
#install.packages(&#34;wordcloud&#34;)
library(tm)
## Warning: package &#39;tm&#39; was built under R version 4.0.5
## Loading required package: NLP
## Warning: package &#39;NLP&#39; was built under R version 4.0.3
##
## Attaching package: &#39;NLP&#39;
## The following object is masked from &#39;package:ggplot2&#39;:
##
## annotate
library(wordcloud)
## Warning: package &#39;wordcloud&#39; was built under R version 4.0.5
## Loading required package: RColorBrewer
Paper1<-paste(scan(&#34;Paper1.txt&#34;, what = character(0),sep =&#34;&#34;),collapse = &#34; &#34;) #读入 TXT 文档 1
Paper2<-paste(scan(&#34;Paper2.txt&#34;, what = character(0),sep =&#34;&#34;),collapse = &#34; &#34;) #读入 TXT 文档 2
tmpText<- data.frame(c(Paper1,Paper2),row.names=c(&#34;Text1&#34;,&#34;Text2&#34;))
df_title <- data.frame(doc_id=row.names(tmpText),text=tmpText$c.Paper1..Paper2.)
ds <- DataframeSource(df_title)
#创建一个数据框格式的数据源,首列是文档 id(doc_id),第二列是文档内容
corp = VCorpus(ds)
#加载文档集中的文本并生成语料库文件
corp = tm_map(corp,removePunctuation) #清除语料库内的标点符号
corp = tm_map(corp,PlainTextDocument) #转换为纯文本
corp = tm_map(corp,removeNumbers) #清除数字符号
corp = tm_map(corp,function(x){removeWords(x,stopwords())}) #过滤停止词库
term.matrix <- TermDocumentMatrix(corp)
#利用 TermDocumentMatrix()函数将处理后的语料库进行断字处理,生成词频权重矩阵
term.matrix <- as.matrix(term.matrix) #频率
colnames(term.matrix) <- c(&#34;Paper1&#34;,&#34;paper2&#34;)
#comparison.cloud(term.matrix,max.words=300,random.order=FALSE,colors=c(&#34;#00B2FF&#34;, &#34;red&#34;))
#图 3-9-4(a)
#commonality.cloud(term.matrix,max.words=100,random.order=FALSE,color=&#34;#E7298A&#34;)
#图 3-9-4(b)
df<-data.frame(term.matrix)
#wordcloud(row.names(df) , df$Paper1 ,min.freq=10,col=brewer.pal(8,&#34;Dark2&#34;),rot.per=0.3 )
#图 3-9-3(a)
#wordcloud(row.names(df) , df$Paper2 , min.freq=10,col=brewer.pal(8,&#34;Dark2&#34;),rot.per=0.3 )
#图 3-9-3(b)
#本例有错误:Error 7n 1s_overlap(x1,y1,sW1,sh1,boxes) :程序包&#39;Rcpp_precious_remove &#39;不提供&#39;Rcpp &#39;这样的函数calls: <Anonymous> ... commonality.cloud ->wordcloud -> overlap -> is_over1apPaper1.txt
36.1K
· 百度网盘
Paper2.txt
64.1K
· 百度网盘
区块频次图
对于散点图来说,最大的缺陷就是当数据量非常大时会导致数据点的重叠,进而无法直观地发现数据点的集中块。对于这个问题的解决,最简单的处理办法是利用透明度进行调整颜色越深,则说明此处的样本点越多。
# 生成绘制散点图的数据
set.seed(1234)
x = c(rnorm(n = 5000, mean = 0, sd = 0.3),
rnorm(n = 5000, mean = -1, sd = 0.2))
y = -1 + 1.5*x + rnorm(1000)
type = c(rep(1,5000), rep(2,5000))
df = data.frame(x, y, type)
# 绘制散点图
p1 <- ggplot(data = df, mapping = aes(x = x, y = y)) +
geom_point()
# 设置散点图的透明度
p2 <- ggplot(data = df, mapping = aes(x = x, y = y)) +
geom_point(alpha = 0.02)
# 合并p1和p2两幅图
grid.arrange(p1, p2, nrow = 1)
注意这里, 需要gridExtra包,要不然
# 合并p1和p2两幅图
grid.arrange(p1, p2, nrow = 1)这个代码会报错。
左图为原始散点图,明显地发现数据存在严重的重叠现象,但无法从图中发现具体的聚集中心;右图为经过透明度处理后的散点图,此时会发现两块颜色较深的阴影,进而可以认为阴影部分的数据是重叠最严重的。尽管透明度可以解决散点图的重叠问题,但是无法从定量的角度衡量数据的重叠强度,接下来对该数据绘制区块频次图.
除此之外,还可以运用区块频次图,即绘制矩形或六边形的块,每个区块内存放数量不同的样本点,并以颜色呈现样本点的多与少。可以使用geom_bin2d函数和geom_hex 绘制矩形块和六边形块。
#install.packages(&#34;hexbin&#34;)
# 利用二维矩形计数图
p1 <- ggplot(data = df, mapping = aes(x = x, y = y)) +
geom_bin2d(bins = c(80,60) # 将x轴分为80段,y轴分为60段
) +
# 自定义填充颜色
scale_fill_continuous(low = &#39;gray&#39;, &#39;high&#39; = &#39;black&#39;) +
theme(legend.position = c(0.9,0.25),
legend.background = element_blank())
# 利用六边形计数图
p2 <- ggplot(data = df, mapping = aes(x = x, y = y)) +
geom_hex(binwidth = c(0.05,0.2) # 将x轴的组距设置为0.05,y轴的组距设置为0.2
) +
# 自定义填充颜色
scale_fill_continuous(low = &#39;gray&#39;, &#39;high&#39; = &#39;black&#39;) +
theme(legend.position = c(0.9,0.25),
legend.background = element_blank())
# 合并p1和p2两幅图
grid.arrange(p1, p2, nrow = 1)
区块频次图有点像马赛克的效果,其中左图为矩形区块,右图为六边形区块,每一个块内都有不同数量的样本点。从图中不仅可以发现数据的集中地带,还可以得到集中地带内样本量的多少,以左图为例,样本点集中在(-1,-2)和(0,-1)两个点的附近,并且颜色最深的矩形内至少包含30个样本点。
需要注意的是,geom hex 函数绘制六边形区块图是依赖于hexbin 包的,所以读者在R语言中得提前下载好该包。
核密度图
三维立体分布图的投影,与地理中的等高线类似,越中间的等高线代表数据的密度值越高或集中程度越强。
# 核密度图的绘制
# 结合透明度和二维密度曲线,呈现数据的集中地带
ggplot(data = df, mapping = aes(x = x, y = y)) +
geom_point(alpha = 0.3, color = &#39;steelblue&#39;) +
geom_density_2d(color = &#39;black&#39;, # 设置密度等高线的颜色
lwd = 1, # 设置密度等高线的粗细,
h = c(0.4,0.6), # 设置密度等高线之间的带宽
n = 200, # 设置密度等高线的平滑度
) +
guides(color = FALSE)
从二维核密度曲线的分布可知,随机样本中存在两个中心地带,一个是点(-1,-2.5)附近,另一个是点(0,-1)附近。在两个中心点附近都存在非常密集的数据点,进而可以得知它们附近的数据点重叠非常严重。
动态统计图形
传统的数据可视化主要借助于静态的统计图形。在信息时代,研究者可以使用计算机产生更丰富更复杂的图形,尤其是动态的可视化图形,从而包含更大的信息量。 在 2006 年的 TED 大会上,瑞典统计学家 Hans Rosling 使用他自己公司开发的可视化工具演示了几十年来世界各国一些重大问题的惊人变化,比如贫穷、寿命、家庭规模等,动态的呈现方式引起了很大的反响。
动态图形的意义除了可以多出一个动态的时间轴、展现更丰富的信息以外,通过动画本身也可以演示一些动态的效果。
以统计中常用的蒙特卡洛方法为例,研究者通过模拟一些随机变 量或者随机过程来替代真实世界中的试验,可以从数值上求解一些现实中的问题。
在平面上画有一组间距为 的平行线,将一根长度为L(L≤a)的针任意投掷在这个平面上,可以证明此针与平行线中任一条相交的概率 为: p=2L/πa
如果研究者做一个试验,将针随机投掷一定的次数,然后统计其和平行线相交的次数并基于频率估计概率 ,可以估算出 的值。
library(animation)
## Warning: package &#39;animation&#39; was built under R version 4.0.5
buffon.needle()
显示动画,读者可以看到随着投掷次数的增加 的估计值在不断变化。
R 语言中的animation 包可以很方便地编程来实现一些动画的效果,其中也内置了蒲丰投针试验。
交互式工具
传统的统计图形工具刚开始主要来自于商业软件,随着 R 和 Python 的流行,开源软件逐渐占据重要份额。 随着互联网的兴起,越来越多的开源技术渐成主流,也推动了交互式工具的进一步发展。到目前为止,主流的交互式可视化工具已经完全构建于开源系统之上了,使得人们有了丰富而廉价的选择。
在 HTML5 的标准下,各种客户端尤其是手机都可以展 现动态的效果,使得开发动态可视化功能有了很好的应用场景,进一步促进了技术的发展。
在 HTML5 框架和 JavaScript 技术的加持下,一些互联网巨头也推出了免费的动态交互式 工具,比如谷歌公司的 googleVis 和百度公司的 ECharts。
ECharts可以离线使用,默认图形非常丰富且美观,开放的接口也非常灵活而方便,很快就享誉国内外。
在 R 语言和 Python 中也出现了集成 ECharts 的工具,比如 R 语言中的 recharts 项目和 Python 中的 pyecharts 项目。
可以直接在 R 或者 Python 中生产 ECharts 的动态图形,还能方便地集成在交互式网络框架中,使得数据科学家 也能很容易地进行前端开发,从而更好地展现数据中蕴含的规律。
交互式工具介绍: R Shiny
Shiny是RStudio公司的产品,包括一个轻量级的Web服务器和一个开发客户端。客户端以R包的形式提供,完全在R环境中运行,基于R语言进行开发。作为开发环境的R包也内置了一个供测试使用的小型服务端,在R中启用后可以通过本地浏览器来访问这个应用。 如果需要向远程的用户提供服务,必须安装单独的Web服务器,目前服务器只支持Linux系统。
对于普通用户来说,在Windows或Mac系统上基于R包开发Shiny项目就已经足够,可以完整地实现产品开发设计的流程。用户可以基于自己的电脑来演示这个项目。
Shiny是一个完全基于R语言的Web应用框架,只需要懂R语言就行,不需要任何HTML、CSS、JavaScript知识就可以独立开发Web应用。
使用Shiny中的函数编写前端和服务器端的工作代码。在Shiny的框架中,创建名为“ui.R”和“server.R”的脚本文件,将其存入某个文件夹中,该文件夹名即为该Shiny应用名,例如“simple”。
# ui.R 获取breaks参数的输入值
shinyUI(bootstrapPage(
selectInput(inputId = &#34;nbreaks&#34;,
label = &#34;Number of bins:&#34;,
choices = c(10, 20, 35, 50),
selected = 20),
plotOutput(outputId = &#34;plot1&#34;)
))
# server.R 根据输入值画直方图
shinyServer(function(input, output) {
output$plot1 <- renderPlot({
hist(faithful$eruptions,
probability = TRUE,
breaks = as.numeric(input$nbreaks),
xlab = &#34;Duration (minutes)&#34;,
main = &#34;Geyser eruption duration&#34;)
})
})点击“Run App”按钮,系统默认的浏览器会弹出一个网页, 如下图所示。在该网页中我们可以通过选择框来选择“Number of bins”,实际上就是 hist函数中的breaks参数。参数改变后,下方的图形会实时地改变,这就实现了一个最简单的数据产品。
在Shiny的框架下结合 plotly 包可以实现大部分的常用 统计图形的动态交互形式。此外还有一些受欢迎的第三方包可以配合使用,比如 wordcloud2 包的词云图、leaflet 包的动态地图、DT 包的动态表格、rglwidget 的3D图形,详情可以参考这些包的帮助文档。 关于Shiny的具体使用,可以参阅其 官方主页https://shiny.rstudio.com/ 或 中文教程。
推荐:Plotnine库:是R语言下强大数据可视化ggplot2库的python版
参考文献
1.数据科学概论(数据科学与大数据技术丛书) ,李扬 李舰,2021年3月;
2. R语言数据可视化之美,电子工业出版社,2019年10月。
3.https://github.com/EasyChart/Beautiful-Visualization-with-R/issues/6
4.https://github.com/shixiangbupt/Intro2ds
《数据科学概论》(李扬/李舰 2021)各章代码及案例数据,相关课件可在中国人民大学出版社网站下载。
5.超详细的R语言热图之complexheatmap系列(1)_Ayue0616的博客-CSDN博客_complexheatmap
今天上机有同学安装包仍有问题,排除了安装中文路径的错误,原因是下载下来的包要先在系统临时文件夹temp里解压后安装,但我们系统的临时文件夹没有写权限,或者说只有只读权限,导致错误提示,找不到下载目录。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|