第五章,数据可视化-ggplot2

2024-04-17 09:18

本文主要是介绍第五章,数据可视化-ggplot2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

虽然,目前有很多工具可以用来进行数据分析,但是R语言在数据可视化上的优势基本无它能敌。其中最具盛名的包就是Hadly Wickham开发的ggplot2包。

正文


一,快速探索数据-从qplot开始

R中查看函数文档信息

require(ggplot2)
help("qplot")qplot(x, y, ..., data, facets = NULL, margins = FALSE, geom = "auto", xlim = c(NA, NA), ylim = c(NA, NA), log = ", 
main = NULL,  xlab = NULL, ylab = NULL, asp = NA, stat = NULL,  position = NULL)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二,图层语法中,图的结构表述

在这里插入图片描述
(一),数据和映射

1,ggplot创建图形对象

p =  ggplot(data=diamonds, aes(x= carat,y= price, color= cut))

p是第一层图层语法模型中的第一层,其中data参数,控制数据来源,只能是数据框格式,aes参数,控制了对哪些变量进行图形映射,以及映射方式;aes中的属性包括,color,shape,fill 等等

p =  ggplot(mtcars, aes(x= mpg,,y= wt))
p + geom_point()  
# geom_point() 第二图层告诉了ggplot2要绘制散点图

在这里插入图片描述

⚠️aes中的属性映射,如果变量是分类变量,为了防止被当做数值型,一般用factor处理一下,比如 aes(… ,…, color = factor(a))

# 此处,因为factor的处理,cyl被当做分类属性值
p+geom_point(aes(color=factor(cyl)))

在这里插入图片描述
在这里插入图片描述
2,几个对象

分组 aes(…, group ),默认group=1,表示所有离散变量的交互作用,来控制哪些观测值用于哪些图形元素。

几何对象大致可分为两类,由group来控制,当没有离线变量等情况时,继续用自定义设置group结构。

在这里插入图片描述
例1,
当x,y 里面的值没有离散变量时,需要设定group

   library(“nlme”)   #用到这包里面的数据Oxboyshead(Oxboys)ggplot(Oxboys,aes(age,height))+geom_point()

图中数据,表示了每个样本对象Subject,对应的年龄、身高情况的散点图,属于个体集合对象。
在这里插入图片描述
当把他们变成线图时,问题就出来了。 由于没有设置group,被认为是群体几个对象,画出来的是乱的线图。
ggplot(Oxboys,aes(age,height))+geom_line()
在这里插入图片描述

设定group后,ggplot就知道,每个subject的所有数据映射到一个图形对象
 ggplot(Oxboys,aes(age,height,group=Subject))+geom_line()

在这里插入图片描述

(二),添加图层

创建图层是用下面的layer函数实现的

layer(geom = NULL, stat = NULL, data = NULL, mapping = NULL,position = NULL, params = list(), inherit.aes = TRUE,check.aes = TRUE, check.param = TRUE, show.legend = NA)

但是实际中,我们会用到快捷函数geom_* 或 stat_* 来实现。
图层之间是用加号’+’连接的。

1,创建几何对象
每一个几何对象都有一个默认的的统计变换,当然统计变换可以自己设定更改。
下图举个例子,更多几何对象,参考ggplot2。
在这里插入图片描述

2,统计变换

因为geom_*(aes(stat= ‘’ ))都会给定一个默认的统计变换,如上表。所以,一般不会需要更改,除非需要自定义图形的时候。

3,位置调整

位置调整一般多见于离散数据的重叠,连续数据很少需要微调。
五种位置position的参数如下
在这里插入图片描述
更详细的设置需要结合下面的函数,调整参数实现:
在这里插入图片描述

# 堆叠图像宽度不一致的情况
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) +geom_bar(position = 'dodge’)

在这里插入图片描述

# 通过详细的设置来调整
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) +
+   geom_bar(position = position_dodge2(preserve = "single"))

在这里插入图片描述

(三), 标尺/标度 scale

前面我们已经看到了,画图就是在做映射,不管是映射到不同的几何对象上,还是映射各种图形属性。这一小节介绍标尺,在对图形属性进行映射之后,使用标尺可以控制这些属性的显示方式,比如坐标刻度,可能通过标尺,将坐标进行对数变换;比如颜色属性,也可以通过标尺,进行改变.

可以看到标尺设置的内容有8种(颜色color/colour算一种):

  • 透明度alpha
  • 线条颜色color
  • 填充色fill
  • 线型linetype
  • 形状shape
  • 大小size
  • x轴
  • y轴

(标尺设置的内容都有对应的映射设置类型,但映射比标尺多了xmin, xmax, ymin, ymax, xend, yend,group和string等)

每一种标尺的设置都形如scale_*,具体参见ggplot2中的说明,下面举个例子:

(1) 连续型颜色标尺

ggplot2提供了十多个填充色设置的标尺函数参见上表
先看看“continuous”的用法。对于数据为非因子型的填充色映射,ggplot2自动使用“continuous”类型颜色标尺表示连续颜色空间。如果要修改默认颜色就要使用scale_fill_continuous函数进行修改,这个函数最有用的参数是low和high,分别表示低端和高端数据的颜色,中间颜色根据颜色空间space自动计算:

p + geom_raster() + 
scale_fill_continuous(low="darkgreen", high="orangered", space='rgb')

在这里插入图片描述

(2)离散(间断)型颜色标尺
scale_color_discrete或scale_color_hue设置颜色不是很直观,如果想要啥来啥,那就用manual类型函数:

p + geom_point() + 
scale_color_manual(values=c('blue','cyan', 'yellow', 'orange', 'red'))

在这里插入图片描述
(3)坐标轴尺度
两种方式,比如

  • 通过 scale_y_log10() 将Y轴坐标进行log10变换
  • 或自己有限进行数据变换将Y’ = log10(Y), 再画出 Y’ 与 X之间的关系

(4)颜色
在这里插入图片描述

(四), 坐标系统 coordinate

坐标系统控制坐标轴,可以进行变换,例如XY轴翻转,笛卡尔坐标和极坐标转换,以满足我们的各种需求。
在这里插入图片描述在这里插入图片描述

(五), 分面 facet

分面有两种方式来实现:

(1) 缠绕分面 facet_wrap
facet_warp 即“缠绕分面”,对数据分类只能应用一个标准,不同组数据获得的图形按从左到右从上到下的“缠绕”顺序进行排列

facet_wrap(facets, nrow = NULL, ncol = NULL, scales = “fixed”, shrink = TRUE, as.table = TRUE, drop = TRUE)

  • facets:分面参数如 ~cut,表示用 cut 变量进行数据分类
  • nrow:绘制图形的行数
  • ncol:绘制图形的列数,一般nrow/ncol只设定一个即可
  • scales:坐标刻度的范围,可以设定四种类型。fixed 表示所有小图均使用统一坐标范围; free表示每个小图按照各自数据范围自由调整坐标刻度范围;free_x为自由调整x轴刻度范围;free_y为自由调整y轴刻度范围。
  • shrinks:也和坐标轴刻度有关,如果为TRUE(默认值)则按统计后的数据调整刻度范围,否则按统计前的数据设定坐标。
  • as.table:和小图排列顺序有关的选项。如果为TRUE(默认)则按表格方式排列,即最大值(指分组level值)排在表格最后即右下角,否则排在左上角。
  • drop:是否丢弃没有数据的分组,如果为TRUE(默认),则空数据组不绘图。
# 分面可以让我们按照某种给定的条件,对数据进行分组,然后分别画图。
ggplot(small, aes(x=carat, y=price))
+geom_point(aes(colour=cut))
+scale_y_log10() 
+facet_wrap(~cut,scales="fixed")+stat_smooth()

在这里插入图片描述
(2) 网格分面 facet_grid

facet_grid(facets, margins = FALSE, scales = “fixed”, space = “fixed”, shrink = TRUE, labeller = “label_value”, as.table = TRUE, drop = TRUE)

和facet_wrap比较,除不用设置ncol和nrow外(facets公式已经包含)外还有几个参数不同:

  • 必须拥有相同的X值与Y值
  • margins :相当于是否添加行、列的汇总图;
  • space :这个参数要配合scales使用,如果为fixed(默认),所有小图的大小都一样,如果为free/free_x/free_y,小图的大小将按照坐标轴的跨度比例进行设置。
  • labeller :设定小图标签的

p <- ggplot(mpg, aes(displ, cty)) + geom_point()
p + facet_grid(. ~ cyl) # 一行多列
p + facet_grid(drv ~ .) #一列多行
p + facet_grid(drv ~ cyl) #多行多列

(六), 主题 theme

ggthemes包提供了一些主题可供使用

library(ggthemes)
p+theme_wsj()

此外,ggplot2默认也提供了很多的主题属性,可以自行调整,例子如下:

(1) 去掉y轴的刻度标签
p+theme(axis.text.y = element_blank())

若同时,去掉y轴的刻度线
p+theme(axis.ticks = element_blank(), axis.text.y = element_blank())

(2) 将刻度标签文本旋转

例,旋转30度
p+theme(axis.text.x = element_text(angle=30,hjust=1,vjust=1))

同时,用element_text()还可以设置刻度标签文本的大小、样式、字体等属性:
p+theme(axis.text.x = element_text(
family=“Times”, face=“italic” , colour=“darked” , “size”=rel(0.9)))

(3)element_text()

family:Helvetica 无衬线,Times 有衬线 Courier 等宽;
face:plain普通,bold粗体,italic斜体,bold.italic粗斜体
size:单位磅
lineheight:行间距倍数

(4)margin()
theme中边框距离,图片与边框之间的距离
margin(t = 0, r = 0, b = 0, l = 0, unit = “pt”)
设置的顺序是上、右、下、左
ggplot(…) + theme(plot.margin = margin(2,2,2,2,"cm”))

(七)I/O

ggplot2的输出有两种形式:矢量型,光栅型(像素矩阵)

ggsave()

(八)其他

(1)【手动匹配形状】

ggplot2 中对应的shape palette最多只有6个,也就是说如果想把第7个及以上的分类匹配不同的形状时,需要手动匹配

假设一个数据集 data由product/reason/count三个维度构成,因为product是a~g七个
运行下列code时

ggplot(data,aes(x=reason,y=count))
+geom_point(aes(colour=product,size=10,shape=product))

就会发现product=g的图形,在图中是空的:
在这里插入图片描述
此时需要手动匹配图形:
根据product=='g’定位对应点的坐标值:

ggplot(da,aes(x=reason,y=count))
+geom_point(aes(colour=product,size=10,shape=product))    	    
+geom_point(aes(reason[product=='g'],count[product=='g']),colour='black',shape=11,size=5)

ggplot2中的shape有下面25种类型(R语言原生的绘图类型共255种,包括字母数字等内容)
在这里插入图片描述

(2)【一页多图】

此处内容转载丹追兵的文章

library(grid) # 用grid包完成布局
核心为 viewport() 函数

参数如下:

  • x:绘图区域相对页面左下角原点的x坐标,默认单位为npc,Normalised Parent Coordinates,含义是归一化的父区域坐标
  • y:绘图区域相对页面左下角原点的y坐标
  • width:绘图区域的宽度(x轴方向)
  • height:绘图区域的高度(y轴方向)
  • just:x和y所指的位置,默认为矩形中心位置
  • angle:将绘图区域旋转多少度
  • name:此viewport的名字,用于搜索和定位

例子1:

grid.show.viewport(viewport(x=0.6, y=0.6, width=unit(1, "inches"), height=unit(1, "inches"), angle=30))

在这里插入图片描述
一,用调用 viewport() 与 print.ggplot()

print( ggplot对象, vp = ) 函数中,可以设置vp(viewport)选项,来指定画图的位置。

require(ggplot2)
library(grid)# 生成三个ggplot对象
p.hist.len <- ggplot(iris) + geom_histogram(aes(x=Sepal.Length))
p.hist.wid <- ggplot(iris) + geom_histogram(aes(x=Sepal.Width)) + coord_flip()
p.scatter <- ggplot(iris) + geom_point(aes(x=Sepal.Length, y=Sepal.Width))# 创建三个不同的vp位置
grid.newpage()
vp.len <- viewport(x=0, y=0.66, width=0.66, height=0.34, just=c("left", "bottom"))
vp.wid <- viewport(x=0.66, y=0, width=0.34, height=0.66, just=c("left", "bottom"))
vp.scatter <- viewport(x=0, y=0, width=0.66, height=0.66, just=c("left", "bottom"))# 运用vp, 画出指定的位置的ggplot对象
print(p.hist.len, vp=vp.len)
print(p.hist.wid, vp=vp.wid)
print(p.scatter, vp=vp.scatter)

在这里插入图片描述
二,更复杂图像用矩形网格布局

grid.layout(nrow = 1, ncol = 1,widths = unit(rep_len(1, ncol), "null"),heights = unit(rep_len(1, nrow), "null"),default.units = "null", respect = FALSE,just="centre")
例子:# 新建画布
grid.newpage()# 创建矩形网格布局,pushviewport函数把布局插入到根节点
pushViewport(viewport(layout = grid.layout(2,2))) # 自定义布局分配函数
vplayout <- function(x,y)viewport(layout.pos.row = x,layout.pos.col = y)# 三个图形
a = qplot(date,unemploy, data = economics, geom = 'line',fill='red')
b = qplot(uempmed,unemploy, data = economics) 
c = qplot(uempmed,unemploy, data = economics,geom = 'path')# 画图
print(a,vp = vplayout(1,1:2))
print(c,vp = vplayout(2,1))
print(b,vp = vplayout(2,2))

在这里插入图片描述

这篇关于第五章,数据可视化-ggplot2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/911399

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.