第五章,数据可视化-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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者