ggplot2箱式图两两比较_作图技巧020篇更改ggplot2作图的默认设置

本文介绍了如何更改ggplot2箱式图的默认设置,特别是针对颜色和线型的映射。通过理解ggplot2的工作原理,我们可以修改封装好的函数中的数据映射,而无需了解其内部代码细节。两种更改方式被提及,包括使用`ggplot_build`直接修改数据和利用`scale_XXX_XXX`函数调整标度。示例中展示了如何改变linetype和color的映射,确保即使原图的映射位置未知,也能实现所需更改。
摘要由CSDN通过智能技术生成
 “   更改默认设置 生活科学哥-R语言科学 2020-06-20 8:45
前两天给一个朋友看个数据,碰到了这么一个问题:整个作图数据有多个曲线,并且是通过第三方的包生成,转化成了ggplot2的数据。但是呢,对于里面的一些点啊,线的数据不是特别满意。于是,就有了一些修修补补的过程:通过更改scale的映射,改变线形,或者说是用了ggplot_build()来提取数据,再用ggplot_gtable()转换回去,简直是一个曲线救国的过程。而且,对于一些没有映射的点的大小,就是更烦一些。这里,与大家分享这个过程。希望用一个具体的例子,来说明这个过程。

先了解ggplot2的工作原理


在开始之前,我们先看一组数据: 

library(ggplot2)library(magrittr)library(patchwork)set.seed(100)dfx=rnorm(p1%ggplot(.,aes(x=x,y=y,color=cls))+geom_line(aes(linetype=cls,color=NULL))+geom_point()p2%ggplot(.,aes(x=x,y=y))+geom_line(aes(linetype=cls))+geom_point(aes(color=cls))

8151db7c86f3cbf76ac5675d2697d00f.png

这两图的结果是一样的,但是,前面的aes实现的方式不一样:
  • p1在ggplot的顶层,进行了颜色的映射,同时,在geom_line中进行了linetype线型的影射,同时把颜色映射为NULL

  • p2在ggplot2的顶层,没有颜色与线型的映射,只是在geom_line中进行了线型的影射,而在geom_point中进行了颜色的映射。

这里我们要了解下ggplot2中的作用机理:ggplot()中的影射,可以作用到后面的任何对象,但是如果对象中有一样的影射,则以几何对像中自己的为准。所以,在p1中,geom_line()中的颜色是没影射的(因为已经设置为NULL),geom_point()中的颜色,则是根据顶层的color影射;在p2中,顶层的ggplot中没有颜色的影射,所以geom_line中颜色也没有影射,而geom_point()中的颜色有自己的影射。这样说起来,有点拗口。来看看下面的例子:
paNULL)pbNULL)pa+pb+plot_layout(nrow = 2)+plot_annotation(tag_levels = "a",tag_prefix = "p",title = "用aes调整后的图")

d0791ce2a8fafb1af93b628ae08eb448.png

可以看到,aes(color=NULL),对p2是没作用的。总之,这里的aes,更改了顶层的影射,如果底层的geom()里有自己的影射,是不起作用的。这里讲的目的,就是要让大家知道这个原理,然后再去谈更改作图的问题。
更改生成的图

好了,了解了上面的原理,我们再来作一个想象:假设这里的p1与p2,是封装好的函数,你并不知道这里面的代码是什么,比如说,像上面的例子,你只是知道通过它们能得到一样的图,但是在代码里,比如说aes的影射,是如何实现的,你不清楚。那么,我们如何来更改呢?

更改有两种办法:一种就是把整个作图中的数据找到,直接更改相应的数据,通过ggplot_build来实现,这个上次分享过,有兴趣的可以了解下:R的技巧-012篇-缝缝补补改创建好的ggplot2图。因为这个相对麻烦些,个人不太喜欢。我们来看看另外的方法。

在ggplot2中,我们有标度的概念,对于这里的linetype,还有color,如果不满意

,可以直接更改,用scale_XXX_XXX来实现:

pAvalues =rainbow(pBvalues =rainbow(

021ea671311f2531f99e1aec7fefd4dd.png

所以,无论原图的color与linetype是在哪个层级进行的影射,只要发生了这个影射,就可以通过scale_XXX_XXX的形式,把对应的值改掉。


其它的情况
在更改现成图片时,有可能前面的点根本没有影响,比如上面的例子,p1中的点图,点的大小,不满意,但是如果p1是封装出来的,我们也无法直接在代码中调size,那该怎么办呢?  这里就有必要讲一讲update_geom_defaults()这个函数,它可以对默认的作图参数作一些调整。来看看:
update_geom_defaults("point",list(size=10,color="blue"))p2

9590dc1e8575c837e87b686ec932f1bb.png

这里通过update_geom_default直接更新了默认值,然后作图时就实现了大小的变化。值得一提的是,在ggplot2中,所有的对象,比如这里的p1与p2,在没有作图之前,都不真正执行:以下面的为例,p1之前的作图默认大小为2,然后我们生成了p1,后面又更新了默认值,再执行p1时,依然是基于最新的默认值进行了作图。
update_geom_defaults("point",list(size=2,color="blue"))p1%ggplot(.,aes(x=x,y=y,color=cls))+geom_line(aes(linetype=cls,color=NULL))+geom_point()update_geom_defaults("point",list(size=12,color="blue"))p2%ggplot(.,aes(x=x,y=y,color=cls))+geom_line(aes(linetype=cls,color=NULL))+geom_point()p1+p2

25e0512abaa0f018b0278f6551cc7d08.png

那我们如何让这个作图按照每次更新后的来依次作图呢?
update_geom_defaults("point",list(size=2,color="blue"))p1%ggplot(.,aes(x=x,y=y,color=cls))+geom_line(aes(linetype=cls,color=NULL))+geom_point()p1update_geom_defaults("point",list(size=12,color="blue"))p2%ggplot(.,aes(x=x,y=y,color=cls))+geom_line(aes(linetype=cls,color=NULL))+geom_point()p2

a8959bb60ee5c1251677e0d30fac0d07.png

好了,今天的分享就到这里。

基本概念系列

   从零开始学R-001篇-程序安装

   从零开始学R-002篇-向量

   从零开始学R-003篇-数据框

   从零开始学R-004篇-列表

   从零开始学R-005篇-矩阵

   数据结构-006篇-数组实例

   数据结构-007篇-因子

   数据运算-008篇-数学与逻辑运算

   数据运算-009篇-矩阵运算简单介绍

   数据运算-010篇-内置的一般数学计算函数

   数据运算-011篇-内置的统计概率函数

   数据运算-012篇-集合的操作

   逻辑运算-013篇-条件语句

循环语句-014篇-for与while

循环语句-015篇-apply家族

定位函数-016篇-which函数打天下

字符处理-017篇-paste函数

字符处理-018篇-grep,substr,sub等函数

数据运算-019篇-统计函数初体验median与mad

数据运算-020篇-统计函数初体验之分位数quantile

数据运算-021篇-统计函数初体验之差分diff函数

数据运算-022篇-统计函数初体验之中心化函数scale

数据运算-023篇-描述性统计分析及缺失值分析

数据运算-024篇-相关系数分析

基础作图

R的作图-001篇-barplot柱状图

R的作图-002篇-pie 作饼图

R的作图-003篇-hist 直方图

R的作图-004篇-boxplot箱线图

R的作图-005篇-核密度图与比较

R的作图-006篇-plot函数

R的作图-007篇-散点图与线性拟合

R的作图-008篇-散点图矩阵

R的作图-009篇-高密度散点图

R的作图-010篇-三维散点图

R的作图-011篇-气泡图

R的作图-012篇-马赛克图

R的作图-013篇-QQ图及原理

R的作图-014篇-lm拟合结果图解释

R的作图-015篇-ggplot2之初体验

R的作图-016篇-ggplot2之geom_point

R的作图-017篇-ggplot2之geom_jitter与rug

R的作图-018篇-ggplot2之geom_line与geom_path

R的作图-019篇-ggplot2之geom_area,geom_polygon geom_ribbon

R的作图-020篇-ggplot2之geom_bar,geom_col与geom_histogram    

R的作图-021篇-ggplot2之geom_density

R的作图-022篇-ggplot2之geom_density2d

R的作图-023篇-ggplot2之geom_boxplot

R的作图-024篇-ggplot2之geom_bin2d

R的作图-025篇-ggplot2之geom_contour()

R的作图-026篇-ggplot2之geom_crossbar 与geom_count()

R的作图-027篇-ggplot2之geom_errorbar 与geom_linerange等简单作图

R的作图-028篇-ggplot2之geom_vline/hline/abline/smooth等

R的作图-029篇-ggplot2之geom_tile,geom_rect与geom_raster

R的作图-030篇-ggplot2之geom_text与geom_label

作图进阶-031篇-ggplot2之geom_violin

作图进阶-032篇-ggplot2之分面facet_grid与facet_wrap

作图进阶-033篇-ggplot2之legend

作图进阶-034篇-ggplot2之作图区的设定

作图进阶-035篇-ggalluvial之桑基图

作图进阶-036篇-ggridges之峰峦图

作图进阶-037篇-坐标轴标签重叠的优化

作图进阶-038篇-数据拟合作图分析

作图进阶-039篇-plotly包之add_XXX

作图进阶-040篇-plotly的type与mode

作图进阶-041篇-plotly的颜色设置

作图进阶-042篇-plotly中往图中增加标签

作图进阶-043篇-plotly通过add_fun灵活叠加图

作图进阶-044篇-plotly的图例legend设置

作图进阶-045篇-plotly的坐标轴Ticks设置

作图进阶-046篇-plotly设定默认的trace颜色

作图进阶-047篇-plotly中画误差棒

作图进阶-048篇-plotly中的箱线图

作图进阶-049篇-plotly中的动画效果

作图进阶-050篇-plotly中二维密度与等高线

作图进阶-051篇-add_heatmap的使用

作图进阶-052篇-add_ribbons与polygons的使用

作图进阶-053篇-add_segments,add_paths与add_table

作图技巧

作图技巧-001篇-facet_zoom放大局部图

作图技巧-002篇-ggplot2 中的字体设置

作图技巧-003篇-ggplot2 新版本 3.3.0的一些新功能

作图技巧-004篇-QQ图之DIY

作图技巧-005篇-plotly做3维曲面图

作图技巧-006篇-数据标记初体验

作图技巧-007篇-数据标记之geom_mark_hull进阶

作图技巧-008篇-ggforce中甜甜圈饼图的作法及其它的功能

作图技巧-009篇-ggplot作图时的因子排序

作图技巧-010篇-plot_ly中的mesh3d

作图技巧-011篇-ggplot_build中的数据提取实现histogram与density同步叠加

作图技巧-012篇-ggplot中的stat_sum等系列

作图技巧-013篇-ggplot分面图的标签设置

作图技巧-014篇-不同的样条曲线bspline

作图技巧-015篇-大家一起来拼图

作图技巧-016篇-拼图系列之2-cowplot

作图技巧-017篇-拼图工具之3-patchwork

作图技巧-018篇-第二坐标轴在ggplot2中的实现

作图技巧-019篇-draw_key_XXX系列

R的技巧

R的技巧-001篇-快速从列表中提取元素组成数据框

R的技巧-002篇-快速对数据框中满足条件的列进行替换

R的技巧-003篇-数字的不同取整与进位

R的技巧-004篇-文件名提取分类成表

R的技巧-005篇-直方图与分布图的叠加

R的技巧-006篇-ggplot2中的cut类函数

R的技巧-007篇-assign与get:动态生成变量与获取变量

R的技巧-008篇-pretty函数实现完美分割点

R的技巧-009篇-数据填充         

R的技巧-010篇-dplyr之slice,mutate,summarize  与do

R的技巧-011篇-dnorm,pnorm与qnorm傻傻分不清

R的技巧-012篇-缝缝补补改创建好的ggplot2图

R的技巧-013篇-approx函数插值

欢迎关注与转发,如有不懂,可以共同探讨,在后台留言或者是扫码下方。

c0de87ff3a55de838c4a09a8e7936c6c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值