
R语言:ggplot2精细化绘图—以实用商业化图表绘图为例
本文旨在介绍R语言中ggplot2包的一些精细化操作,主要适用于对R画图有一定了解,需要更精细化作图的人,尤其是那些刚从excel转ggplot2的各位,有比较频繁的作图需求的人。不讨论那些样式非常酷炫的图表,以实用的商业化图表为主。包括以下结构:
1、画图前的准备:自定义ggplot2格式刷
2、画图前的准备:数据塑形利器dplyr / tidyr介绍
3、常用的商业用图:
1)简单柱形图+文本(单一变量)
2)分面柱形图(facet_wrap/facet_grid)
3)簇型柱形图(position=”dodge”)
4)堆积柱形图(需要先添加百分比,再对百分比的变量做柱形图)
5)饼图、极坐标图
6)多重线性图
这篇文章其实是我之前那篇博文的一个延续。因为接了一个活要用R定制化数据报表,其中涉及大量的对图表精雕细琢的工作。在深入研究ggplot2时,深深感觉到用ggplot2画图与用excel画图的不一样。
如果要用ggplot2画图,还是需要了解很多技术细节的。这些细节要么散落在R可视化技术和ggplot2:数据分析与图表技术这两本书里,要么散落在网上。因此在这里以我学习和总结的过程,对ggplot2的精细化画图做一个阐述,介绍我整理后的作图理念。
如果有进一步学习需要的各位,请直接买书或者自己实践学习。很多技术细节需要自己摸索才知道的,祝大家好运。
在画图前,我们首先定义一下ggplot2格式刷。
首先,ggplot2本身自带了很漂亮的主题格式,如theme_gray和theme_bw。但是在工作用图上,很多公司对图表格式配色字体等均有明文的规定。像我们公司,对主色、辅色、字体等都有严格的规定。如刘万祥老师早期的一篇配色博文里,大家更是可以看到,很多商业杂志的图表,配色风格都是非常相近的。因此,修改主题,使其更加适合我们的商业需求,保持图表风格统一,是非常必要的。
虽然ggplot2可以通过代码的追加,细细修改表距、背景色以及字体等框架。但是如果每做一个图,都要如此细调,代码将会非常繁琐,而且万一老板突然兴起要换风格时,代码修改将会非常痛苦。
幸运的是,ggplot2允许我们事先定制好图表样式,我们可以生成如mytheme或者myline这样的有明确配色主题的对象,到时候就像excel的定制保存图表模板或者格式刷,直接在生成的图表里引用格式刷型的主题配色,就可以快捷方便的更改图表内容,保持风格的统一了。
在运行之前,首先加载相关包
library(ggplot2)
library(dplyr)
library(ColorBrewer)
library(tidyr)
library(grid)
#载入格式刷
######
#定义好字体
windowsFonts(CA=windowsFont("Calibri"))
接下来是一个示范。我首先共享了我常用的一个主题刷,配色参考以下:
主体色:蓝色 085A9C ,红色 EF0808,灰色 526373
辅助色:浅黄色 FFFFE7,橙色 FF9418, 绿色 219431, 明黄色 FF9418,紫色 9C52AD
定制了mytheme, myline_blue, mycolour等多个对象:
1
#定义好字体
2 windowsFonts(CA=windowsFont("Calibri"))
3 #事先定制好要加图形的形状、颜色、主题等
4 #定制主题,要求背景全白,没有边框。然后所有的字体都是某某颜色
5 #定制主题,要求背景全白,没有边框。然后所有的字体都是某某颜色
6 mytheme<-theme_bw()+theme(legend.position="top",
7 panel.border=element_blank(),
8 panel.grid.major=element_line(linetype="dashed"),
9 panel.grid.minor=element_blank(),
10 plot.title=element_text(size=15,
11 colour="#003087",
12 family="CA"),
13 legend.text=element_text(size=9,colour="#003087",
14 family="CA"),
15 legend.key=element_blank(),
16 axis.text=element_text(size=10,colour="#003087",
17 family="CA"),
18 strip.text=element_text(size=12,colour="#EF0808",
19 family="CA"),
20 strip.background=element_blank()
21
22 )
23 pie_theme=mytheme+theme(axis.text=element_blank(),
24 axis.ticks=element_blank(),
25 axis.title=element_blank(),
26 panel.grid.major=element_blank())
27 #定制线的大小
28 myline_blue<-geom_line(colour="#085A9C",size=2)
29 myline_red<-geom_line(colour="#EF0808",size=2)
30 myarea=geom_area(colour=NA,fill="#003087",alpha=.2)
31 mypoint=geom_point(size=3,shape=21,colour="#003087",fill="white")
32 mybar=geom_bar(fill="#0C8DC4",stat="identity")
33 #然后是配色,考虑到样本的多样性,可以事先设定颜色,如3种颜色或7种颜色的组合
34 mycolour_3<-scale_fill_manual(values=c("#085A9C","#EF0808","#526373"))
35 mycolour_7<-scale_fill_manual(values=c("#085A9C","#EF0808","#526373",
36 "#FFFFE7","#FF9418","#219431","#9C52AD"))
37 mycolour_line_7<-scale_color_manual(values=c("#085A9C","#EF0808","#526373",
38 "#0C8DC4","#FF9418","#219431","#9C52AD"))
把以上代码在R里面运行以后,就可以直接使用了。譬如以下:
1)先生成一个简单的图表:
简单地指定x轴为离散型变量species,y为求和,会得到下面的柱形图
这时候,套用一下之前设置好的主题(mytheme),背景、坐标轴还有字体颜色就相应改变了。
然后,因为之前格式刷部分我设定了一个蓝色的柱形图样式(mybar),这里直接引用的话,就可以直接生成蓝色的柱形图了。
有了事先设定的一些格式刷以后,我们就可以快速有效地作图了。
但是在作图之前,就像excel作图总要先把数据用处理成想要的形式 。在excel里面,我们常用的是数据透视表或者一些公式辅助,而在R里,则是用一些常用的包,如dplyr及tidyr,对数据进行重塑再造
在我之前看的那两本ggplot2的书里,基本用的都是reshape2+plyr的组合。但实际上hadley后续出的dplyr与tidyr更加有用。具体的使用方法,在JHU Getting and cleaning data有介绍,老师还编了一个swirl课程供人使用,安装方法如下。
其他的也可以参考我这篇博文
总之,用好dplyr的话,你可以快速的把一些数据,如下面的股票逐笔成交记录
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在 “神经网络与卡尔曼滤波融合” 的理论基础上,Python 凭借其丰富的科学计算库(NumPy、FilterPy)、深度学习框架(PyTorch、T ...
2025-10-23在工业控制、自动驾驶、机器人导航、气象预测等领域,“状态估计” 是核心任务 —— 即从含噪声的观测数据中,精准推断系统的真 ...
2025-10-23在数据分析全流程中,“数据清洗” 恰似烹饪前的食材处理:若食材(数据)腐烂变质、混杂异物(脏数据),即便拥有精湛的烹饪技 ...
2025-10-23在人工智能领域,“大模型” 已成为近年来的热点标签:从参数超 1750 亿的 GPT-3,到万亿级参数的 PaLM,再到多模态大模型 GPT-4 ...
2025-10-22在 MySQL 数据库的日常运维与开发中,“更新数据是否会影响读数据” 是一个高频疑问。这个问题的答案并非简单的 “是” 或 “否 ...
2025-10-22在企业数据分析中,“数据孤岛” 是制约分析深度的核心瓶颈 —— 用户数据散落在注册系统、APP 日志、客服记录中,订单数据分散 ...
2025-10-22在神经网络设计中,“隐藏层个数” 是决定模型能力的关键参数 —— 太少会导致 “欠拟合”(模型无法捕捉复杂数据规律,如用单隐 ...
2025-10-21在特征工程流程中,“单变量筛选” 是承上启下的关键步骤 —— 它通过分析单个特征与目标变量的关联强度,剔除无意义、冗余的特 ...
2025-10-21在数据分析全流程中,“数据读取” 常被误解为 “简单的文件打开”—— 双击 Excel、执行基础 SQL 查询即可完成。但对 CDA(Cert ...
2025-10-21在实际业务数据分析中,我们遇到的大多数数据并非理想的正态分布 —— 电商平台的用户消费金额(少数用户单次消费上万元,多数集 ...
2025-10-20在数字化交互中,用户的每一次操作 —— 从电商平台的 “浏览商品→加入购物车→查看评价→放弃下单”,到内容 APP 的 “点击短 ...
2025-10-20在数据分析的全流程中,“数据采集” 是最基础也最关键的环节 —— 如同烹饪前需备好新鲜食材,若采集的数据不完整、不准确或不 ...
2025-10-20在数据成为新时代“石油”的今天,几乎每个职场人都在焦虑: “为什么别人能用数据驱动决策、升职加薪,而我面对Excel表格却无从 ...
2025-10-18数据清洗是 “数据价值挖掘的前置关卡”—— 其核心目标是 “去除噪声、修正错误、规范格式”,但前提是不破坏数据的真实业务含 ...
2025-10-17在数据汇总分析中,透视表凭借灵活的字段重组能力成为核心工具,但原始透视表仅能呈现数值结果,缺乏对数据背景、异常原因或业务 ...
2025-10-17在企业管理中,“凭经验定策略” 的传统模式正逐渐失效 —— 金融机构靠 “研究员主观判断” 选股可能错失收益,电商靠 “运营拍 ...
2025-10-17在数据库日常操作中,INSERT INTO SELECT是实现 “批量数据迁移” 的核心 SQL 语句 —— 它能直接将一个表(或查询结果集)的数 ...
2025-10-16在机器学习建模中,“参数” 是决定模型效果的关键变量 —— 无论是线性回归的系数、随机森林的树深度,还是神经网络的权重,这 ...
2025-10-16在数字化浪潮中,“数据” 已从 “辅助决策的工具” 升级为 “驱动业务的核心资产”—— 电商平台靠用户行为数据优化推荐算法, ...
2025-10-16在大模型从实验室走向生产环境的过程中,“稳定性” 是决定其能否实用的关键 —— 一个在单轮测试中表现优异的模型,若在高并发 ...
2025-10-15