R语言(一) ggplot2常用绘图命令总结

2023-11-12

提到R语言,总会想到它强大的绘图包ggplot2,甚至于其他语言中也有它的痕迹(例如,python中的matplotlib模块就有ggplot样式)。以下,总结了一些日常绘图中常用的命令。

一、基本绘图

        ggplot2绘图是逐步叠加式的,由+号进行连接,每个函数控制着自己的部分。以下将以lattice包下的singer数据集为例进行说明,其共包含两个变量身高(height)和音域(voice.part)

I.绘制直方图

data(singer,package="lattice")
library(ggplot2)
ggplot(data=singer,aes(x=height))+
	   geom_hist()

命令解释:
        ggplot()初始化图形时,首先需要指定数据集来源data以及绘制的变量。aes函数(全称aesthetics,指用视觉的方式呈递信息)中则是指定每个变量所扮演的角色。绘制的变量以height身高作为x轴,geom_hist()则是指定绘制的图形类型为直方图。

II.绘制箱线图

ggplot(data=singer,
	   aes(x=voice.part,y=height,fill=voice.part,color=voice.part))+
	   geom_boxplot(alpha=0.7)

在这里插入图片描述

命令解释:
        相比I中,aes函数中多了fill及color的设置,fill则是指以voice.part的值进行区别,color则是以voice.part的值进行赋值颜色。alpha表示透明度的设置,范围为0到1。

III.更多绘图类型及参数设置

函数 绘图类型 参数设置
geom_bar() 条形图 Color、fill、alpha
geom_density() 密度图 Color、fill、alpha、 linetype
geom_rug 地毯图 Color、side
geom_point() 散点图 Color、shape、alpha、size
geom_violin() 小提琴图 Color、fill、alpha、linetype

二、精雕细琢

以上做出来的图还是比较粗糙的,接下来将逐步对其进行微调

(1) 添加标题、横纵轴标签
ggplot(data=singer,
	   aes(x=voice.part,y=height,fill=voice.part,color=voice.part))+
	   geom_boxplot(alpha=0.7)+
	   labs(x="音域",y="身高",title="不同音域的歌手身高分布箱线图")

在这里插入图片描述
添加标题及横纵轴标签后,不难看出,还是有很多小问题的。比如图片标题没有居中,横纵轴标题较小,字体样式不统一等。以下,将通过element_text函数继续进行调整。

(2) 图片标题字体、大小、样式设置
#plot.title表示图片标题
#face表示字体样式,共四种类型:plain,"italic"(斜体), "bold"(粗体), "bold.italic" (或者使用family指定其他字体样式)
#size指定字体大小
#hjust标题水平位置(0.5则表示水平居中)
#R里面的说明虽是0-1,实际上可以取到超过这个范围的值,还可以取负值!
ggplot(data=singer,
	   aes(x=voice.part,y=height,fill=voice.part,color=voice.part))+
	   geom_boxplot(alpha=0.7)+
	   labs(x="音域",y="身高",title="不同音域的歌手身高分布箱线图")+
	   theme(plot.title=element_text(face="plain",size=15,hjust=0.5))

在这里插入图片描述

(3) 坐标轴标题及标签字体、大小及样式设置

I.坐标轴标题样式调整

#axis.title.x:对x轴标题进行调整
#axis.title.y:对y轴标题进行调整
#axis.title: 对整体坐标轴标题统一调整
#vjust的设置是为了将x轴标题离绘图区远一点
windowsFonts(myFont = windowsFont("宋体"))  #读取电脑自带字体
ggplot(data=singer,
       aes(x=voice.part,y=height,fill=voice.part,color=voice.part))+
	   geom_boxplot(alpha=0.7)+
	   labs(x="音域",y="身高",title="不同音域的歌手身高分布箱线图")+
	   theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
	         axis.title.x = element_text(family="myFont",size=15,vjust=-0.5), 
	         axis.title.y = element_text(family="myFont",size=15))         

在这里插入图片描述
这样调整后的图和第一张图相比,整体协调性是不是好多了?

II.坐标轴标签样式调整

#axis.text.x对x轴标签调整
#axis.text.y对y轴标签调整
#axis.text 统一对坐标轴标签调整
#angle旋转的角度
windowsFonts(myFont = windowsFont("宋体"))  
windowsFonts(myFont1 = windowsFont("微软雅黑"))  #横纵轴标签样式
ggplot(data=singer,
       aes(x=voice.part,y=height,fill=voice.part,color=voice.part))+
  	   geom_boxplot(alpha=0.7)+
  	   labs(x="音域",y="身高",title="不同音域的歌手身高分布箱线图")+
 	   theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
        	 axis.title.x = element_text(family="myFont",size=15,vjust=-0.5),
             axis.title.y = element_text(family="myFont",size=15),
        	 axis.text.x = element_text(family="myFont1",angle = 90,size=12),
             axis.text.y = element_text(family="myFont1",size=12))

在这里插入图片描述
调整后,横纵轴标签变大了一些,且横轴标签通过旋转了90度,显得不是很拥挤。当然,如果希望对纵轴的数值从0开始且紧贴坐标原点,可以加上scale_y_continuous(limits=c(0,80),expand=c(0,0)),得到的图如下(个人感觉不美观且丧失了很多信息
在这里插入图片描述

(4) 颜色设置

一般软件里自带的颜色都挺花里胡哨的,以下三种方法可以自定义设置颜色。

I. 指定颜色

这里推荐一个配色网站LOL Colors,对比色和渐变色都挺不错的,日常绘图基本够用了。
命令:scale_fill_manual(values=c(""))

colors=c("#34314c","#47b8e0","#ffc952","#ff7473",
		 "#79bd9a","#79a8a9","#EC7357","#FFEEE4")	 

ggplot(data=singer,
       aes(x=voice.part,y=height,fill=voice.part,color=voice.part))+
  geom_boxplot(alpha=0.7)+
  labs(x="音域",y="身高",title="不同音域的歌手身高分布箱线图")+
  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
        axis.title.x = element_text(family="myFont",size=15,vjust=-0.5),
        axis.title.y = element_text(family="myFont",size=15),
        axis.text.x = element_text(family="myFont1",angle = 90,size=12),
        axis.text.y = element_text(family="myFont1",size=12))+
  scale_fill_manual(values=colors)

在这里插入图片描述

II. 使用调色板

如果不想自己去取颜色,还可以调用R中自带的调色板
命令:scale_fill_brewer(palette='xxx')
在这里插入图片描述

RColorBrewer::display.brewer.all()  #查看调色板样式
ggplot(data=singer,
       aes(x=voice.part,y=height,fill=voice.part,color=voice.part))+
  geom_boxplot(alpha=0.7)+
  labs(x="音域",y="身高",title="不同音域的歌手身高分布箱线图")+
  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
        axis.title.x = element_text(family="myFont",size=15,vjust=-0.5),
        axis.title.y = element_text(family="myFont",size=15),
        axis.text.x = element_text(family="myFont1",angle = 90,size=12),
        axis.text.y = element_text(family="myFont1",size=12))+
		scale_fill_brewer(palette='Set2')

在这里插入图片描述

(5) 图例样式设置

I.取消图例标题+调整图例位置

命令theme(legend.title=element_blank())
           theme(legend.position="top/bottom/right/left")

ggplot(data=singer,
       aes(x=voice.part,y=height,fill=voice.part,color=voice.part))+
  geom_boxplot(alpha=0.7)+
  labs(x="音域",y="身高",title="不同音域的歌手身高分布箱线图")+
  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
        axis.title.x = element_text(family="myFont",size=15,vjust=-0.5),
        axis.title.y = element_text(family="myFont",size=15),
        axis.text.x = element_text(family="myFont1",angle = 90,size=12),
        axis.text.y = element_text(family="myFont1",size=12),
        legend.title=element_blank(),
        legend.position="top")+
  scale_fill_brewer(palette='Set2')

在这里插入图片描述
当然legend.position也可以传入具体位置向量,如legend.position=c(0.5,0.6)

II.更改图例顺序

主要修改数据框中变量的因子顺序

singer$voice.part=factor(singer$voice.part,level=rev(levels(singer$voice.part))) #逆序排列

在这里插入图片描述
此外,修改图例的顺序还可以通过scale_fill_discrete(breaks=c())等命令(但是它是将原图例和新的图例一起呈现的

(6) 多图汇总

当需要结合多组图片进行说明时,就需要将其放置一张画布上呈现。而普通设置画布的方式par(mfrow=c(n,m)),在ggplot中是不起作用的。以下,介绍两种多图呈现的方式。使用的数据集为鸢尾花

I. Rmisc包下的multiplot函数

library(Rmisc)
p1 <- ggplot(data=iris,aes(x=Sepal.Length,y=Sepal.Width))+geom_point()
p2 <-ggplot(data=iris,aes(x=Species,y=Petal.Width,color=Species))+geom_boxplot()
p3 <- ggplot(data=iris,aes(x=Sepal.Width))+geom_density()
p4 <- ggplot(data=iris,aes(x=Petal.Length))+geom_histogram()
multiplot(p1,p2,p3,p4,cols=2)

在这里插入图片描述
这种方式虽然快捷,但它是默认按列进行排列的,无法指定各个图片放置的位置,当然也无法指定某个图片占一排的情况。

II. grid包下的layout函数

library(grid)
pushViewport(viewport(layout = grid.layout(2,2)))   #指定画图大小

vplayout <- function(x,y){
  viewport(layout.pos.row = x,layout.pos.col = y)
}
p1 <- ggplot(data=iris,aes(x=Sepal.Length,y=Sepal.Width))+geom_point()
p2 <-ggplot(data=iris,aes(x=Species,y=Petal.Width,color=Species))+geom_boxplot()
p3 <- ggplot(data=iris,aes(x=Sepal.Width))+geom_density()

print(p1,vp=vplayout(1,1:2))   #图片p1占画布的第一行

print(p2,vp=vplayout(2,1))  #图片p2占画布第二行的第一个位置

print(p3,vp=vplayout(2,2))  #图片p3占画布第二行的第二个位置

在这里插入图片描述
通过编写自定义函数,可以实现对图片指定位置摆放

三、ggplot2中的数据变换

        通过上述的介绍,我们可以知道,其实ggplot中图例的出现是由于aes中fill(或者color、shape)的设置。它们均需要指定为一个类别型变量,而实际中数据排列方式通常如左图所示,ggplot2需要的是右图排列样式。

        这种差异导致使用ggplot直接作图十分不便,因此,需要对原数据集进行转变。转变方式在之前博客中有介绍过五分钟学会四种宽数据转长数据的方法,这里再介绍一种新的方法:melt

library(reshape2)
data <- read.table("clipboard",header=T)
new_data <- melt(data,id='date',measure=c("Anhui","Chongqing"))
new_data

在这里插入图片描述
此时,再用ggplot绘图就十分方便啦

windowsFonts(myFont = windowsFont("宋体"))  
windowsFonts(myFont1 = windowsFont("微软雅黑"))  #横纵轴标签样式
ggplot(data=new_data,
       aes(x=date,y=value,color=variable,group=variable))+
       geom_point()+
       geom_line()+
       labs(x="日期",y="确诊人数",title="2020/1/30-2020/2/2日确诊人数(安徽、重庆)")+
       theme(plot.title = element_text(family = "myFont",size=15,hjust=0.5),
             axis.title.x = element_text(family="myFont",size=15,vjust=-0.5),
             axis.title.y = element_text(family="myFont",size=15),
             axis.text.x = element_text(family="myFont1",angle = 90,size=12),
             axis.text.y = element_text(family="myFont1",size=12),
             legend.title=element_blank())

在这里插入图片描述

当然,关于ggplot的学习远不止这些,还有很多细节控制命令,因篇幅限制尚未涉及。有兴趣的朋友可参考R-cookbook。如有错误,还望指出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R语言(一) ggplot2常用绘图命令总结 的相关文章

  • 重叠并固定小平面中的 x 尺度(尺度=“自由”)以制作电影

    在另一篇文章中 Justin 的帮助下 我用以下方法绘制了模拟结果facet gridggplot2 中的选项 包含数据和答案的帖子在这里 使用facet grid选项通过ggplot2绘制数据框的列 https stackoverflow
  • R:几个单独图的重新排序因子水平

    我正在尝试从同一个 data frame 创建多个单独的图 每个图的 y 轴上的因子水平顺序不同 每个图都应该对 y 上的因子水平进行递减排序 我知道这可以为每个图手动完成 但我正在寻找一种更有效和更优雅的方法 因为我需要创建相当多的图 这
  • ggplot多个时间不等的时间序列

    我知道有一些与时间序列和多个数据帧相关的已回答问题 但我似乎无法弄清楚这一点 我想绘制 4 个不同压力传感器与时间的时间戳数据 pa 列 我有来自同一实验的 4 个带时间戳的压力读数 dfs 然而 由于传感器故障和数据中的其他信号 传感器收
  • 三角形内的热图

    考虑以下示例 triangle lines lt data frame X c 0 0 1 1 0 5 0 5 Y c 0 0 0 0 1 1 grp c 1 2 1 3 2 3 df lt matrix c c 0 2 0 5 0 8 c
  • 如何创建具有特定于每个方面的标题和副标题的分面图?

    生成一个图 该图与每列的单独图相结合 带有标题和副标题 以及每个图的垂直线 我使用直方图创建了带有垂直线的列 library ggplot2 library gridExtra library tidyr actualIris lt dat
  • 在动画 ggplot2 中的轴标签上包含图像

    我创建了一个动画条形图 显示玩家的进球数 虚构 请参阅示例的复制数据 df lt data frame Player rep c Aguero Salah Aubameyang Kane 6 Team rep c ManCity Liver
  • scale_y_discrete 忽略中断/标签

    漏洞 可能相关对此 https github com tidyverse ggplot2 issues 1589 dat data frame x 1 4 y ordered c 4 gt 5 1 1 levels c 1 5 gt 5 g
  • 有什么方法可以在地图上绘制多个条形图吗?

    我正在尝试在地图上绘制多个条形图 并且只是在寻找一个起点 我已经看过几个问题了 如下所示 地图上的条形图 https stackoverflow com questions 20465070 barplots on a map 使用ggpl
  • 在R中的箱线图中添加不同的百分位数

    我对 R 不太熟悉 最近用它来制作一些箱线图 我还在箱线图中添加了平均值和标准差 我想知道是否也可以在不同的百分位数中添加某种刻度线或圆圈 假设我想在每个小时箱线图中标记第 85 个 第 90 个百分位数 有没有办法做到这一点 我的数据包含
  • 如何有效地将多个 rgl 图连接成一个图?

    我用以下命令制作了 3D 绘图rgl打包我的数据的每个因子级别并将它们保存为 png 我的数据有 30 个不同的级别 从而产生了 30 个不同的图像文件 现在我想将这些 png 合并成一个图 我会这样显示它们 下面的例子说明了我想做的事情
  • ggplot2 密度直方图,宽度=.5,vline 和居中条形位置

    我想要一些离散数据的良好密度 总和为 1 直方图 我尝试了几种方法来做到这一点 但没有一种方法完全令人满意 生成一些数据 data set seed 999 d test data frame score round rnorm 100 1
  • ggplot - 标签为计算的增加 (%)

    我已经开发了一个 ggplot 图 但现在我正在尝试添加计算标签 该标签显示同比增长百分比 我的数据框非常简单 主数据集聚合的结果 data frame 4 obs of 3 variables Year int 2011 2012 201
  • ggplot `facet_grid` 标签被切断

    In ggplot 当使用facet grid space free y 如果组内的点数较少 则分面标题会被截断 例如 library tidyverse d lt tibble x factor 1 40 y rnorm 40 g c r
  • ggplot2可以在一个图例中分别控制点大小和线大小(线宽)吗?

    一个使用的例子ggplot2绘制数据点组和连接每组均值的线 并使用相同的映射aes for shape并为linetype p lt ggplot mtcars aes gear mpg shape factor cyl linetype
  • 如何在 ggplot 中保持配色方案,同时删除每个图中未使用的级别?

    我想比较一个图中的数据的一些子组和另一图中的一些其他子组 如果我绘制一个图 其中绘制了所有子组 那么这个数字将是巨大的 并且每个单独的比较都会变得困难 我认为如果给定的子组在所有图中都具有相同的颜色 这对读者来说会更有意义 这是我尝试过的两
  • 将阴影区域添加到五分位数之间的直方图中

    All 我有一个包含 2 个直方图的图表 其中我还绘制了代表第 20 40 60 和 80 个百分位数的线条 下面的代码使用虚拟数据重现了类似的图表 data lt rbind data frame x rnorm 1000 0 1 g o
  • 如何在 R 中匹配多个 ggplot2 图中的调色板?

    自从被问到这个问题以来已经有一段时间了 但我知道一个事实 我很快就会提取新数据 我想弄清楚如何用这种技术来绘制它 看起来评论和答案中的人知道如何做到这一点 但我无法完全弄清楚所给我的内容 还有人想尝试一下吗 我正在尝试使用具有多个级别的因子
  • 如何调整ggplot直方图的时间刻度轴

    我正在使用一个数据框 其中一列包含POSIXct日期时间值 我正在尝试使用绘制这些时间戳的直方图ggplot2但我有两个问题 我不知道如何设置 binwidthgeom histogram 我想将每个垃圾箱设置为一天或一周 我尝试提供 di
  • 使用 ggplot2 修改点子集的形状

    我正在尝试绘制一个沿大量维度变化的大型散点图 这是我的起始情节 p lt ggplot mtcars aes wt mpg shape cyl colour gear size carb geom point 使用mtcars数据集 我只是
  • 为什么 geom_boxplot 比基本箱线图识别更多异常值?

    这是一个可重复的示例 与基本箱线图相比 最后一个治疗组又发现了一个异常值 dta lt structure list Treatment c A A A A A A A A A A A A A A A A B B B B B B B B B

随机推荐

  • MATLAB中m文件的新建和使用

    MATLAB的m文件 目录 MATLAB的m文件 1 m文件 2 m文件的新建和打开 1 建立matlab的 m文件的3种方式 2 打开MATLAB的 m文件的3种方式 3 m文件的使用 1 命令文件的使用 2 函数文件的使用 1 m文件
  • Docker-镜像复制与重载

    文章目录 1 使用背景 2 保存镜像为文件 3 从文件载入镜像 1 使用背景 我们制作好镜像后 有时需要将镜像复制到另一台服务器使用 能达到以上目的有两种方式 一种是上传镜像到仓库中 本地或公共仓库 但是另一台服务器很肯能只是与当前服务器局
  • 【生成模型】DDPM概率扩散模型(原理+代码)

    前言 一 常见生成模型 二 直观理解Diffusion model 三 形式化解析Diffusion model 四 详解 Diffusion Model 数学推导 1 前向过程 扩散过程 2 逆扩散过程 3 逆扩散条件概率推导 4 训练损
  • QT(C++)-未找到“XXX.h”头文件的解决方式

    新建项目之后 不能在项目的头文件上立马调用include xxx h 你必须点击左上角文件 新建一个你想引用的头文件 这样你就能引用了 不会报错 你想要引用的头文件必须得在你的工作目录下 错误提示如下 解决方式如下图 以下是我的工程工作路径
  • git push 报错: error: failed to push some refs to ‘ssh://git.prmt.net:10007/root/palmhall.git‘

    git push 报错error failed to push some refs to ssh git prmt net 10007 root palmhall git 原因 这是因为当前账号没有权限 联系管理员给你开放权限就行了
  • redis安全攻防(专注渗透视角)

    目录 介绍 前言 Redis简介 1 Redis默认端口 2 官方站点 Redis环境安装 1 redis定义 2 未授权访问原因 3 redis服务的搭建 4 修改配置文件redis conf 5 连接Redis 1 Redis未授权访问
  • Eclipse 转 IDEA 改的 8 条配置

    Eclipse 转 IDEA 一定要改的配置 引言 坦白说 我很少写这种操作类型的文章 因为这种文章没啥新意 大家操作步骤肯定是一样的 然而 我答应了我的同事小阳 给她出一篇 毕竟人家打算从Eclipse转IDEA了 于是以示鼓励 写一篇给
  • win10环境android反编译apk

    我发现我想整点啥啊 从网上搜教程 一个教程永远不能成功 感谢以下所有教程 android反编译apk 首先我找到的是这个教程 https blog csdn net qq 31939617 article details 124610655
  • 逆变器方案(高频/工频)正弦波逆变器驱动板,兼容EG8010主芯片的EGS002驱动板,单极性交替驱动,解决单边发热需要全波整流采样

    逆变器方案 高频 工频 正弦波逆变器驱动板 兼容EG8010主芯片的EGS002驱动板 单极性交替驱动 解决单边发热需要全波整流采样 两个半桥能量不均匀导致的性能不稳定 可选单极性基波调制 兼容高频机峰值单线分压采样 不用更改任何电路 此驱
  • nodejs中创建web服务,监听本地IP

    nodejs官网例子 var http require http http createServer function req res res writeHead 200 Content Type text plain res end He
  • android 错误 exported needs to be explicitly specified for Apps targeting Android 12

    问题描述 android 错误 android exported needs to be explicitly specified for Apps targeting Android 12 问题原因 由于项目的编译版本compileSdk
  • java中String、StringBuffer和StringBuilder的区别

    java中String StringBuffer和StringBuilder的区别 java中用于处理字符串常用的有三个类 java lang String java lang StringBuffer java lang StrungBu
  • vs2017试用期满后的处理

    vs2017是免费社区 但是第一次试用的时候没有登录账户 提示试用期满不能进行操作 现在根据查到的方法 在微软账户注册 注册后把浏览器关闭 很必要 然后再在vs中登录就会激活了 可以放心的使用 ps 也有的说需要要卸载后在安装的 发现并不必
  • Hugging face教程-使用速查表-快速入门

    Hugging face笔记 course url https huggingface co course chapter5 8 fw pt 函数详细情况 https huggingface co docs transformers mai
  • 使用python的pyecharts库绘制多选项卡折线图示例

    使用python的pyecharts库绘制多选项卡折线图示例 pyecharts介绍 环境 安装环境 条形图 折线图 多选项卡折线图 参考 pyecharts介绍 Pyecharts是一个用于生成Echarts图表的类库 可以与Python
  • 虚拟机可以ping通外网,但xshell无法远程连接的解决办法

    刚开始学习大数据 linux需要配三个节点 但是静态IP设置之后发现xshell无法连接 关闭防火墙啥的都没用 无奈之时突然想起自己当时瞎搞过这个VMware8虚拟网卡的ip地址 我把这个的ipv4的地址自己设置了 于是猜想是不是这个问题
  • Android 组件

    TextView 文本框 用于显示文本的一个控件 文本的字体尺寸单位为 sp sp scaled pixels 放大像素 主要用于字体显示 文本常用属性 属性名 说明 id 为TextView设置一个组件id 根据id 我们可以在Java代
  • 通过pip安装pytorch超时问题解决

    前言 这篇文章只记录通过pip安装pytorch超时问题的解决方案 默认阅读者已经安装了Python2 7或者其他3 x的版本 版本信息 系统 macos 11 1 pip 21 0 1 python 3 8 解决方案 第一步 去官网查询合
  • Docker之nacos集群部署(详细教你搭建)

    目录 一 mysql安装与基本操作 一 mysql安装 1 拉取mysql镜像 2 定义挂载目录 3 配置my cnf my ini 4 开启mysql容器 5 用navicat连接工具连接远程端口 6 nacos数据库配置 创建一个nac
  • R语言(一) ggplot2常用绘图命令总结

    提到R语言 总会想到它强大的绘图包ggplot2 甚至于其他语言中也有它的痕迹 例如 python中的matplotlib模块就有ggplot样式 以下 总结了一些日常绘图中常用的命令 目录 一 基本绘图 二 精雕细琢 1 添加标题 横纵轴