服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - R语言 - R语言实现ggplot重绘天猫双十一销售额曲线图过程

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

2022-01-19 13:47Kanny广小隶 R语言

这篇文章主要为大家介绍了如何使用ggplot绘制天猫双十一销售额曲线图的实现过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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

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

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

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

 

Let's start

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

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

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

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

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

偷偷放个最终成果:

R语言实现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))

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

但是这样的绘图有很多问题:缺少标题,坐标轴的标题改中文,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))

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

其中,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))

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

在 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))

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

当我们需要在绘图中添加文本时,通常可以使用 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))

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

修改起来其实也不难,可以发现,每个年份对应的垂直线叫做 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))

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

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

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

 

小作业

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

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

原文链接:https://blog.csdn.net/weixin_41929524/article/details/103246346

延伸 · 阅读

精彩推荐
  • R语言聊聊R语言中Legend 函数的参数用法

    聊聊R语言中Legend 函数的参数用法

    这篇文章主要介绍了聊聊R语言中Legend 函数的参数用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Gavin姓陈6352021-12-28
  • R语言R语言绘制散点图实例分析

    R语言绘制散点图实例分析

    在本篇文章里小编给大家整理的是一篇关于R语言绘制散点图实例分析内容,有需要的朋友们可以学习下。...

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

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

    这篇文章主要介绍了R语言编程学习绘制动态图实现示例,有需要的的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    微小冷7652022-01-18
  • R语言R语言中c()函数与paste()函数的区别说明

    R语言中c()函数与paste()函数的区别说明

    这篇文章主要介绍了R语言中c()函数与paste()函数的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    yiyu_j11152022-01-12
  • R语言R语言可视化存储矢量图实现方式

    R语言可视化存储矢量图实现方式

    这篇文章主要为大家介绍了R语言存储矢量图的实现方式过程,有需要的朋友可以借鉴参考下,希望能够有所你帮助,祝大家多多进步,早日升职加薪...

    Kanny广小隶9392022-01-20
  • R语言R语言创建矩阵的实现方法

    R语言创建矩阵的实现方法

    这篇文章主要介绍了R语言创建矩阵的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    hjk_caesar9462021-12-27
  • R语言R studio 批量注释的快捷方式

    R studio 批量注释的快捷方式

    这篇文章主要介绍了R studio 批量注释的快捷方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    JasonKQLin13342022-01-04
  • R语言R语言-使用ifelse进行数据分组

    R语言-使用ifelse进行数据分组

    这篇文章主要介绍了R语言-使用ifelse进行数据分组,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小力丸12042022-01-10