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

目录
  • Let's start
  • 输入数据
  • 粗略绘图
  • 完善散点图
  • 添加拟合曲线
  • 在散点上添加销售额
  • 删除不必要的背景线
  • 终极美化
  • 小作业

前一段时间,很多人被这张图刷屏了:

这张图的来源是一篇名为 “淘宝2009-2018年历年双11销售额数据造假” 的文章。图中散点为天猫双十一销售额数据,曲线为原作者拟合的回归线。乍一看散点完美地分布在曲线上,原作者便直接声称:“淘宝双十一销售额数据造假!不可能有这么完美的拟合!” 可事实真的是这样吗?

作为一个热爱画画的博主,我们先不来考虑这个问题,直接来试着在 R 中绘制出上图,一个更好看版本的上图。

Let's start

温馨小提示:在这篇博客中,你可以学会下述 ggplot 的绘图小技巧:

如何在图像中拟合二次曲线;

如何在图像中添加文本或自适应地添加文本;

如何删除一些不必要的背景线;

还有一些常规操作:换主题、改刻度、改颜色等等… …

偷偷放个最终成果:

输入数据

首先我们查到具体每一年的天猫销售额数据,然后在 R 中构建 data frame.

year <- 2009:2019
sales <- c(0.5, 9.36, 52, 191, 350, 571, 912, 1207, 1682, 2135, 2684)
dat_sales <- data.frame(year = year, sales = sales)

由于我们想重点凸显出 2019 年的具体表现,所以我们还需要添加一列 index 表示是否为 2019 年(非 2019 年为 1, 2019 年为 2):

dat_sales$ind <- factor(c(rep(x = 1, 10), 2))

数据框长着如下这样:

   year   sales ind
1  2009    0.50   1
2  2010    9.36   1
3  2011   52.00   1
4  2012  191.00   1
5  2013  350.00   1
6  2014  571.00   1
7  2015  912.00   1
8  2016 1207.00   1
9  2017 1682.00   1
10 2018 2135.00   1
11 2019 2684.00   2

好啦,有了上述数据框,我们就可以开始进行 ggplot 的绘图了!

粗略绘图

首先我们就用默认参数画出散点变化趋势,同时 2019 年标注出不一样的颜色:

library(ggplot2)
ggplot(dat = dat_sales) +
  geom_point(aes(x = year, y = sales, col = ind))

但是这样的绘图有很多问题:缺少标题,坐标轴的标题改中文,x 轴的显示不是离散的年份,散点过小,图例问题等等问题,我们先一步一步来进行完善。

完善散点图

ggplot(dat = dat_sales) +
  geom_point(aes(x = year, y = sales, col = ind), size = 4) +
  scale_x_continuous(breaks = 2009:2019, labels = 2009:2019) +
  labs(title = "2009 - 2019 年销售额", x = "年份", y = "销售额 (亿元)") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))

其中,size = 4, 表示将散点进行放大,具体的尺寸可以自己进行设置; breaks = 2009:2019 表示原本数据集中在 x 轴上对应的值; labels = 2009:2019 表示映射到图像上 x 轴的值; legend.position = "none"表示取消 legend 显示。

强调:这里为了显示年份,其实可以采用将年份转换成 factor 型的方法,但由于我们还需要使用年份数据进行曲线拟合,若转化成 factor 会使得曲线拟合失败,因此我们采用稍微复杂一些的修改 x 轴刻度的方法。

添加拟合曲线

下面我们就开始添加二次函数拟合曲线:

ggplot(dat = dat_sales) +
  geom_point(aes(x = year, y = sales, col = ind), size = 4) +
  geom_smooth(aes(x = year, y = sales), se = FALSE, method = "lm", formula = y ~ x + I(x^2), size = 2) +
  scale_x_continuous(breaks = 2009:2019, labels = 2009:2019) +
  labs(title = "2009 - 2019 年销售额", x = "年份", y = "销售额 (亿元)") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))

ggplot 中通常都是使用 geom_smooth 来进行曲线或者直线的拟合,对于线性、二次、三次函数,我们都是使用 method = "lm"; se = FALSE 表示不显示置信区间; formula = y ~ x + I(x^2) 表示使用二次函数进行拟合; 最后的 size = 2 表示调整线的粗细。

在散点上添加销售额

可以发现,这样的曲线只能看出趋势,但是却看不出每年的具体销售额,所以接下来我们尝试在图像的每个散点加上具体的销售额:

# library(ggrepel)
ggplot(dat = dat_sales) +
  geom_point(aes(x = year, y = sales, col = ind), size = 4) +
  geom_smooth(aes(x = year, y = sales), se = FALSE, method = "lm", formula = y ~ x + I(x^2), size = 2) +
  geom_text(aes(x = year, y = sales, label = sales), hjust = 0.5, vjust = -1) +
  # geom_text_repel(aes(x = year, y = sales, label = sales)) +
  ylim(0, 3000) +
  scale_x_continuous(breaks = 2009:2019, labels = 2009:2019) +
  labs(title = "2009 - 2019 年销售额", x = "年份", y = "销售额 (亿元)") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))

当我们需要在绘图中添加文本时,通常可以使用 geom_text 函数,然后 aes(label = ) 中设定需要显示的变量名称,最后的 hjust = 0.5, vjust = -1 表示调整显示的相对位置,前者表示水平位置,后者表示垂直位置,这个根据绘图的不同需要自己进行手动调整。

同时,2019 年的销售额较高,如果不调整 y 轴的显示范围,最上面显示的销售额 2684 会被遮挡,所以我们添加了 ylim(0, 3000)

另外,细心的童鞋一定发现了,我们在代码中添加了两行注释,注释的内容同样是添加文本的语句: geom_text_repel(aes(x = year, y = sales, label = sales)),这个语句可以自适应地调整每个文本显示内容,使文本不会挡住我们的散点和曲线,这个函数在包 ggrepel 中。这里之所以是因为这个方式大多用于图像中散点比较多,比较乱的情况,如果在此幅图中使用,会使得销售额的文本显示略显混乱。

删除不必要的背景线

再细心一些的童鞋可能观察到了,背景的网格图,在 x 轴每两个年份之间都有一根垂直线,这个垂直线是毫无意义的。这时我们不禁要问,是否有方法能够将这根线消去呢?

答案是肯定的:

ggplot(dat = dat_sales) +
  geom_point(aes(x = year, y = sales, col = ind), size = 4) +
  geom_smooth(aes(x = year, y = sales), se = FALSE, method = "lm", formula = y ~ x + I(x^2), size = 2) +
  geom_text(aes(x = year, y = sales, label = sales), hjust = 0.5, vjust = -1) +
  ylim(0, 3000) +
  scale_x_continuous(breaks = 2009:2019, labels = 2009:2019) +
  labs(title = "2009 - 2019 年销售额", x = "年份", y = "销售额 (亿元)") +
  theme(panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(hjust = 0.5))

修改起来其实也不难,可以发现,每个年份对应的垂直线叫做 major,而年份没对应到的网格线叫做 minor,因此我们直接在 theme 中添加 panel.grid.minor = element_blank() 即可。

终极美化

到这里,我们的基本元素的拼凑已经告一段落了,但是整体图看起来依旧是不够美观,所以接下来我们再进行一些操作来美化绘图,最终代码与结果如下:

ggplot(dat = dat_sales, aes(x = year, y = sales)) +
  geom_smooth(se = FALSE, method = "lm", formula = y ~ x + I(x^2), size = 2, col = "#b3cde3") +
  geom_point(aes(col = ind), size = 4) +
  ylim(0, 3000) +
  geom_text(aes(label = sales), hjust = 0.5, vjust = -1) +
  scale_x_continuous(breaks = 2009:2019, labels = 2009:2019) +
  labs(title = "2009 - 2019 年销售额", x = "年份", y = "销售额 (亿元)") +
  theme_bw(base_family = "Times") +
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        plot.title = element_text(hjust = 0.5))

这里其实做了一些细节的调整,首先先绘制拟合曲线,再绘制散点,这样散点就会在曲线的上方,这样看起来会更加的美观。其次改变了拟合曲线的颜色:col = "#b3cde3",改变了绘图的主题:theme_bw(base_family = "Times"),删除了丑丑的边框:panel.border = element_blank()

至此,我们美美的绘图重构就完成了!

小作业

最后,感兴趣的童鞋不妨将我们图中的二次拟合曲线替换成三次函数拟合,或者两者均添加,然后修改一下透明度,使得两条线都能看见一部分。

以上就是ggplot绘制天猫双十一销售额曲线图实现过程的详细内容,更多关于ggplot绘制天猫双十一销售额的资料请关注我们其它相关文章!

(0)

相关推荐

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

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

  • 使用R语言绘制散点图结合边际分布图教程

    目录 1. 使用ggExtra结合ggplot2 1)传统散点图 2)密度函数 3)直方图 4)箱线图(宽窄的显示会有些问题) 5)小提琴图(会有重叠,不建议使用) 6)密度函数与直方图同时展现 2. 使用cowplot与ggpubr 1)重绘另一种散点图 2)有缝拼接 3)无缝拼接 参考 主要使用ggExtra结合ggplot2两个R包进行绘制.(胜在简洁方便)使用cowplot与ggpubr进行绘制.(胜在灵活且美观) 下面的绘图我们均以iris数据集为例. 1. 使用ggExtra结合gg

  • python中用ggplot绘制画图实例讲解

    Python的绘图库也允许用户创建优雅的图形,本章给大家介绍的是关于ggplot绘制画图的技巧,ggplot2建立在grid系统上,这个系统不支持纹理.需要额外创建一堆数据,再基于这些数据构建一个geom_path图层,盖在柱图上才可以进行各种绘制,下面给大家详细讲解下怎么使用ggplot绘图. 简介: ggplot类是在plotnine中的,能够生成一个图形. 安装: pip install pandas plotnine csv文件加载到survs_df的数据框架: ggplot(survs

  • 使用R语言绘制棒棒糖图火柴杆图教程

    目录 使用原生ggplot方法 1)生成数据 使用ggpubr包中的ggdotchart() 参考 使用原生ggplot方法 最容易也是最简单想到的方法是直接使用ggplot2包进行更新,这里需要使用ggplot本身的特性,通过图层叠加的方式,进行最终棒棒糖图的展现.(宽度极窄的柱状图配合散点图即可呈现) 1)生成数据 下面我们的展示均以此份数据为例: library(ggplot2) # Load data data("mtcars") dfm <- mtcars # Conv

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

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

  • R语言数据可视化ggplot绘制置信区间与分组绘图技巧

    目录 1. 单组情况 1)构造数据集 2)绘制置信区间 2. 多组情况 方法1 1)构造数据集 2)绘制置信区间 方法2 1)构造数据集 2)绘制置信区间 3)美化 1. 单组情况 1)构造数据集 x <- 1:10 y <- x^2 ci_l <- x^2 - 0.5 * x ci_r <- x^2 + 0.5 * x dat_plot <- data.frame(x, y, ci_l, ci_r) 数据集长下面这样: x y ci_l ci_r 1 1 1 0.5 1.5

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

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

  • 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语言数据可视化分析天猫双十一销售额增长率

    目录 最近和小伙伴一起探索了一下双十一后闹得沸沸扬扬的一篇文章:"淘宝2009-2018年历年双十一销售额数据造假".原文作者使用初中阶段学过的抛物线,就将每年的销售额增长趋势拟合得非常完美. (如果大家想学习如何画出上述的图像,可参见前面一篇博客:用 ggplot 重绘天猫双十一销售额图) 同时在知乎上,这个问题也成功上了当时的热搜榜,各路大神云集,也发表了很多很有意思的观点: 如何看待有人质疑淘宝双十一数据造假,并在4月份成功预测今年销售额为2680亿? 看了很多大神的文章后,自己

  • R语言数据可视化ggplot添加左右y轴绘制天猫双十一销售图

    目录 构造数据集 绘制散点 修改两坐标轴信息 本文是以天猫双十一销量与增长率为例,原始的数据可以参考上一篇文章:用 ggplot 重绘天猫双十一销售额图,这里不再作过多的介绍. 同时整个的天猫双十一的销售额数据分析可以关注:天猫双十一"数据造假"是真的吗? 老规矩,先上最终成果(两张图只是颜色的差别): 上图左边 y 轴表示增长率的刻度,右边 y 轴表示销售额的数据,我们将两者在同一张图上进行展现.其实将两个统计图在同一个坐标系中呈现不算是这个绘图的难点,其真正的难点在与刻度的变换以及

  • R语言绘图样式设置操作(符号,线条,颜色,文本属性)

    设置图像样式有两种方法,一种是全局修改,一种只针对一幅图片有效. 全局修改 a<-c(1:10) #全局修改 old_par<-par(no.readonly=TRUE) #记录默认样式到变量old_par中 par(lty=2,pch=17) #设置线型lty=2虚线,pch=17实心三角形,键值对的方式进行设置 #第一幅图,已经和默认样式不一样了 b<-rnorm(10) plot(a,b,type='b') #第二幅图,和第一幅图样式一样 b<-rnorm(10) plot(

  • R语言-解决处理矩阵遇到内存不足的问题

    如下: Error : cannot allocate vector of size X Gb 类似于这种问题的可能处理办法: 1. 可以用matrix尽量不要用data frame; 2. 可以用integer matrix尽量不要用 double matrix; 3. 对于大量运算后最好加上一个gc(), 强制R语言回收内存: 4. 对于大矩阵而言用bigmemory包,可以将大矩阵放到临时文件中,不占用内存. 补充:R语言之内存管理 在处理大型数据过程中,R语言的内存管理就显得十分重要,以

  • R语言绘制带ErrorBar的分组条形图代码的分享

    目录 第一种实现方法:用aggregate计算数据 第二种实现方法:用dplyr包计算数据 笔者近期画了一张带error bar的分组条形图,将相关的代码分享一下. 感谢网友青山屋主的建议,提示笔者要严谨区分技术重复和生物学重复,所以笔者对文章做修改后重发.如果各位有任何建议,欢迎指正. 本文旨在给出一种利用R对生物学重复数据画带error bar的分组条形图的方法. 所用数据是模拟生成的:分成三个组,每个组进行了若干次生物学重复:测量的是3种基因的表达量.数据的部分内容如下: ## gene1

  • R语言中对数据框的列名重命名的实现

    报错类型 Error: All arguments must be named plyr中的rename和dplyr中的rename用法是不同的. plyr::rename rename(data, c(old=new)) dplyr::rename rename(data, new = old) Example 比如, 默认的是plyr的rename, 运行下面命令, 会报错: d <- data.frame(old1=1:3, old2=4:6, old3=7:9) d library(ti

  • R语言绘制饼状图代码实例

    R编程语言有许多库来创建图表和图表. 饼图是将值表示为具有不同颜色的圆的切片. 切片被标记,并且对应于每个片的数字也在图表中表示. 在R语言中,饼图是使用pie()函数创建的,它使用正数作为向量输入. 附加参数用于控制标签,颜色,标题等. 语法 使用R语言创建饼图的基本语法是 pie(x, labels, radius, main, col, clockwise) 以下是所使用的参数的描述 x是包含饼图中使用的数值的向量. labels用于给出切片的描述. radius表示饼图圆的半径(值-1和

随机推荐