R语言使用ggplot绘制画中画细节放大的方法

目录
  • 1. 载入相关包
  • 2. 数据生成
  • 3. 基础绘图
  • 4. 放大效果
  • 5. 绘图美化
  • 其他方法

当我们在利用ggplot绘图时,当遇到一些量纲相差过大,或者一些图的某些点排布密集时,需要将细节部分进行放大,这时我们就需要采用画中画的方式,或者将统计图的细节在旁边进行放大。

下面我们就来一步一步讲解如何将图中的细节进行放大(核心为ggforce包)。话不多说,先上最终效果图(以2019年双十一数据拟合为例):

1. 载入相关包

library(ggplot2)  # 绘图核心
library(tidyr)    # 数据整理
library(ggforce)  # 画中画核心包

2. 数据生成

我们收集了双十一销量数据,并进行一些处理,这里生成数据相对比较简单,就不进行解释了。

# generate data
year <- 2009:2019
sales <- c(0.5, 9.36, 52, 191, 350, 571, 912, 1207, 1682, 2135, 2684)
growth_rate <- c(NA, diff(sales) / sales[1:(length(sales) - 1)] * 100)
dat <- data.frame(year = factor(year), sales, growth_rate)

# fit the curve of data
dat_curve <- data.frame(year_std = 1:10, growth_rate = growth_rate[2:11] / 100)
dat_curve$ind <- factor(c(rep(x = 1, 9), 2))

生成的数据长下面这样:

   year_std growth_rate ind
1         1  17.7200000   1
2         2   4.5555556   1
3         3   2.6730769   1
4         4   0.8324607   1
5         5   0.6314286   1
6         6   0.5971979   1
7         7   0.3234649   1
8         8   0.3935377   1
9         9   0.2693222   1
10       10   0.2571429   2

3. 基础绘图

首先我们添加一些散点(geom_point),与拟合曲线(geom_smooth),并将2019年与历年区别开,代码如下:

dat_curve %>%
  ggplot(aes(x = year_std, y = growth_rate, col = ind)) +
  geom_smooth(se = FALSE, method = "gam", formula = y ~ I(x^(-2)), size = 2, col = "#b3cde3") +
  geom_point(size = 4, alpha = 0.8)

接着我们发现,在后面段这些散点在增长率上的差异看不出来了,因此需要使用画中画的方法,来对这部分进行放大。

4. 放大效果

其实非常简单facet_zoom(y = growth_rate < 1),我们选取增长率小于1的部分进行放大即可:

dat_curve %>%
  ggplot(aes(x = year_std, y = growth_rate, col = ind)) +
  geom_smooth(se = FALSE, method = "gam", formula = y ~ I(x^(-2)), size = 2, col = "#b3cde3") +
  geom_point(size = 4, alpha = 0.8) +
  facet_zoom(y = growth_rate < 1)

5. 绘图美化

最后,我们再添加一些代码进行美化即可!(美化的代码可以在我其他的博客中找到具体的解释哦)

dat_curve %>%
  ggplot(aes(x = year_std, y = growth_rate, col = ind)) +
  geom_smooth(se = FALSE, method = "gam", formula = y ~ I(x^(-2)), size = 2, col = "#b3cde3") +
  geom_point(size = 4, alpha = 0.8) +
  labs(title = expression(paste('年份与销售额增长率拟合 (', R^2, " = 0.9978)")), x = "年份", y = "销售额增长率") + # 混合公式与中文,可参考本人另外的博客,相关的说明。
  xlim(0, 10) +
  scale_y_continuous(labels = scales::percent) +   # y轴刻度改为百分数
  scale_x_continuous(breaks = 1:10, labels = 2010:2019) +
  scale_fill_manual(values = c('#fbb4ae', '#ccebc5')) +
  theme_bw(base_family = "Times") +
  theme(axis.text.x = element_text(angle = 30), # x轴刻度倾斜30度
        panel.grid.minor = element_blank(),
        legend.position = "none",
        text = element_text(family = "STHeiti"),
        plot.title = element_text(hjust = 0.5)) +
  facet_zoom(y = growth_rate < 1)

其他方法

其他几种ggplot绘制画中画的方法:

It is possible to create inset graphs?

Plots within plots with ggplot2 and ggmap

之后有时间我会补充另外一些利用ggplot进行画中画绘图的方法(觉得目前的绘制方式最好看且很简单,因此先讲解本博文中的方法)。

以上就是R语言使用ggplot绘制画中画细节放大的方法的详细内容,更多关于ggplot绘制画中画细节放大的资料请关注我们其它相关文章!

(0)

相关推荐

  • R语言 ggplot2改变柱状图的顺序操作

    如下所示: library(ggplot2) library(ggthemes) dt = data.frame(obj = c('A','D','B','E','C'), val = c(2,15,6,9,7)) dt$obj = factor(dt$obj, levels=c('D','B','C','A','E')) ## 设置柱条的顺序 p = ggplot(dt, aes(x = obj, y = val, fill = obj, group = factor(1))) + geom_

  • R语言作图之density plot(密度图)的制作步骤

    上次分享了小提琴曲线(violin plot)的作图方法,今天小仙同学给大家介绍一下如何用R画出漂亮的密度图(density plot). Step1. 绘图数据的准备 首先还是要把你想要绘图的数据调整成R语言可以识别的格式,把excel保存成csv格式. 数据的格式如下图:一列表示一种变量,第一行是列名 Step2. 绘图数据的读取 data<-read.csv("your file path", header = T) #注释:header=T表示数据中的第一行是列名,如果没

  • R语言绘制频率直方图的案例

    频率直方图是数据统计中经常会用到的图形展示方式,同时在生物学分析中可以更好的展示表型性状的数据分布类型:R基础做图中的hist函数对单一数据的展示很方便,但是当遇到多组数据的时候就不如ggplot2绘制来的方便. *** 1.基础做图hist函数 hist(rnorm(200),col='blue',border='yellow',main='',xlab='') 1.1 多图展示 par(mfrow=c(2,3)) for (i in 1:6) {hist(rnorm(200),border=

  • R语言 使用ggplot2绘制好看的分组散点图

    我们以iris数据集为例,该数据集包括花萼的长度和宽度,花瓣的长度和宽度,以及物种,如下图: 本文我们要绘制不同物种下花萼的长度和宽度的分布情况,以及二者之间的相关性关系. 1. 首先载入ggplot2包, library(ggplot2) 2. 然后进行ggplot(data = NULL, mapping = aes(), ..., environment = parent.frame())绘制,在绘制中第一个参数是数据,第二个参数是数据映射,是绘制的全局变量,其中包含的参数有x,y,col

  • R语言使用ggplot绘制画中画细节放大的方法

    目录 1. 载入相关包 2. 数据生成 3. 基础绘图 4. 放大效果 5. 绘图美化 其他方法 当我们在利用ggplot绘图时,当遇到一些量纲相差过大,或者一些图的某些点排布密集时,需要将细节部分进行放大,这时我们就需要采用画中画的方式,或者将统计图的细节在旁边进行放大. 下面我们就来一步一步讲解如何将图中的细节进行放大(核心为ggforce包).话不多说,先上最终效果图(以2019年双十一数据拟合为例): 1. 载入相关包 library(ggplot2) # 绘图核心 library(ti

  • R语言学习ggplot2绘制统计图形包全面详解

    目录 一.序 二.ggplot2是什么? 三.ggplot2能画出什么样的图? 四.组装机器 五.设计图纸 六.机器的零件 1. 零件--散点图 1) 变换颜色 2) 拟合曲线 3) 变换大小 4) 修改透明度 5) 分层 6) 改中文 2. 零件--直方图与条形图 1) 直方图 2) 润色 3) 条形图 3. 零件--饼图 4. 零件--箱线图 5. 零件--小提琴图 6. 零件打磨 7. 超级变变变 8. 其他常用零件 七.实践出真知 八.学习资源 九.参考资料 一.序 作为一枚统计专业的学

  • R语言编程学习绘制动态图实现示例

    在讨论级数时,可能需要比对前 n n n项和的变化情况,而随着 n n n的递增,通过动态图来反映这种变化会更加直观,而通过R语言绘制动态图也算是一门不那么初级的技术,所以在此添加一节,补充一下R语言的绘图知识. 绘图需要用到ggplot2,为多张图加上时间轴则需要用到gganimate,为了让这些动态图片被渲染,需要用到av.此外,ggplot2绘图需要输入的数据格式为tibble. install.packages("ggplot2") install.packages("

  • R语言包ggplot实现分面去掉小标题的灰色底色小技巧

    目录 当我们在使用 ggplot 时,使用分面通常会长下面这样(这里用 ggplot 的官方案例): p <- ggplot(mpg, aes(displ, hwy)) + geom_point() p + facet_wrap(~class) 此时,我们想将背景的灰色底色去掉,可以用我们常用的 theme_bw(): p + facet_wrap(~class) + theme_bw() 此时如果背景的灰色网格不想要了,可以接着添加 theme(panel.grid = element_bla

  • R语言数据可视化绘制Circular bar plot实现环形柱状图

    目录 Step1. 绘图数据的准备 Step2. 绘图数据的读取 Step3.绘图所需package的调用 Step4.绘图 环形柱状图 排好序的环形柱状图 调整颜色 注意事项 不知不觉,距离小仙上次发文已经过去五个多月了.R语言作图系列的更新频率跟理想中的一月一次差别有点忒大了,不得不让小仙陷入深深的反思,对于时间的规划也有了一些新的感悟.不知道大家有没有跟我一样的感受啊,举些例子:放学.下班或者放假之后先把学习任务扔在一边,心想着,我先玩会游戏,等会玩够了再做:网上看到一篇干货满满的文章,先

  • R语言可视化ggplot2绘制24小时动态血糖图

    目录 数据格式 创建等距时间序列的方法(分钟) 画图代码 数据格式 sample=read.csv("sample.csv",header = T,stringsAsFactors = F)head(sample) 创建等距时间序列的方法(分钟) time=strptime("00:00:00","%H:%M:%S")+300*0:287 #没有填日期的时候,默认日期为今天 画图代码 #time首先要转换成 POSIXct 格式, 下面的brea

  • R语言利用ggplot2绘制QQ图和箱线图详解

    目录 绘制qq图 函数介绍 例子 绘制boxplot 函数介绍 例子 利用分位点绘制箱线图 将QQ图和箱线图进行融合 函数介绍 参数介绍 注意事项 例子 绘制qq图 在ggplot2中绘制qq图需要两步,geom_qq()将绘制样本分位点,geom_qq_line()将绘制标准正态线 函数介绍 geom_qq() geom_qq( mapping = NULL, data = NULL, geom = "point", position = "identity",

  • R语言入门教程之删除指定数据的方法

    引言 在R学习中经常用到的是按着某种逻辑值提取数据集.本文来讲一下利用索引的手法删除数据集合. 数据准备 > Data 英雄 职业 熟练等级 使用频次 胜率 1 后裔 射手 5 856 0.64 2 孙尚香 射手 5 211 0.10 3 狄仁杰 射手 5 324 0.20 4 李元芳 射手 4 75 0.30 5 安琪拉 法师 5 2324 0.40 6 张良 法师 4 755 0.50 7 不知火舞 法师 4 644 0.60 8 貂蝉 法师 3 982 0.70 9 <NA> &l

  • R语言实现ggplot重绘天猫双十一销售额曲线图过程

    目录 Let's start 输入数据 粗略绘图 完善散点图 添加拟合曲线 在散点上添加销售额 删除不必要的背景线 终极美化 小作业 前一段时间,很多人被这张图刷屏了: 这张图的来源是一篇名为 "淘宝2009-2018年历年双11销售额数据造假" 的文章.图中散点为天猫双十一销售额数据,曲线为原作者拟合的回归线.乍一看散点完美地分布在曲线上,原作者便直接声称:"淘宝双十一销售额数据造假!不可能有这么完美的拟合!" 可事实真的是这样吗? 作为一个热爱画画的博主,我们先

随机推荐