前两天给一个朋友看个数据,碰到了这么一个问题:整个作图数据有多个曲线,并且是通过第三方的包生成,转化成了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))
这两图的结果是一样的,但是,前面的aes实现的方式不一样:
p1在ggplot的顶层,进行了颜色的映射,同时,在geom_line中进行了linetype线型的影射,同时把颜色映射为NULL
p2在ggplot2的顶层,没有颜色与线型的映射,只是在geom_line中进行了线型的影射,而在geom_point中进行了颜色的映射。
paNULL)pbNULL)pa+pb+plot_layout(nrow = 2)+plot_annotation(tag_levels = "a",tag_prefix = "p",title = "用aes调整后的图")
可以看到,aes(color=NULL),对p2是没作用的。总之,这里的aes,更改了顶层的影射,如果底层的geom()里有自己的影射,是不起作用的。这里讲的目的,就是要让大家知道这个原理,然后再去谈更改作图的问题。
更改生成的图
好了,了解了上面的原理,我们再来作一个想象:假设这里的p1与p2,是封装好的函数,你并不知道这里面的代码是什么,比如说,像上面的例子,你只是知道通过它们能得到一样的图,但是在代码里,比如说aes的影射,是如何实现的,你不清楚。那么,我们如何来更改呢?
更改有两种办法:一种就是把整个作图中的数据找到,直接更改相应的数据,通过ggplot_build来实现,这个上次分享过,有兴趣的可以了解下:R的技巧-012篇-缝缝补补改创建好的ggplot2图。因为这个相对麻烦些,个人不太喜欢。我们来看看另外的方法。
在ggplot2中,我们有标度的概念,对于这里的linetype,还有color,如果不满意
,可以直接更改,用scale_XXX_XXX来实现:
pAvalues =rainbow(pBvalues =rainbow(
所以,无论原图的color与linetype是在哪个层级进行的影射,只要发生了这个影射,就可以通过scale_XXX_XXX的形式,把对应的值改掉。
其它的情况
在更改现成图片时,有可能前面的点根本没有影响,比如上面的例子,p1中的点图,点的大小,不满意,但是如果p1是封装出来的,我们也无法直接在代码中调size,那该怎么办呢? 这里就有必要讲一讲update_geom_defaults()这个函数,它可以对默认的作图参数作一些调整。来看看:
update_geom_defaults("point",list(size=10,color="blue"))p2
这里通过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
那我们如何让这个作图按照每次更新后的来依次作图呢?
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
好了,今天的分享就到这里。
基本概念系列 |
从零开始学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函数插值 |