1.1 学术图表的基本概念
一句话:学术图表是给论文结论提供证据的视觉工具,本书开篇先讲图表类型。
学术图表是为论文结论(conclusion)提供证据的视觉方式。所以,论文作者为了产生强烈的视觉效果,应该通过分析实验数据,精心设计可视化图表。本书开篇先跟大家讲讲学术图表的类型。
通常学术论文中主要有三类图表,如

所示。流程示意图和数据展示图都是非常讲究技能的图表,本书重点讲解的是数据展示图。CynomolgusEPl upon implantation1.数据展示图:先根据数据绘制成图表,再将其导出生成图片,主要包括各种点线图、柱形图、饼图等统计图表,一般使用Excel、GraphPadPrism、SigmaPlot、Origin、MATLAB、Python、R等专业绘图软件绘制(Excel并非如大众所说不能导出高分辨率的图片和矢量图)。
注意,保存图片时,一定要保存成高分辨率的TIFF格式和EPS矢量格式的图片,因为矢量图片是可以使用图片处理软件进行再编辑的。由数据生成的图表是可重复修改的,因此一定要保存好原始数据,一旦发现图表有任何问题就可以进行修改。2.实验拍摄图:使用设备或者仪器拍摄采集的图片,包括显微镜、扫描仪及摄像机等所拍照片。
一定要在最刚开始时就拍成高清的(设置成高分辨率),也就是要保证原始图片的高分辨率,接下来处理图片就会比较方便,免得因为图片质量不佳而重复实验。必要的话,把每张图片存储成TIFF和JPG两种格式(以应对部分期刊的特殊要求)。3.流程示意图:使用简明的线条、基本图形和箭头等绘制论文中的重要的实验流程或步骤,用以说明基本原理或解释文字材料,一般使用PPT、Visio、Illustrator、CorelDRAW、3DMax等软件绘制。
1.1.1 学术图表的基本作用
一句话:图表是论文的门面——读者先看图再决定是否读正文,每张图要能独立看懂。
图表在学术论文中是很重要的一部分。实验结果通常是论文的核心和主要部分,而实验结果一般以图表的形式呈现。读者经常通过图表来判断这篇文章是否值得阅读,所以每个图表都应该能不依赖正文而独立存在。
所谓“一图抵千言”(Apictureiswortha thousandwords)。图表设计是否精确且合理直接影响数据的完整与准确表达,从而影响论文的质量。图表是期刊评审过程中仅次于摘要的关键一环,准确而美观的图表能促进审稿人和读者对论文表达的快速理解。
以Nature上的文章

),我们首先关注的是论文的标题(title),其次是第一页最开始的摘要(abstract),接下来我们就被这些包含大量实验数据与信息的图表所吸引l。在每页的文章中,包含图名(figure)的图表部分几乎占据整个页面的1/4~1/3,由此可见图表在论文中的重要性。根据EdwardR.Tufte的TheVisualDisplayofQuantitativeInformation3和Visual Explanations4的阐述,图表在论文的作用主要有:(1)真实、准确、全面地展示数据:(2)以较小的空间承载较多的信息;(3)揭示数据的本质、关系、规律。
第三点作用尤为重要,MatthewO.Ward也提出,可视化的终极目标是洞悉蕴含在数据中的现象和规律,这包括多重含义:发现、决策、解释、分析、探索和学习。表1-1-1所示的原始数据是31组x-y的二维数据。仅仅只从数据的角度去观察数据,就很难发现x与y之间的具体关系。
将实际的数据分布情况使用二维可视化的方法呈现,如

所示,则可以快速地从数据中发现数据内在的模式与规律。所以,有时使用数据可视化的方法也可以很好地帮助我们去分析数据。Cotranslational signal-independentSRPpreloadingsecisio factonmuiprpery deondr he liedHmaiul&yictin In SRPxipI fcad,bd]表1-1-1四组二维数据点集(相同的x变量,不同的y变量:y1,y2,y3,y4)4.65.45.26.65.96.15.86.86.56.76.911.18.210.312.86.111.616.622.731.833.735.634.539.658.357.772.968.482.65.531.133.151.855.760.763.575.584.484.676.392.481.688.193.84.97.99.818.924.728.928.639.333.242.154.443.390.2川20.812.415.915.338.835.924.354.562.943.876.996.951.484.589.1102.168.196.3108.576.7107.6103.4116.5106.4142.5115.1110.5101.3107.4104.3110.7103.4113.6105.1112.5119.3113.7109.5108.7110.1118.881.290.870.966.867.588.6116.9141.4161.4101.8137.1175.3119.5257.3三
1.1.2 学术图表的基本类别
一句话:图表按色彩分彩色与黑白两类,多看Nature/Science/Cell等顶刊建立审美。
可以先通过国际顶级期刊的学术图表,如Science、Nature、Cell等(见


),了解优秀学术图表的基本类型与风格。图表从色彩运用的角度可以分成两大类:彩色图表与黑白图表。2.2
1.1.3 学术图表的绘制原则
一句话:每个期刊有自己的图表要求,投稿前先查目标期刊的《作者投稿指南》。
每个学术期刊都有自己对学术图表的基本要求,具体可以参考投稿期刊的《作者投稿指南》或AuthorGuidelines、AuthorInstructions。以Nature期刊为例,作者的投稿主页(submitmanuscript)如

所示,然后点击instructionsforauthors,就可以进入作者的投稿指南,其中就有对图表(figure)的要求,包括基本图表要求(generalfigureguideline)和终稿图表要求(finalfiguresubmissionguideline)两个部分。Welcome to the Nature online manuscript submission and tracking system.Pleasebe sure thatyour browser is set toaccept cookies,as our tracking system requires them forproper operation.Ifyou are a first-time user pleasereadourinstructions for authorsor instructionsforrefereesbefore logging in.Pleasenote that passwords are case sensitive.1Nature投稿主页:http://mts-nature.nature.com/cgi-bin/main.plex8IR语言数据可视化之美:专业图表绘制指南所以,学术图表首先要规范,符合期刊的投稿要求,然后在规范的基础上实现图表的美观和专业。在当前贯彻科技论文规范化、标准化的同时,图表的设计也应规范化、标准化。
总而言之,学术图表的制作原则主要是规范、简洁、专业和美观。1.规范:规范就是指学术图表符合投稿期刊的图表格式和分辨率方面的要求,这是绘制图表的一个基础条件。绘图时满足投稿期刊的图表要求,这样至少能满足期刊编辑的要求,不会立即被退稿、被要求修改图表格式,例如图表的单位、字体、坐标、图例、轴名等。
另外,期刊还会要求图表的分辨率和格式,一般要求RGB彩色图片的分辨率为300dpi及以上。2.简洁:学术图表的关键在于清楚地表达数据信息。RobertA.Day在How towriteandpublishascientificpaper[12)书中指出:Combined or not,each graph should be as simple aspossible(如果—张学术图表包含的数据信息太多,反而让读者难以理解自己所要表达的数据信息)。
所以,学术图表应尽量简洁、清楚地表达数据信息。考虑到期刊的印刷成本,学术图表的尺寸也要尽量以较小的空间承载较多的信息,但也不要太小到无法看清图表的文字。3.专业:图表类型的选择是做好图表的重要基础。
专业就是指图表要能全面地反映数据的相关信息。当我们获得足够的实验数据后,需要重点思考的就是选择哪种图表能更加全面地表达数据信息。比如,同样是多次重复实验获得的数据,带误差线的散点图、带误差线的柱形图、箱形图等图表类型的选择就是我们要重点考虑的问题。
4.美观:图表美观是做好图表的一个重要条件。美观是指学术图表要简洁且具有美感。图表的配色、构图和比例等是影响图表美观的主要因素。
但是由于大部分理工科的学生平时缺乏审美能力的训练,所以这也是许多学术图表缺乏美感的主要原因。
1.2 你为什么要选择R
一句话:各学科软件不同(MATLAB/Origin/Stata等)但绘图思想相通;R免费、可编程、可复现。
“工欲善其事,必先利其器”,学术绘图软件的选择与使用特别重要。不同学科的研究人员使用的软件有所不同,但是基础的绘图思想与理念是相通的(这部分会在后面的章节讲解)。具有工科背景的人员常使用MATLAB,具有计算机背景的人员常使用Python,具有统计学科背景的人员常使用R,具有医学背景的人员常使用GraphPadPrism等。
常用的学术图表绘制软件包括Excel、Origin、SigmPlot、GraphPadPrism、MATLAB、Python、R等,如

所示。每个绘图软件的图表都有不同的图表风格。笔者列出了常用的7款学术图表绘图软件,如表1-2-1所示。
从技能要求的角度主要可以分为两大类:编程与界面操作。表1-2-1常用绘图软件的性能对比名称开源付费技能要求官方网站否是界面操作https://support.office.com/en-GB/Excel否是界面操作否是界面操作https://systatsoftware.com/products/sigmaplot/否是界面操作否是编程https://www.mathworks.com/products/matlab.html是否编程是否编程https://www.r-project.org像Excel、Origin、SigmaPlot、GraphPadPrism这4款软件,就不需要编程,只要点击界面按钮就可以绘制图表。尽管这些工具都非常容易使用,但也存在一些缺憾。
只需鼠标操作无疑十分便捷,但随之而来的却是丧失一些灵活性。你可以改变颜色、字体和标题,但仅限于软件所提供的那些元素。这些软件只能由你去适应它的操作规则,让你使用现有的图表,而并不能创造新的图表。
像MATLAB、Python和R这3款软件,则需要编程才能实现图表的绘制。这些软件本身包含很多数据可视化的函数(function)或者包(package),供用户绘图时使用。尤其针对不同的数据集需要重复操作的情况,如果使用界面绘图软件,则可能需要从头到尾将绘图流程重新实现一遍,而相比之下,通过代码来处理数据就会更加容易,因为针对不同的数据集只需稍微改动一下代码就可以解决。
如果你充分掌握代码与算法,那你也可以自己编写函数设计新颖的图表。相较于其他的所有软件,R的优势之一在于,它是专为数据分析而设计的,它是主要用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。
R语言有一系列的数据可视化包,包括ggplot2及ggplot2拓展包、lattice、leaflet、playwith、ggvis、ggmaps。R还提供了部分地图绘制功能,地区数据分析提供了有关地区分析的综合性R工具包列表。另外,用户可以下载《地理统计制图实用指南》4—关于如何使用R及其他工具分析空间数据的可免费下载的电子书。
Python是一种面向对象的解释型计算机程序设计语言。Python具有丰富和强大的库。它常被昵称为“胶水语言”,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。
程序员们戏称“人生苦短,要学Python”,现在Python越来越流行,尤其应用在机器学习、机器视觉、深度学习、网络爬虫等方面。Python语言也有一系列的数据可视化包,包括Pandas、Plotnine、matplotlib、Seaborn°、ggplot、Bokeh、Pygal等。其中Plotnine包是参考Rggplot2图形语法实现的可视化包。
虽然Python越来越流行,但是在数据可视化方面与R还是有很大差距的。MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析,以及数值计算的高级技术计算语言和交互式环境。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通信、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB软件本身就提供了很多绘1ggplot2包的官网:http://docs.ggplot2.org/current2ggplot2extensions拓展包的官网:http://www.ggplot2-exts.org/index.html3http://cran.r-project.org/web/views/Spatial.html4http://spatial-analyst.net/book/download5Plotnine包的官网:https://plotnine.readthedocs.io/en/stable6Seaborm包的官网:https://seaborn.pydata.org7Python语言的数据可视化包:http://pbpython.com/visualization-tools-1.html图函数,可以满足数据可视化的基本需求。但是还有另外两款MATLAB绘图包很值得推荐使用:PlotPub²和Gramm,其中,Gramm包是在MATLAB中实现了Rggplot2的绘图风格,大大提高了MATLAB绘图的美观程度。SigmaPlot是一款最佳的科学绘图软件!
使用SigmaPlot画出精密的图形是件极容易的事,目前已有超过十万的使用者,特别适合科学家使用。本软件允许用户自行建立任何所需的图形,可插入多条水平轴或垂直轴,指定误差棒(errorbar)的方向,让你的图更光彩耀眼,只要用SigmaPlot将图制作完成即可动态连接给其他软件展示使用,并可输出成EPS、TIFF、JPEG等图形格式,或放置于网站上以供浏览。非常适合网站动态显示图形,使用场合如长时间记录的气象、温度等。
Origin为OriginLab公司出品的较流行的专业函数绘图软件,是公认的简单易学、操作灵活、功能强大的软件,既可以满足一般用户的制图需要,也可以满足高级用户数据分析、函数拟合的需要。Origin自1991年问世以来,由于其操作简便、功能开放,很快就成为国际流行的分析软件之一,是公认的快速、灵活、易学的制图软件。Origin2017版本增加了许多颜色主题方案,可以大大改进图表的美观程度。
GraphPadPrism是一款集数据分析和作图为一体的数据处理软件,尤其适合生物医学类,可以直接输入原始数据获得高质量的科学图表。它在统计分析上劣于SPSS等统计软件,但是不需要输入程序语言,只需输入原始数据,其操作容易、绘图美观。可与PPT、Word相连接。
几乎所有人都知道这款软件。MicrosoftExcel是微软公司的办公软件MicrosoftOffice的组件之一,是由Microsoft为Windows和AppleMacintosh操作系统的电脑而编写和运行的一款电子表格软件。Bxcel是微软办公套装软件的一个重要组成部分,它可以进行各种数据的处理、统计分析和辅助决策操作,广泛地应用于管理、统计财经、金融等众多领域。
Excel能实现大部分二维图表的绘制与基础的数据处理与分析,具体可以参考学习《Excel数据之美:科学图表与商业图表的绘制》。1MATLAB软件数据可视化库:https://cn.mathworks.com/products/matlab/plot-gallery.html2PlotPub包的官网:https://github.com/masumhabib/PlotPub3Gramm包的官网:https://github.com/piermorel/gramm实例分析为更好地了解这7款绘图软件的风格,现采用相同的数据集合,分别绘制了散点图、曲线图、(堆积)柱形图和箱形图4种图表类型,如


所示。(1)
由Rggplot2绘制,其图表风格最为独特与美观,这种图表在部分论文中也是有直接使用的。使用Rggplot2Set3的颜色主题,绘图区背景填充颜色为RGB(229,229,229)的灰色,以及白色的网格线[主要网格线的颜色为RGB(255,255,255),次要网格线的颜色为RGB(242,242,(2)

由PythonSeabom绘制,其图表风格也很有特色,使用Seabom包的颜色主题方案,绘图区背景填充颜色为RGB(234,234,242)的淡蓝色,以及RGB(255.255,255)的白色的主要网格线(无次要网格线)(3)

是使用MATLAB2014b通过编程绘制的图表,使用MATLAB默认的颜色主题方案Parula,网格线设定为“无”。MATLAB通过函数(function)直接绘制的图表,可以通过图表编辑器对图表进行优化,但是也并不能实现箱形图颜色的填充。如果MATLAB使用Gramm包,则可以绘制更加美观的图表。


分别对应SigmaPlot、Origin和GraphPadPrism绘制的图表,这是最为常见的学术图表。它们的图表风格基本相同:绘图区背景填充颜色为RGB(255,255,255)的白色,这样可以使背景不太复杂,尤其适应于图表尺寸较小时,可以保证数据的清晰展示;这些图表使用绘图软件的默认颜色主题,由于不同软件的颜色主题不同,即便是相同的图表样式,也会导致图表的美观存在较大的审美差异。(5)
是使用Excel绘制的图表,使用Excel默认颜色主题方案“Office2007-2010”。Excel2016添加了几种新型图表类型,包括矩形树状图、箱形图等:Excel2013及以前版本只能通过堆积柱形图间接地实现箱形图。第1章R语言编程与绘图基础25004500650085001050012500图1=2-3PythonSeabom图表实例0.80.6福Good Very GoodPremum deal在这么多种绘图软件中,我们为什么要选择R呢?
首先因为R是开源的,可以免费使用。其次,R是一套完整的数据处理、计算和制图软件系统。其功能包括:数据存储和处理系统、数组运算工具、完整连贯的统计分析工具、优秀的统计制图功能。
尤其是R的ggplot2包及其拓展包以人性化的图形语法,可以快速帮助用户展示数据,并可以实现个性化的图表。另外,R还有很多其他绘图包,比如可以绘制三维图表的plot3D包等,几乎可以帮助用户绘制所有常见的图表类型。但是,绘图软件只是使用的一个工具而已。
归根结底,对数据的分析和图表的设计取决于你自己。如果你打算深入研究数据,而且日后可能(或者希望日后)还会接触大量与数据相关的项目,那么现在花些时间学习编程最终会节省其他项目的时间,并且作品也会给人留下更加深刻的印象。你的编程技巧会在每一次项目中获得提高,你会发现编程越来越容易。
心中有剑,落叶飞花,皆是兵器!
1.3 R软件的安装与使用
一句话:R在CRAN免费下载,三大平台都能装,配合RStudio使用体验最佳。
1.3.1 R与RStudio的安装
一句话:R和RStudio按官方说明安装即可,装好后先学安装/加载包。
1.R的获取和安装R可以在CRAN(ComprehensiveRArchiveNetwork)上免费下载。Linux、mac()Sx和Windows都有相应编译好的二进制版本,根据你所选择平台的安装说明进行安装即可。本书所用R3.3.3版本。
有时候有些代码运行可能会由于R或者R包的版本,出现函数弃用(deprecated)的情况。此时,需要自己更新代码,使用新的函数替代原有的函数等。2.RStudio的获取与安装虽然现在有很多可用的IDE(集成开发环境),但是在这里推荐使用JJAllaire小组设计的RStudio。
我们可以去RStudio官网下载免费版本RStudioDesktop。RStudio的通用界面如

所示。另外,在RStudio中可以使用installr包的updateR()更新R版本:installr:updateR()。1更多绘图工具可参考:https://keshif.me/demo/VisTools2http://cran.r-project.org3https://www.rstudio.com/products/rstudio/download口FleEdit Code View Plots Session Build Debug Profle Tools Help色Scale_分折Rxgeom_point(size=4,shape-21,colour-"black",stroke-0.25)+scale_fill_manual(values=C(“red","blue","“green"))+text=element_text(size-14,co1or="b1ack"),pTot.title=element_text(size=14,family-"myfont",face=boTd.legend.background=eTement_bTank().1egend.position=c(0.85,0.15)geom_point(shape-21,co1our="b1ack",a1pha-0.95)scale_fi11_disti1ler(palette=Rdy1su",direction=-1)+scale_f11_gradfent2(Taw#oQao8A"mid-wite,highe#FFo0000.988strip.text=element_text(size-13,face-“plain",color="b1acktext-element_text(size-1z,face-"plain",color="black"),0.986axis.title=element_text(size-14,face="plain",color="black")axis.text=element_text(size-l1,face="plain",color="black"0.984Tegend.position=c(0.935,0.13)1egend.background=element_rect(fi11-alpha(“white",o))口Size0.984ConsoleF/m言据可视化之变/&硬2018_12.01/0.986如需使用与深入子习,请联杀信:
1.3.2 包的安装与加载
一句话:装包用install.packages(),加载用library(),换电脑跑代码先确认包齐。
1.包的安装如果拥有RStudio,那么最简单的方法是单击右下角写有“Packages”的选项卡,然后在弹出对话框中输入包的名称就可以。或者直接在左下角的“Console”控制台输入安装命令:install.packages("ggplot2")有时候需要直接从Github或BitBucket上下载安装包,这种方法可以得到包的开发版本,但是需要使用devtools包来完成:devtools:install_github(tidyverse/ggplot2")。2.包的加载既然包已经安装好,首先它需要被加载才能使用。
现在主要有两种函数可供选择:library()或者require(),比如:library(ggplot2)。有时候已经加载的包可能需要被卸载。这个可以简单地通过在RStudio的“Packages”界面消除复选框中的选项,或使用detach()函数:detach(package:ggplot2")
1.4 R语言编程基础
一句话:R区分大小写、#注释、分号或换行分隔语句——先掌握这些最基础语法。
R是一种区分字母大小写的解释性语言,R语句的分隔符是分号(;)或换行符。当语句结束时,可以不使用分号,R语言会自动识别语句结束的位置。R语言只支持单行注释,注释由#开头,当前行出现在#之后的任何文本都会被R解释器忽略。
R语句由函数和赋值构成。R使用<-,而不是传统的=作为赋值符号。R语言的数学运算跟我们平时的数学运算(加+,减-,乘*,除/)基本一致。
在这里,我们会重点讲解与R语言数据可视化相关的编程基础内容。
1.4.1 数据类型
一句话:数值/字符/日期/逻辑4种基本类型,用class()随时查看变量类型。
R语言有很多不同的数据类型,用于储存不同的数据。我们最常用到的4种数据类型为数值型(numeric)字符型(character)日期型(date)和逻辑型(logical)。变量中储存的数据类型都可以使用class()函数查看。
①数值型(numeric):
c_Year<-as.integer(strftime(c,96Y"))#输出年份:2012c_month<-as.integer(strftime(c,%m))#输出月份:6c_week<-as.integer(strftime(c%W))#输出周数:24
1.4.2 数据结构
一句话:向量、数据框、矩阵、列表、数组——画图最常用数据框(一行一个观测)。
常见的数据结构包括:向量(vector)数据框(data.frame)矩阵(matrix)列表(list)和数组(array)。其中,矩阵是将数据用行和列排列的长方形表格,它是二维的数组,其单元必须是相同的数据类型,通常用列来表示不同的变量,用行表示各个对象:数组可以看作是带有多个下标的类型相同的元素的集合:列表是一个对象的有序集合构成的对象,列表中包含的对象又称为它的分量(component),分量可以是不同的模式或(和)类型。我们在本书的数据可视化中,比较常用的是向量(因子属于特殊的向量)和数据框,所以我们重点介绍这两种类型的数据结构,还将介绍与数据可视化密切相关的函数。
1.向量向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c0可用来创建向量(c代表合并:combine)。值得注意的是,单个向量中的数据类型是固定的,比如数值型向量中的元素就必须全为向量。
量是R语言中最基本的数据结构,其他类型的数据结构都可以由向量构成。最常见的向量有三种类型:数值型、字符型、逻辑型。向量的创建有多种方法,我们既可以手动输入,使用函数c0创建向量;也可以使用现有的函数创建向量,比如seq()、rep()等函数,具体如表1-4-1所示。
表1-4-1向量的创建输入输出描述将元素连接成向量等差整数数列步长为0.5的等差数列将一个向量重复3次将一个向量中的每个元素重复3次均值为0、标准差为3的正态分布最大值为1、最小值为0的均匀分布从一个向量中随机抽取向量的排序。向量的排序和数据框的排序有时候对数据的展示尤为重要,很多时候我们需要对数据先进行降序处理,再展示数据。sort()函数可以实现对向量的排序处理,index.return=TRUE,表示返回排序的索引l:decreasing=TRUE,表示降序处理。
如下输出的结果order包括两部分:$x为[54321],$ix为[42351]
在需要对数据框根据某列进行分组运算时,需要使用该函数先获取类别总数
数据离散化最简单的方法就是使用cut()函数自定义离散区间,从而对数据进行离散处理
·整数型索引],选择某个或多个元素:x[2];x[-2];x[2:4];x[c(1,4)]·逻辑型索引1,逻辑运算选择元素:x[x>2];x[x==1];x[x<=5]2.因子因子(factor)是R语言中许多强大运算的基础,包括许多针对表格数据的运算,可分为类别型变量和有序型变量。因子可以看成是包含了额外信息的向量,这额外的信息就是不同的类别,称之为水平(level)。因子在R中非常重要,因为它决定了数据的分析方式,以及如何进行视觉呈现。
一个因子不仅包括分类变量本身,还包括变量不同的可能水平(即使它们在数据中不出现)。因子函数factor()用下面的选项创建一个因子。对于字符型向量,因子的水平默认依字母顺序创建:(Fair,Good,Ideal,Premium,Very Good)Cut<-c(Fair","Good""Very Good","Premium","Ideal")Cut_Facor1<-as.factor(Cut)很多时候,按默认的字母顺序排序的因子很少能够让人满意。
因此,可以指定levels选项来覆盖默认排序。更改因子向量的levels为("Good","Fair”,"VeryGood","Ideal","Premium"),就需要使用factor()函数更改levels
有时候我们需要将数值型的因子向量重新转换成数值型向量,这时,我们需要使用as.numeric(as.character())组合函数,而不能直接使用as.numeric()函数。其中as.character()函数表示将向量变成字符型,as.numeric()函数表示将向量变成数值型
数据框是由多个向量构成的,每个向量的长度相同。数据框类似矩阵,也是一个二维表结构。在统计学术语中,用行来表示观测(observation),用列来表示变量(variable)。
创建数据框,最简单的方法就是,用同名的定义函数data.frame(),输入每个变量的名称及对应的向量,每个向量的长度相同。一个数据框可能包含多个变量(向量),有时需要单独提取某个变量,使用特殊的$符号来访问,由“数据框$变量名”构成。数据框数据的选取如表1-4-2所示。
表1-4-2数据框数据的选取语句示例语句示例数据框的构建:选取某一列:选取多列:选取某一行:选取多行:选取某个元素:获取数据框的行数、列数和维数:nrow()、ncol()、dim()。获取数据框的列名或行名:names()、rownames()、colnames();重新定义列名:names(df)<-c("X",观察数据框的内容:view(df)、head(df,n=3)、tail(df)。创建空数据框,在需要自己构造绘图的数据框数据信息时尤为重要。
有时候,绘制复杂的数据图表的过程中,我们需要对现有的数据进行插值、拟合等处理时,需要使用空的数据框储存新的数据,最后使用新的数据框绘制图表。创建空的数据框主要有如下两种方法。创建一个名为Df Empty,包括两个变量(var_a为numeric类型;var_b为character类型)的data.frame。
但是注意:要加上stringsAsFactors=FALSE,否则在后面逐行输入数据时,会因为varb的取值未经定义的factorlevel而报错
1.4.3 数据属性
一句话:数据框由多列不同属性的变量组成,画图前先弄清每列是什么类型。
数据框作为R语言数据分析与可视化很常用的数据结构,常由多列不同数据属性的变量组成。在我们实现数据可视化时,很有必要先了解这些变量的属性。我们平时记录的实验数据所用的表(table)就是由一系列不同属性的变量组成的。
Jiawei Han等人的Data mining:concepts andtechniques3根据数据属性取值的集合类型,对数据属性进行了分成三类:类别型、序数型和数值型,如

所示。Pang-NingTa等人的IntroductiontoDataMining14,将序数型和类别型数据统称为类别型(categorical)或者定性型(qualitative),将数值型(numeric)也称为定量型(quantitative)。类别型序数型数值型1.类别型类别型属性(categoricalattribute)是用于区分不同数据对象的符号或名称,而它们是没有顺序关系的,又包含多元类别和二元类别两种类型。
对于多元类别,可以理解为购买服装时的不同服装名称,如衬衫、毛衣、T恤、夹克等;对于二元类别,可以理解为购买服装时的不同性别,只有男士和女士两种性别分类。类别型数据的可视化一般使用标尺类中的分类尺度。2.序数型序数型属性(ordinalattribute)的属性值是具有顺序关系,或者存在衡量属性值顺序关系的规则。
比如常见的时序数据,就一般是按时间先后排序的:还有就是平时调查问卷中经常使用的5个喜欢程度:非常喜欢、比较喜欢、无所谓、不太喜欢、非常不喜欢。序数型数据的可视化一般使用标尺类中的顺序尺度和时间尺度两种类型。序数型数据的排列方向有三种,分别是单向型(sequential),有公共零点的双向型(diverging),以及环状周期型(cyclic),如


所示。单向型双向型环状周期型3.数值型数值型属性(numericattribute)使用定量方法表达属性值,如整数或者实数,包括区间型数值属性(interval-scaledattribute)和比值型数值属性(ratio-scaledattribute),如表1-4-3所示。区间型与比值型数值最大的区别就是有无基准点,通常为零点(intermalzero-point)。
比值型数值属性的数据一般拥有基准点,比如开氏温标(K)以绝对零度(0K=273.15℃)为其零点,以及平时通常使用的数量、重量、高度和速度等。而区间型数值属性的数据的起始值一般是在整个实数区间上取值,可进行差异运算,但不能进行比值运算。比如摄氏温标(°C)与华氏温标(F)下的温度、日历中的年份、经度(longitude)与纬度(latitude),它们都没有真正的零点。
在日历中,0年并不对应时间的开始,但0°C并不代表没有温度。所以可以说10℃比5℃温度高(差异运算),但是不能说10℃是5℃的2倍(比值运算)。表1-4-3包含不同数据属性的变量组合表13]对象标识test-1(类别型)test-2(序数型)test-3(区间型数值型)test-4(比值型数值型)产品-A非常喜欢2002(年)产品-B比较喜欢2003(年)产品-C无所谓2005(年)产品-A不太喜欢2007(年)我们也可以用值的个数区分数据类型,可以分为离散型和连续型4。
离散型属性具有有限个值或者无限个值,这样的属性可以是分类的,也可以是数值型的。其中二元属性(binaryattribute)是离散型属性的一种特殊情况,并只接受两个值,比如True/False(真/假)Yes/No(是/否)Male/Female(男/女),以及0/1。通常二元属性使用布尔变量表示,或者只取0和1两个值的整数变量表示。
连续型属性是取实数值的属性,通常使用浮点数变量表示。理论上讲,基于数据集合类型划分的数据类型(类别型、序数型和数值型)可以与基于属性值个数的任意类型(离散型和连续型)组合,从而不同的数据可能有不同的数据属性组合。
1.4.4 数据的导入导出
一句话:read.csv()导入CSV最常用,Excel/SQL等格式也有对应函数,处理完可导出。
1.数据文件的导入与导出我们常用外部保存的数据文件来绘制图表。此时,就需要借助可以导入数据的函数导入不同格式的数据,包括CSV、TXT,以及Excel、SQL、HTML等数据文件。有时候,我们也需要将处理好的数据从R语言中导出保存。
其中,我们在数据可视化中使用最多的就是前3种格式的数据文件。(1)CSV格式数据的导入与导出使用read.csv()函数,可以导入CSV格式的数据,并存储为数据框形式。需要注意是:当stringsAsFactors=TRUE时,R会自动将读入的字符型变量转换成因子,但是这样很容易导致数据只按默认字母顺序展示。
在导入大批量数据时,为了提高性能,尽可能分两步走:①显式指定“stringsAsFactors=FALSE”;②依次将所需要的数据列(向量)转换为因子。使用write.csv()函数,可以将data.frame的数据存储为CSV文件write.csv(mydata.file="File.csv")CSV文件主要有以下3个特点。①文件结构简单,基本上和TXT文本的差别不大;②可以和Excel进行转换,这是一个很大的优点,很容易进行查看模式转换,但是其文件的存储大小比Excel小。
③由于其简单的存储方式,一方面可以减少存储信息的容量,这样有利于网络传输以及客户端的再处理;另一方面,由于是一堆没有任何说明的数据,其具备基本的安全性。所以相比TXT和Excel数据文件,我们更加推荐使用CSV格式的数据文件进行导入与导出操作。(2)TXT格式数据的导入与导出使用read.table()函数不仅可以导入CSV格式的文件数据,还可以导入TXT格式的文件数据,并存储为数据框数据。
mydata<-read.table("Data.txt"header =TRUE)使用write.table()函数可以将data.frame的数据存储为CSV文件:write.table(mydata,file=“File.txt")(3)Excel格式数据的导入与导出使用xlsx包的read.xlsx()函数和read.xlsx20函数可以导入XLSX格式的数据文件。但是更推荐使用CSV格式导入数据文件
但是如果有时候导入的数据表格是二维数据列表,那么我们需要使用reshape2包的melt()函数或者tidyr包的gather()函数,可以将二维数据列表的数据框转换成一维数据列表。一维数据列表和二维数据列表的区别一维数据列表就是由字段和记录组成的表格。一般来说字段在首行,下面每一行是一条记录。
一维数据列表通常可以作为数据分析的数据源,每一行代表完整的一条数据记录,所以可以很方便地进行数据的录入、更新、查询、匹配等,如


所示。二维数据列表就是行和列都有字段,它们相交的位置是数值的表格。这类表格一般是由分类汇总得来的,既有分类,又有汇总,所以是通过一维数据列表加工处理过的,通常用于呈现展示,如
图1-4-4
所示。一维数据列表也常被称为流水线表格,它和二维数据列表做出的数据透视表最大的区别在于“行总计”。判断数据是一维数据列表还是二维数据列表的一个最简单的办法,就是看其列的内容:每一列是否是一个二维数据列表独立的参数。
如果每一列都是独立的参数那就是一维数据列表,如果每一列都是同类参数那就是二维数据列表。注意为了后期更好地创建各种类型的数据透视表,建议用户在数据录入时,采用一维数据列表形式的进行数据录入,避免采用二维数据列表的形式对数据进行录入。1更多关于xlsx包的使用可参考:https://github.com/colearendt/xlsx2.缺失值的处理有时候,我们导入的数据存在缺失值。
另外,在统计与计算中,缺失值也起着至关重要的作用。R语言中主要有两种类型的缺失数据:NA和NULL。在R中,使用NA代替缺失数据作为向量中的另外一种元素出现。
我们可以使用is.na()函数来检查向量或数据框中的每个元素是否缺失数据。我们先构造一个含有缺失数据的数据框,然后讲解使用tidyr包实现常用的缺失数据的处理方法,如表1-4-4所示。表1-4-4缺失值的处理代码示意直接删除带NA的行:使用最邻近的元素填充NA:使用指定的数值替代NA:NULL就是没有任何东西,表示数据的空白,而并非数据的缺失,也不能成为向量或者数据框的一部分。
在函数中,参数有可能是NULL,返回的结果也可能是NULL。我们可以使用is.null()函数判定变量是否为NULL。
1.4.5 控制语句与函数编写
一句话:if...else判断、for/while循环配合自定义函数,批量处理数据。
我们常用的控制语句包括if...else、ifelse条件语句,以及for和while循环语句。其中我们最常见的就是if.else,主要用于检查判定。其条件最基本的检查包括等于(=)小于(<)小于等于(<=)大于(>)大于等于(>=)和不等于(!
=)。if...else语句对数据的操作运算命令都需要放在里面。需要注意的是:else跟在其左边的大括号“”必须在同一行,否则程序无法识别,会导致代码运行错误。
另外,R语言还有一个ifelse()语句,可以向量化if语句,从而加速代码的运行,如表1-4-5所示的if.else条件语句可以使用ifelse()重写为:ifelse(i>3,print(Yes),print(No)。该语句可以结合transform()函数等对数据框的每个元素进行判别运算,从而生成新的列。我们最常用的循环是for循环,for循环的向量不一定是连续型的,也可以是其他类型的向量,如表1-4-6所示的for循环示例。
其中,1:4的输出起点为1、终点为4、步长为1的等差数列向量(1,2,3,4),效果类似于seq(1,4,1)。另外,while循环虽然没有for循环用得普遍,但是更加易于操作。但对新手来说,容易由于设定的循环条件有误而导致循环不停迭代,从而陷入“死循环”。
表1-4-5控制语句类别if...else条件语句for循环语句while循环语句条件变量执行语句来自向常的下一个变量示意条件为True条件为True执行语句条件为Faise条件执行语句向量中的变量遍历完毕条件为False执行语句语法执行语句执行语句其他执行语句示例输出我们在实现数据可视化时,更多是使用现有包的函数,比如等差数列生成函数seq()、向量排序函数sort()、插值函数spline()等,而很少需要自定义函数(表1-4-6为各种自定义函数的语法格式)。我们更加需要了解的是现有函数的输入参数与数据的结构、输出参数的数据内容等,比如plot3D包的persp3D0函数和lattice包的wireframe()函数都可以绘制相同的三维曲面图,但是persp3D0函数要求输入的数据是向量与矩阵形式,而wireframe()函数要求输入的数据是数据框。表1-4-6自定义函数自定义函数的语法示例函数名<-function(参数){执行语句函数名<-function(参数1,参数2)执行语句函数名<-function(参数1,参数2){执行语句
1.5 R语言绘图基础
一句话:R有base和grid两套底层图形系统,lattice和ggplot2都基于grid构建。
在R里,主要有两大底层图形系统,一是base图形系统,二是grid图形系统。lattice包与ggplot2包正是基于grid图形系统构建的,它们都有自己独特的图形语法。grid图形系统可以很容易地控制图形基础单元,给予编程者创作图形极大的灵活性。
grid图形系统还可以产生可编辑的图形组件,这些图形组件可以被复用和重组,并能通过grid.layout()等函数,把图形输出到指定的位置上。但是因为grid包中没有提供生成统计图形及完整绘图的函数,因此很少直接采用grid包来分析与展示数据。lattice包通过一维、二维或三维条件绘图,即所谓的栅栏(trellis)图来对多元变量关系进行直观展示。
相比于base()函数是直接在图形设备上绘图的,lattice()函数是返回trellis对象。在命令执行的时候,栅栏图会被自动打印,所以看起来就像是lattice()函数直接完成了绘图5]。更多关于base、grid和lattice的语法可以参考Murrel和Paul所撰写的书籍Rgraphics]ggplot2包则基于一种全面的图形语法,提供了一种全新的图形创建方式,这套图形语法把绘图过程归纳为数据(data)转换(transformation)、度量(scale)、坐标系(coordinate)、元素(element)指引l(guide)显示(display)等一系列独立的步骤,通过将这些步骤搭配组合,来实现个性化的统计绘图。
于是,得益于该图形语法,HadleyWickham所开发的ggplot2包是如此人性化,不同于Rbase基础绘图和先前的lattice包那样参数繁多,而是槟弃了诸多烦琐细节,并以人性化的思维进行高质量作图。在ggplot2包中,加号(+)的引l入是革命性的,这个神奇的符号完成了一系列图形语法叠加[16.17。更多ggplot2的使用与学习可以参考两本关于ggplot2的经典书籍:ggplot2ElegantGraphicsfor Data Analysis [16]和R GraphicsCookbookl17]R语言基础安装中就包含base、grid和lattice三个包,无须另外下载。
但是除了base包,其他包依旧需要使用library()函数加载后,才能被使用。使用base、lattice和ggplot2包绘制的散点图、统计直方图和箱形图,如

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
df<-read.csv("Facet_Data.csv", header = TRUE)
#-------------------------base----------------------------
plot(df$SOD, df$tau)#,pch=21,lty=0.25,col="grey10")
hist(df$SOD,breaks =30,ylim=c(0,40),main = "")
boxplot(SOD~Class,data=df,xlab="Class",ylab="SOD")
#----------------------------lattice---------------------------
library(lattice)
p1<-xyplot(SOD~tau,df,col="black")
p2<-histogram(~SOD,df,type="count",nint=30,col="white")
p3<-bwplot(SOD~Class,df,xlab="Class",
par.settings = canonical.theme(color = FALSE))
library(gridExtra)
grid.arrange(p1,p2,p3, ncol = 3, nrow = 1)
#-------------------------ggplot2----------------------------
library(ggplot2)
p1<-ggplot(df, aes(x=SOD,y=tau)) +
geom_point() #shape=21,color="black",fill="red",size=3,stroke=0.1
p2<-ggplot(df, aes(SOD)) +
geom_histogram(bins=30,colour="black",fill="white")
p3<-ggplot(df, aes(x=Class,y=SOD)) +
geom_boxplot()
library(gridExtra)
grid.arrange(p1,p2,p3, ncol = 3, nrow = 1)


所示。7.06.56.05.55.55.05.05.04.55.05.56.04.55.56.06.56.56.56.56.06.05.55.55.05.04.54.5Control Impaired Uncertain5.55.55.05.05.56.06.55.05.56.06.5使用base、lattice和ggplot2包绘制的散点图、统计直方图和箱形图的具体代码如表1-5-1所示。df是一个包含SOD、tau和Class(Control、Impaired和Uncertain)三列的数据框。
其中,base和lattice语法最大的问题就是参数繁多、条理不清。而ggplot2语法相对来说很清晰,可以绘制很美观的个性化图表。本书将会以图表类型为线索,详细地介绍常用图表的绘制方法,以ggplo2图形语法为主,但是有时候也会使用base和lattice等图形语法。
表1-5-1不同图形语法的代码示例图形语法散点图统计直方图箱形图par.settings=canonical.theme(colorgeom_histogram(bins=30.colou
1.6 ggplot2图形语法
一句话:ggplot2是"图形语法"(grammar of graphics),用图层方式组合出任何图表。
ggplot2是一个功能强大且灵活的R包,由HadlyWickham编写,它可以生成优雅而实用的图形。ggplot2中的gg表示图形语法(grammarofgraphic),这是一个通过使用“语法”来绘图的图形概念。ggplot2主张模块间的协调与分工,整个ggplot2的语法框架如











#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
#library(RColorBrewer)
#library(reshape2)
df<-read.csv("MappingAnalysis_Data.csv", header = TRUE)
#--------------------------------------Size---------------------------
ggplot(data=df, aes(x=Time,y=value,group=variable)) +
geom_line()+
geom_point(shape=21,size=4,colour="black",fill="white") +
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable)) +
geom_line()+
geom_point(shape=21,size=4,colour="black") +
scale_fill_manual(values=c("grey60","grey30","black","white"))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------shape---------------------------
ggplot(data=df, aes(x=Time,y=value,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black",fill="grey60") +
scale_shape_manual(values=c(21,22,23,24))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable)) +
geom_line()+
geom_point(shape=21,size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("grey60","grey30","black","white"))+
scale_shape_manual(values=c(21,22,23,24))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
所示,主要包括数据绘30IR语言数据可视化之美:专业图表绘制指南图部分与美化细节部分。Rggplot2图形语法的主要特点如下所示。(1)采用图层的设计方式,有利于结构化思维实现数据可视化。
有明确的起始(ggplot()开始)与终止,图层之间的叠加是靠“+”实现的,越往后,其图层越在上方。通常一条geomxxx()函数或statxxx()函数可以绘制一个图层。(2)将表征数据和图形细节分开,能快速将图形表现出来,使创造性的绘图更加容易实现。
而且通过statxxx()函数将常见的统计变换融入绘图中。(3)图形美观,扩展包(extensionpackage)丰富,有专门调整颜色(color)、字体(font)和主题(theme)等辅助包。可以帮助用户快读定制个性化的图表。
几何图层(统计变换)坐标系转换度量调整分面系统图例调整图表主题设定坐标轴度量调整Linetype视觉通道映射数据标签的添加dodge位置调整参数图表元素度量调整添加自定义注释标题、副标题、备注数据美化ggplot2的绘图基本语法结构如









#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(RColorBrewer)
library(reshape2)
df<-read.csv("MappingAnalysis_Data.csv", header = TRUE)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
scale_x_continuous(name="Time(d)",breaks=seq(0,20,2))+
scale_y_continuous(breaks=seq(0,90,10),limits=c(0,90),expand =c(0, 1))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
legend.background = element_rect(fill="white"),
legend.position="right"
)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
scale_x_continuous(name="Time(d)",breaks=seq(0,20,2))+
scale_y_continuous(breaks=seq(0,90,10),limits=c(0,90),expand =c(0, 1))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
所示。其中所需的图表输入信息如下所示。(1)ggplot():底层绘图函数。
DATA为数据集,主要是数据框(data.frame)格式的数据集;MAPPINGS变量的视觉通道映射,用来表示变量x和y,还可以用来控制颜色(color)大小(size)或形状(shape)等视觉通道;STAT表示统计变换,与statxxx()相对应,默认为"identity”(无数据变换):POSITI()N表示绘图数据系列的位置调整,默认为"identity"(无位置调整),关于POSITI()N的具体内容可见节。(2)geom_xxx()丨stat_xxx():几何图层或统计变换,比如常见的geom_point()(散点图)geom_bar()(柱形图)geom_histogram()(统计直方图)geom_boxplot()(箱形图)、geomline()(折线图)等。我们通常使用geomxxx()函数就可以绘制大部分图表,有时候通过设定stat参数可以先实现统计变换。
可选的图表输入信息包括如下5个部分,主要是实现图表的美化与变换等。(1)scalexxx():度量调整,调整具体的度量,包括颜色(color)大小(size)或形状(shape)等,跟MAPPINGS的映射变量相对应;(2)coordxxx():坐标变换,默认笛卡儿坐标系,还包括极坐标系、地理空间坐标系等;(3)facetxxx():分面系统,将某个变量进行分面变换,包括按行、列和网格等形式分面绘图,这部分内容具体可见节。(4)guides():图例调整,主要包括连续型和离散型两种类型的图例。
(5)theme():主题设定,主要用于调整图表的细节,包括图表背景颜色、网格线的间隔与颜色等。必须#基础图层,不出现图形元素#几何图层或统计变换,出现图形元素coordxxx()+#坐标变换,默认笛卡儿坐标系facetxxx+#分面系统、将某个变量进行分面变换可选+#图例调整#主题设定
1.6.1 geom_xxx()与 stat_xxx()
一句话:geom_xxx()几何对象画形状(点/线/面),stat_xxx()统计变换算数据(如密度),常配合使用。
1.geom_xxx():几何对象函数R中的ggplot2包包含几十种不同的几何对象函数geom_xxx(),以及统计变换函数stat_xxx()。平时,我们主要使用几何对象函数geom_xxx(),只有当绘制图表涉及统计变换时,我们才会使用统计变换函数statxxx(),比如绘制带误差线的均值散点图或柱形图等。geom_point()函数绘制散点图与气泡图如
函数的绘制过程.png)
所示,ggplot2默认使用直角坐标系。数据坐标系数据坐标系图表:气泡图图表:散点图根据函数输入的变量总数与数据类型(连续型或离散型),我们可以将大部分函数大致分成3个大类,6个小类,如表1-6-1所示,但是有两类函数没有囊括在此表中。(1)图元(graphical primitive)系列函数:geom_curve()、geom_path()、geom_polygon()、geom_rect()、geom_ribbon()、geom_linerange()、geom_abline()、geom_hline()、geom_vline()、geom_segment()、geom_spoke(),这些函数主要是用于是绘制基本的图表元素,比如矩形方块、多边形、线段等,可以供用户创造新的图表类型。
(2)误差(error)展示函数:geom_crossbar()、geom_errorbar()、geom_errorbarh、geom_pointrange()可以分别绘制误差框、竖直误差线、水平误差线、带误差棒的均值点。但是,这些函数需要先设置统计变换参数,才能自动根据数据计算得到均值与标准差,再使用其绘制误差信息。每个ggplot2函数的具体参数信息可以查看RStudio的“help”界面或者ggplot2的官方手册。
表1-6-1ggplot2函数的分类变量数类型函数常用图表类型geom_histogramOgeom_density()、geom_dotplot()连续型统计直方图、核密度估计曲线图geom_freqpoly()、geom_qq()、geom_area()离散型柱形图系列散点图系列、面积图系列、折线geom_point()、geom_area()、geom_line()、geom_jitter()图系列,包括抖动散点图、平滑x-连续型geom_smooth()、geom_label()、geom_text()、geom_bin2d0、曲线图、文本、标签、二维统计y-连续型geom_hex()、geom_density2dO、geom_map()、geom_step()直方图、二维核密度估计图、地理空间图表x-离散型箱形图、小提琴图、点阵图、统geom_boxplot()、geom_violin()、geom_dotplot()、geom_col()y-连续型计直方图x-离散型二维统计直方图y-离散型geom_contour(),geom_raster(),geom_tile()等高线图、热力图连续型2.stat_xxx():统计变换函数统计(stat)转换函数在数据被绘制出来之前对数据进行聚合和其他计算。statxxx()确定了数据的计算方法。不同方法的计算会产生不同的结果,所以一个stat()函数必须与一个geom()函数对应才1ggplot2的官方手册:https://ggplot2.tidyverse.org/reference/index.html能进行数据的计算,如
函数的绘制过程.png)
所示。在某些特殊类型的统计图形制作过程中(比如柱形图、直方图、平滑曲线图、概率密度曲线、箱形图等),数据对象在向几何对象的视觉信号映射过程中,会做特殊转换,也称统计变换过程。为了让作图者更好地聚焦于统计变换过程,将该图层以同效果的statxxx()命名可以很好地达到聚焦注意力的作用。
数据集geom:x=xy=..count.坐标系图表:直方图我们可以将geomxxx(几何对象)和statxxx(统计变换)都视作图层。大多是成对出现的geom_xxx()和stat_xxx()函数完成的,绘图效果也很相似,但并非相同。每一个图层都包含一个几何对象和一个统计变换,也即每一个以geomxxx开头的几何对象都含有一个stat参数,同时每一个stataxxx开头的几何对象都拥有一个geom参数。
但是为什么要分开命名呢,难道不是多此一举吗?以statxxx()开始的图层,在制作这些特殊的统计图形时,我们无须设定统计变换参数(因为函数开头名称已经声明),但需指定集合对象名称图表类型geom,就可以绘制与之对应的统计类型图表。这样需要变换geom()函数,就可以根据统计变换结果绘制不同的图表,可以使得作图过程更加侧重统计变换过程。
geom_xxx()绘制的图层,更加侧重图表类型的绘制,而通过修改统计变换参数,也可以实现绘图前数据的统计变换,比如绘制均值散点,下面语句(a1)和语句(b1)实现的效果都是一样的,语句(a1)是使用指定geom=point"(散点)的stat_summary()语句,而语句(b1)是使用指定(a1) ggplot(mydata,aes(Class,Value,fill =Class))+stat_summary(fun.y="mean",fun.args= list(mult=1),geom=“point”,color=“white”size=4)(b1)ggplot(mydata,aes(Class,Value,fill =Class))+绘制带误差线的散点图,下面语句(a2)和语句(b2)实现的效果也是一样的,语句(a2)是使用指定geom=”pointrange"(带误差线的散点)的stat_summary()语句,语句(b2)是使用stat="summary"的geom_pointrange()语句。(a2)ggplot(mydata,aes(Class,Value,fill =Class)+(b2)ggplot(mydata,aes(Class,Value,fill =Class))+geom_pointrange(stat="summary”,fun.data="mean_sdl",fun.args =list(mult=1),color =“black",size =1.2)其中,fun.data表示指定完整的汇总函数,输入数字向量,输出数据框,常见4种为:mean_cl_boot、mean_cl_normal、mean_sdl、median_hilow。fun.y表示指定对y的汇总函数,同样是输入数字向量,返回单个数字median或mean等,这里的y通常会被分组,汇总后是每组返回1个数字。
当绘制的图表不涉及统计变换时,我们可以直接使用geomxxx()函数,也无须设定stat参数,因为会默认stat=identity"(无数据变换)。只有涉及统计变换处理时,我们才需要使用更改stat的参数,或者直接使用statxxx()以强调数据的统计变换。
1.6.2 视觉通道映射
一句话:color/fill/size/linetype/shape等把变量映射到视觉特征——最核心的绘图概念。
R语言可用作变量的视觉通道映射参数主要包括color/col/colour、fill、size、angle、linetype、shape、vjust和hjust,其具体说明如下所示。需要注意的是,有些视觉通道调整参数只适应于类别型变量,比如linetype、shape。(1)color/col/colour、fill 和alpha 的属性都是与颜色相关的视觉通道映射参数。
其中,color/col/colour是指点(point)线(line)和填充区域(region)轮廓的颜色:fill是指定填充区域(region)的颜色;alpha是指定颜色的透明度,数值范围是从0(完全透明)到1(不透明)。(2)size是指点(point)的尺寸或线的(line)宽度,默认单位为mm,可以在geom_point()函数绘制的散点图基础上,添加size的映射从而实现气泡图。(3)angle是指角度,只有部分几何对象有,如geom_text()函数中文本的摆放角度、geom_spoke()函数中短棒的摆放角度。
(4)vjust和hjust都是与位置调整有关的视觉通道映射参数。其中,vjust是指垂直位置微调,在(0,1)区间的数字或位置字符串:0="buttom”,0.5="middle",1="top",区间外的数字微调比例控制不均:hjust是指水平位置微调,在(0,1)区间的数字或位置字符串:0="left",0.5="center",1=right”,区间外的数字微调比例控制不均。(5)linetype是指定线条的类型,包括白线(0="blank")实线(1="solid")短虚线(2="dashed")点线(3="dotted")点横线(4="dotdash")、长虚线(5="longdash")短长虚线(6="twodash")。
(6)shape是指点的形状,为[0,25]区间的26个整数,分别对应方形、圆形、三角形、菱形等26种不同的形状,如

所示。只有21~26号的点的形状有填充颜色(fill)的属性,其他都只有轮廓颜色(color)的属性。田12米8四14Rggplot2的geom_xxx()系列函数,其基础的展示元素可以分成四类:点(point)线(line)多边形(polygon)和文本(text),将表1-6-1中ggplot2的常见函数归类为如表1-6-2所示。
ggplot2“Console”控制台中输入:?函数名,比如:??
geom_point()。表1-6-2ggplot2常见函数的主要视觉通道映射元素geom_xxx()函数类别型视觉通道映射数值型视觉通道映射点geom_point()、geom_jitter()、geom_dotplot()等geom_line()、geom_path()、geom_curve()、线geom_densityOgeom_linerange()、geom_step()、geom_abline()、geom hline()等geom_polygonOgeom_rect()、geom_bar()多边形geom_ribbon()、geom_area()、geom_histogram()geom_violino等文本

library(ggplot2)
df<-read.csv("Facet_Data.csv", header = TRUE)
p1<-ggplot(df, aes(x=SOD,y=tau,size=age)) +
geom_point(shape=21,color="black",fill="#336A97",stroke=0.25)
p2<-ggplot(df, aes(SOD,tau,fill=age,size=age)) +
geom_point(shape=21,colour="black",stroke=0.25,
alpha=0.8)
p3<-ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25)
p4<-ggplot(df, aes(SOD,tau,fill=Class,size=age)) +
geom_point(shape=21,colour="black",stroke=0.25,
alpha=0.8)
library(gridExtra)
grid.arrange(p1,p2,p3,p4, ncol = 2, nrow =2)
所示为同一数据集中不同的视觉通道映射效果。使用read.csv()函数:

所示。0.9886.50.9860.9840.9840.9860.9885.500.9845.00.9884.55.05.56.06.55.05.56.04.56.54.5geom_point(shape=21,color="black",geom_point(shape=21,colour="black",fill="#336A97",stroke=0.25)(a)age映射到散点的大小(size)(b)age映射到散点的大小(size)和填充颜色(fill)7.06.56.56.05.500.9845.05.06.55.08.06.5geom_point(shape=2l,size=3,colour="black",geom_point(shape=21,colour-"black",(c)Class映射到散点的填充颜色(fll)(d)age和Class分别映射到散点的大小(size)和填充颜色(fill)10.98762386.297754contro15.60947220.9866667 6.270988 Contro1 5.72358530.98670216.152733Contro1 5.77144140.9871630 6.623707Contro15.65599250.98546515.740789contro15.50938860.9862637 4.871603Control4.532599数据框前6行
使用的都是geompoint()函数,其参数包括x、y、alpha(透明度)、colour(轮廓色)
是将离散数值型变量age映射到散点的大小(size),然后散点图转换成气泡图,气泡的大小对应于age的数值;
是将age映射到散点的大小(size)和填充颜色(fill),ggplot2会自动将填充颜色映射到颜色条(colorbar):
是将离散类别型变量Class映射到散点的填充颜色(fill),ggplot2会自动将不同的填充颜色对应类别的数据点,从而绘制多数据系列的散点图;
是将离散数值型变量age和离散类别型变量Class分别映射到散点的大小(size)和填充颜色(fill)。另外,还有不用作变量的视觉通道映射参数,但是有比较重要的视觉通道映射:字体(family)和字型(fontface)。其中,字型分为:plain(常规体)、bold(粗体)italic(斜体)、bold.italic(粗斜体)。
常用于geom_text等文本对象;字体内置的只有3种:sans、serif、mono,但是可以通过扩展包extrafont来将其他字体转换为ggplot2可识别的标准形式,还可以通过showtext包以图片的形式将字体插入到ggplot2绘制的图表中。不同的字体和字型组合如

library(ggplot2)
library(Cairo)
library(showtext)
df <- expand.grid(x = seq(0,1,length.out = 4), y= seq(0,1,length.out = 3))
df$fontface <-rep(c("plain", "bold", "italic", "bold.italic"),3)
df$family<-rep(c("sans", "times", "mono"),each=4)
df$label<-paste(df$family,"\n ",df$fontface)
#CairoPDF(file="ͼ.pdf",width=4.67,height=4.36)
#showtext.begin()
ggplot(df, aes(x, y)) +
geom_text(aes(label = label, fontface = fontface,family=family),size = 4) +
xlim(-0.2,1.3)+
ylim(-0.2,1.2)
#showtext_end()
#dev.off()
所示。0.00.5
1.6.3 度量调整
一句话:度量函数(scale_xxx)控制X/Y轴、透明度、颜色等视觉通道的细节。
度量用于控制变量映射到视觉对象的具体细节,比如:X轴和Y轴、alpha(透明度)colour(轮廓色、)fill(填充颜色)linetype(线形状)shape(形状)等,它们都有相应的度量函数,如表1-6-3所示。根据视觉通道映射的变量属性,将度量调整函数分成数值型和类别型两大类。Rggplot2的默认度量为scale_xxxidentity()。
需要注意的是:scale_*_manual()表示手动自定义离散的度量,包括colour、fill、alpha、linetype、shape和size等视觉通道映射参数。在表1-6-3中,X轴和Y轴度量是控制坐标轴的间隔与标签的显示等信息,会在1.6.4节时再进行详细介绍。颜色作为数据可视化中尤为重要的部分,colour和fll会在1.7节时再进行详细介绍。
在实际的图表绘制中,我们很少使用,因为这很难观察到透明度的映射变化。每个度量调整函数的具体参数可以使用RStudio的“help”界面或者查看ggplot2的官方手册。表1-6-3ggplot2常见度量调整函数度量数值型类别型x:X轴度量y:Y轴度量colour:轮廓色度量scale_colour/fill_continuous()scale_colour/fill_discrete()fill:填充颜色度量scale_colour/fill_brewer()scale_colour/fill_gradient()scale_colour/fill_manualoscale_colour/fill_gradient2Oscale_colour/fill _gradientn()alpha:透明度度量linetype:线形状度量shape:形状度量size:大小度量

library(ggplot2)
library(RColorBrewer)
df<-read.csv("Facet_Data.csv", header = TRUE)
p1<-ggplot(df, aes(x=SOD,y=tau,size=age)) +
geom_point(shape=21,color="black",fill="#E53F2F",stroke=0.25,alpha=0.8)+
scale_size(range = c(1, 8))
p2<-ggplot(df, aes(SOD,tau,fill=age,size=age)) +
geom_point(shape=21,colour="black",stroke=0.25,
alpha=0.8)+
scale_size(range = c(1, 8))+
scale_fill_distiller(palette="Reds")
p3<-ggplot(df, aes(x=SOD,y=tau,fill=Class,shape=Class)) +
geom_point(size=3,colour="black",stroke=0.25)+
scale_fill_manual(values=c("#36BED9","#FF0000","#FBAD01"))+
scale_shape_manual(values=c(21,22,23))
p4<-ggplot(df, aes(SOD,tau,fill=Class,size=age)) +
geom_point(shape=21,colour="black",stroke=0.25,
alpha=0.8) +
scale_fill_manual(values=c("#36BED9","#FF0000","#FBAD01"))+
scale_size(range = c(1, 8))
library(gridExtra)
grid.arrange(p1,p2,p3,p4, ncol = 2, nrow =2)
为散点图不同度量的调整效果,
是将数值离散型变量age映射到气泡的大小(size),再使用scale_size(range=c(a,b))调整了散点大小(size)的度量,range 表示视觉通道映射变量转化后气泡面积的映射显示范围。
是在
的基础上添加了颜色的映射,使用scale_fill_distiller(palette=Reds")函数将数值离散型变量age映射到红色渐变颜色条,其中,direction=0表示颜色是从浅到深渐变的(注意:需要加载RColorBrewer包,才能使用“Reds”颜色主题)。1ggplot2的官方手册:https://ggplot2.tidyverse.org/reference/index.html
是将类别离散型类别变量Class映射到不同的填充颜色(fill)和形状(shape),使用scale_*_manual()手动自定义fill和shape的度量。
是将数值离散型变量age和类别离散型变量Class分别映射到散点的大小(size)和填充颜色(fill),然后scale_size()和scale_fill_manual()分别调整气泡大小(size)的映射范围与填充颜色(fill)的颜色数值。0.9880.9860.9840.9840.9865.50.9880.9845.00.9860.9884.55.56.06.54.55.05.56.06.5geom_point(shape=21,color="black",geom_point(shape=21,colour="black",fill="#FF0000",stroke=0.25,alpha=0.8)+scale_size(range =c(1,8))scale_size(range =c(1,8))+scale fill_distiller(palette="Reds",direction=0)(a)散点大小(size)的度量调整(b)散点大小(size)和填充颜色(fill)的度量调整0.9860.9884.54.55.05.56.08.55.05.56.08.5geom_point(shape=21,size=3,colour="black",geom_point(shape=21,colour="black",scale fill_manual(values=c("#36BED9""#FF0000","#Fscale fill_manual(values=c("#36BED9","#FF0000","#Fscale_shape_manual(values=c(21,22,23))scale_size(range =c(1,8))(c)散点填充颜色(fill)与形状(shape)的度量调整(d)散点大小(size)和填充颜色(fill)的度量调整关键是,要学会合理地使用视觉通道映射参数,并调整合适的度量。可视化最基本的形式就是简单地把数据映射成彩色图形。
它的工作原理就是大脑倾向于寻找模式,你可以在图形和它所代表的数字间来回切换。1985年,AT&T贝尔实验室的统计学家威廉·克利夫兰(WilliamCleveland)和罗伯特·麦吉尔(RobertMcGill)发表了关于图形感知和方法的论文U8]。研究焦点是确定人们理解上述视觉暗示(不包括形状)的精确程度,最终得出如

所示的数值型数据使用不同视觉暗示的精确程度排序。位置长度角度方向面积体积饱和度色相纹理形状(orientation)(area)(volume)(color sat)(color hue)(texture)精确的不精确的我们能用到的视觉暗示通常有长度、面积、体积、角度、弧度、位置、方向、形状和颜色(色相和饱和度)。所以正确地选择哪些视觉暗示就取决于你对形状、颜色、大小的理解,以及数据本身和目标。
不同的图表类型应该使用不同的视觉暗示,合理的视觉暗示组合能更好地促进读者理解图表的数据信息。如

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
#library(RColorBrewer)
#library(reshape2)
df<-read.csv("MappingAnalysis_Data.csv", header = TRUE)
#--------------------------------------Size---------------------------
ggplot(data=df, aes(x=Time,y=value,group=variable)) +
geom_line()+
geom_point(shape=21,size=4,colour="black",fill="white") +
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable)) +
geom_line()+
geom_point(shape=21,size=4,colour="black") +
scale_fill_manual(values=c("grey60","grey30","black","white"))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------shape---------------------------
ggplot(data=df, aes(x=Time,y=value,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black",fill="grey60") +
scale_shape_manual(values=c(21,22,23,24))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable)) +
geom_line()+
geom_point(shape=21,size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("grey60","grey30","black","white"))+
scale_shape_manual(values=c(21,22,23,24))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
所示,相同的数据系列采用不同的视觉暗示的组合共有6种,分析结果如表1-6-4所示。表1-6-4
系列图表的视觉暗示组合分析结果图表视觉暗示组合数据系列区分程度美观程度印刷适合类型位置+方向无法较美黑白位置+方向+饱和度较易较美黑白位置+方向+形状容易较美黑白位置+方向+色相容易很美彩色位置+方向+饱和度+形状很容易较美黑白位置+方向+色相+形状很容易很美彩色、黑白根据表1-6-4可知,
(是最优的视觉暗示组合结果,既能保证很容易区分数据系列,也保证图表很美观,同时也适应于彩色与黑白两种印刷方式。当
(1采用黑白印刷时,色相视觉暗示会消除,只保留位置+方向+形状,如
所示,但是这样也能容易区分数据系列,保证读者正确、快速地理解数据信息。表1-6-5展示了
系列图表的视觉暗示组合代码与说明。一-1%表1-6-5
系列图表的视觉暗示组合代码与说明图表Rggplot2代码说明图group表示根据类别型变量(variable)分组绘制,并先后使用geom_point(shape=21,size=4,colour="black",fill="white")+geom_line()函数和geom_point()函数添加折线和散点图层图将类别型变量(variable)映射到散点的填充颜色(fill),并使用geom_point(shape=21,size=4,colour="black")+scale_fill_manual()函数调整填充颜scale_fill_manual(values=c("grey60","grey30","black","white"))+色度量为不同饱和度的颜色图将类别型变量(variable)映射到散点的形状(shape),并使用geom_point(size=4,colour="black",fill="grey60")+scale_shape_manual()函数指定散scale_shape_manual(values=c(21,22,23,24)+点的形状图将类别型变量(variable)映射到散geom_point(shape=21,size=4,colour="black")+点的填充颜色(fill),并使用scalefill_manual()函数调整填充颜色度量为不同色相的颜色图同时将类别型变量(variable)映射到散点的填充颜色(fill)和形状geom_point(size=4,colour="black")+(shape),并使用scale_fillmanual()scale_fill manual(values=c("grey60","grey30","black","white"))+和scale_shape_manual()函数设定scale_shape_manual(values=c(21,22,23,24))+不同饱和度的填充颜色与形状图同时将类别型变量(variable)映射geom_point(size=4,colour="black")+到散点的填充颜色(fill)和形状scalefill_manual(values=c("#FF9641","#FF5B4E",shape),并使用scale_fillmanual()函数和scale_shape_manual()函数scale_shape_manual(values=c(21,22,23,24))+设定不同色相的填充颜色与形状在表1-6-5中,我们需要重点理解fill、color、size、shape等视觉通道映射参数的具体位置,何时应该在aes()内部,何时应该在aes()外部的区别。当我们指定的视觉通道映射参数需要进行个性化映射时(即一一映射),应该写在aes()函数内部,即每一个观测值都会按照我们指定的特定变量值进行个性化设定。典型情况是需要添加一个维度,将这个维度按照颜色、大小、线条等方式针对维度向量中每一个记录值进行一一设定。
当我们需要统一设定某些图表元素对象(共性,统一化)时,此时应该将其参数指定在aes()函数外部,即所有观测值都会按照统一属性进行映射,例如size=5,linetype="dash”,color="blue”。典型情况是需要统一所有点的大小、颜色、形状、透明度,或者线条的颜色、粗细、形状等。这种情况下不会消耗我们数据源中的任何一个维度或者度量指标,仅仅是对已经呈现出来的图形元素的外观属性做了统一设定。
1.6.4 坐标系
一句话:坐标系决定数据怎么摆放:直角坐标、极坐标(如玫瑰图=柱形图+极坐标)。
在编码数据的时候,需要把数据系列放到一个结构化的空间中,即坐标系,它赋予X轴、Y轴坐标或给出经纬度表示的意义。

展示了三种常用的坐标系,分别为直角坐标系(rectangular数据可视化的所有需求。1.直角坐标系直角坐标系,也叫作笛卡儿坐标系,是最常用的坐标系,如

所示。你平时经常绘制的条形图、散点图或气泡图,就是直角坐标系。坐标系所在平面叫作坐标平面,两坐标轴的公共原点叫作直角坐标系的原点。
X轴和Y轴把坐标平面分成四个象限,右上方的叫作第一象限,其他三个部分按逆时针方向依次叫作第二象限、第三象限和第四象限。象限以数轴为界,横轴、纵轴上的点不属于任何象限。通常在直角坐标系中的点可以记为:(xy),其中x表示X轴的数值,y表示Y轴的数值。
ggplot2的直角坐标系包括coord_cartesian()、coord_fixed()、coord_flip()和coord_trans()四种类型。ggplot2中默认类型为coord_cartesian(),其他坐标系都是通过直角坐标系画图,然后变换过来的。在直角坐标系中,可以使用coordfixed()固定纵横比,在绘制华夫饼图和复合型散点饼图时,我们需要使纵横比为1:coord fixed(ratio=1);我们在绘制条形图或者水平箱形图时,需要使用coordflip()翻转坐标系。
它会将X轴和Y轴坐标对换,从而可以将竖直的柱形图转换成水平的条形图。原始的直角坐标上,坐标轴上的刻度比例尺是不变的,而coordtrans()坐标系的坐标轴上刻度比例尺是变化的,这种坐标系应用很少,但不是没用,可以将曲线变成直线显示。如果数据点在某个轴方向的密集程度是变化的,不便于观察,则可以通过改变比例尺来调节,使数据点集中显示,更加方便观察。
三维直角坐标系的投影方法在绘图软件中,三维直角坐标系中有投影这个参数:正交投影(orthographicprojection)和透视投影(perspectiveprojection),如

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(plot3D)
# Reference:https://github.com/coconn/cso002code_BrazilTradeOffsR
par(mfrow = c(1, 1))
panelfirst <- function(pmat) {
zmin <- min(-quakes$depth)
XY <- trans3D(quakes$long, quakes$lat,
z = rep(zmin, nrow(quakes)), pmat = pmat)
scatter2D(XY$x, XY$y, col = "black", pch = ".",
cex = 2, add = TRUE, colkey = FALSE)
xmin <- min(quakes$long)
XY <- trans3D(x = rep(xmin, nrow(quakes)), y = quakes$lat,
z = -quakes$depth, pmat = pmat)
scatter2D(XY$x, XY$y, col = "black", pch = ".",
cex = 2, add = TRUE, colkey = FALSE)
}
library(scales)
library(RColorBrewer)
library(fields)
colormap <- colorRampPalette(rev(brewer.pal(11,'RdYlGn')))(100)#
index <- ceiling(((prc <- 0.7 * quakes$mag/ diff(range(quakes$mag))) - min(prc) + 0.3)*100)
for (i in seq(1,length(index)) ){
prc[i]=colormap[index[i]]
}
pmar <- par(mar = c(5.1, 4.1, 4.1, 6.1))
with(quakes, scatter3D(x = long, y = lat, z = -depth, #bgvar = mag,
pch = 21, cex = 1.5,col="black",bg=prc,
xlab = "longitude", ylab = "latitude",
zlab = "depth, km",
ticktype = "detailed",#bty = "f",box = TRUE,
panel.first = panelfirst,
theta = 140, phi = 20, d=1.5,
colkey = FALSE)#list(length = 0.5, width = 0.5, cex.clab = 0.75))
)
colkey (col=colormap,clim=range(quakes$mag),clab = "Richter", add=TRUE, length=0.5,side = 4)
#--------------------------------------------------------------------
pmar <- par(mar = c(5.1, 4.1, 4.1, 6.1))
with(quakes, scatter3D(x = long, y = lat, z = -depth, #bgvar = mag,
pch = 21, cex = 1.5,col="black",bg=prc,
xlab = "longitude", ylab = "latitude",
zlab = "depth, km",
ticktype = "detailed",bty = "f",box = TRUE,
panel.first = panelfirst,
theta = 140, phi = 20, d=3,
colkey = FALSE)#list(length = 0.5, width = 0.5, cex.clab = 0.75))
)
colkey (col=colormap,clim=range(quakes$mag),clab = "Richter", add=TRUE, length=0.5,side = 4)
#--------------------------------------------------------------------
pmar <- par(mar = c(5.1, 4.1, 4.1, 6.1))
with(quakes, scatter3D(x = long, y = lat, z = -depth, #bgvar = mag,
pch = 21, cex = 1.5,col="black",bg=prc,
xlab = "longitude", ylab = "latitude",
zlab = "depth, km",
ticktype = "detailed",#bty = "f",box = TRUE,
panel.first = panelfirst,
theta = 140, phi = 20, d=30,
colkey = FALSE)#list(length = 0.5, width = 0.5, cex.clab = 0.75))
)
colkey (col=colormap,clim=range(quakes$mag),clab = "Richter", add=TRUE, length=0.5,side = 4)
所示。读者的眼睛就好比三维渲染场景中的相机。而相机存在两种投影方法。
一种是正交投影,也叫平行投影(parallelprojection),即进入相机的光线与投影方向是平行的。另一种是透视投影,即所有的光线相交于一点。不管是plot3D包还是lattice包的三维图表绘制函数,都存在这样一个参数可以调整三维坐标系的透视程度,这个参数对三维图表美观程度的展示尤为重要。
6.06.05.55.55.05.04.54.54.04.035.30.25直角坐标系还可以扩展到多维空间。例如,三维空间可以用(xy,z)三个值对来表示三维空间中数据点的位置。如果再拓展到平行坐标系(parallelcoordinate),则可以用于对高维几何和多元数据的可视化,这时,我们可以使用R中GGally包的ggparcoord()函数实现平行坐标系的绘制。
2.极坐标系你平时使用的雷达图、饼图等就是极坐标系。尽管你可能只用到了角度,还没有用到半径,图1-6-15为极坐标下的柱形图(南丁格尔玫瑰图)。极坐标系是指在平面内由极点、极轴和极径组成的坐标系。
在平面上取定一点0,称为极点。从0出发引一条射线0,称为极轴。再取定一个单位长度,通常规定角度取逆时针方向为正。
这样,平面上任一点P的位置就可以用线段OP的长度p,以及从O到OP的角度0来确定,有序数对(p,θ)就称为P点的极坐标,记为P(p,θ:p称为P点的极径,指数据点到圆心的距离:θ称为P点的极角,指数据点距离最右边水平轴的角度。极坐标系的最右边点是零度,角度越大,逆时针旋转越多。距离圆心越远,半径越大。
极坐标系在绘图中没有直角坐标系用得多,但在角度和方向两个视觉暗示方面有很好的优势,往往可以绘制出很出人意料的精美图表。Rggoplot2使用coord_polar()函数可以将坐标系从直角坐标系转换到极坐标系,具体语句为:coord_polar(theta="x",start=0,direction=1,clip="on),其中,theta 表示要极坐标化的中心轴,即X轴转化为圆周,Y轴转化为半径;direction表示排列方向,direction=1表示顺时针,direction=-1表示逆时针:start表示起始角度,以距离12点针的弧度衡量,具体位置与direction参数有关,若direction为1则在顺时针start角度处,若direction为-1则在逆时针start角度处。注意:极坐标转化比较耗费计算机资源,最好先用如下语句清空内存:rm(list=ls());gc()。
0.90.63.地理坐标系位置数据的最大好处就在于它与现实世界的联系,用地理坐标系可以映射位置数据。位置数据的形式有许多种,包括经度(longitude)纬度(latitude)邮编等。通常用纬度和经度来描述相对于赤道和子午线的角度。
纬度线是东西向的,标识地球上的南北位置:经度线是南北向的,标识地球上的东西位置。相对于直角坐标系,纬度就好比水平轴,经度就好比垂直轴。也就是说,相当于使用了平面投影。
由于球面上任何一点的位置都是用地理坐标经纬度(1,)表示的,而平面上的点的位置是用直角坐标(x,y)或极坐标(p,0)表示的,所以要想将地球表面上的点转移到平面上,则必须采用一定的方法来确定地理坐标与平面直角坐标或极坐标之间的关系。这种在球面和平面之间建立点与点之间函数关系的数学方法,就是地图投影方法。地图投影的实质就是将地球椭球面上的地理坐标转化为平面直角坐标。
用某种投影条件将投影球面上的地理坐标点一一投影到平面坐标系内,以构成某种地图投影。地图投影方法有20多种,其中常用的有墨卡托投影(Mercatorprojection)、兰勃特等角割圆锥投影(Lambert'sconicconformalprojection)、Albers等积正割圆锥投影(Albersequal-areaconicprojection)等距圆柱投影(cylindricalequidistantprojection)等。具体来说,不同区域常用的地图投影方法不同。
墨卡托投影法又称正轴等角圆柱投影,是一种等角的圆柱形地图投影。以此投影法绘制的地图上,经纬线于任何位置皆垂直相交,使世界地图可以绘制在一个长方形上。由于可显示任两点间的正确方位,航海用途的海图、航路图大多以此方式绘制。
在该投影中线型比例尺在图中1地图投影方法的详细说明:http://resources.esri.com/help/9.3/arcgisserver/apis/rest/pcs.html任意一点周围都保持不变,从而可以保持大陆轮廓投影后的角度和形状不变(即等角):但墨卡托投影法会使面积产生变形,极点的比例甚至达到了无穷大。Rggplot2使用coord_map()函数和coord_quickmap()函数可以设定坐标系为地理空间坐标系。其中coord_quickmap()函数是一种保留经纬直线的快速近似绘制的地理坐标系,它最适合靠近赤道的较小区域展示。
coordmap()函数可以通过设定projection投影参数,从而实现不同投影的地理空间坐标系,包括墨卡托投影、兰勃特等角圆锥投影、Albers等积正割圆锥投影、等距圆柱投影和正交投影等。4.坐标系的转换选择合适的坐标系对数据的清晰表达也很重要,直角坐标系与极坐标系的转换如

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
df<-read.csv("PolarBar_Data.csv", header = TRUE)
ggplot(df,aes(Date,Value))+
geom_bar(stat = "identity", width = 10,colour="black",size=0.25,fill="#3BC8EB")+
scale_x_continuous(name="Time(day)",breaks=seq(0,360,30))+
scale_y_continuous(breaks=seq(0,160,20),limits=c(0,160),expand = expand_scale(add = 0))+
theme_classic()
ggplot(df,aes(Date,Value))+
geom_bar(stat = "identity", width = 10,colour="black",size=0.25,fill="#3BC8EB")+
scale_x_continuous(breaks=seq(0,360,30))+
scale_y_continuous(breaks=seq(0,115,30),limits=c(-30,115))+
coord_polar(theta = "x",start=0) +
theme_light()+
theme( panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80",size=.25),
axis.text.y = element_text(size = 11,colour="black"),
axis.line.y = element_line(size=0.25),
axis.text.x=element_text(size = 11,colour="black"))
#------------------------------------------------------------
df<-read.csv("PolarArea_Data.csv", header = TRUE)
ggplot(df,aes(Date,Value))+
geom_area(colour="black",size=0.25,fill="#FFA1B9")+
scale_x_continuous(name="Time(day)",breaks=seq(0,360,60),expand = expand_scale(add = 0))+
scale_y_continuous(breaks=seq(0,3500,500),limits=c(0,3500),expand = expand_scale(add = 0))+
theme_classic()
ggplot(df,aes(Date,Value))+
geom_area(colour=NA,size=0.25,fill="#FFA1B9")+
geom_line(colour="black",size=0.25)+
scale_x_continuous(name="Time(day)",breaks=seq(0,360,30))+
scale_y_continuous(breaks=seq(0,3000,500),limits=c(0,3000))+
coord_polar(theta = "x",start=0) +
theme_light()+
theme( panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80",size=.25),
axis.text.y = element_text(size = 10,colour="black"),
axis.line.y = element_line(size=0.25),
axis.text.x=element_text(size = 11,colour="black"))
所示。使用极坐标可以将数据以365天围绕圆心排列。极坐标图可以让用户方便地看到数据在周期、方向上的变化趋势,而对连续时间段的变化趋势的显示则不如直角坐标系。
030609012015018021024027030033036048IR语言数据可视化之美:专业图表绘制指南极坐标系的表示方法为P(p,0),平面直角坐标系的表示方法为Q(x,y)。极坐标系中的两个坐标r和0可以由下面的公式转换为直角坐标系下的坐标值:而在直角坐标系中,从x和y两坐标计算出极坐标下的坐标:其中要满足x不等于0;在x=0的情况下:若y为正数时,则θ=90°(π/2radians);若y为负数时,则0=270°3π/2radians)。5.坐标轴度量坐标系指定了可视化的维度,而坐标轴的度量则指定了在每一个维度里数据映射的范围。
坐标轴的度量有很多种,你也可以用数学函数定义自己的坐标轴度量,但是基本上都属于

所示的坐标轴度量。这些坐标轴度量主要分为三种,包括数字(侧重数据的对数变化)分类坐标轴度量和时间坐标轴度量。其中,数字坐标轴度量包括线性坐标轴度量、对数坐标轴度量、百分比坐标轴度量三类,而分类坐标轴度量包括分类坐标轴度量和顺序坐标轴度两类。
线性坐标轴度量对数坐标轴度量数值等距分布关注百分比变化分类坐标轴度量顺序坐标轴度量离散的条形有序的分类标尺百分比坐标轴度量时间坐标轴度量描述整体中的部分以月、日或小时为单位Rggplot2数字坐标轴度量包括:scale_x/y_continuous(),scale_x/y_log100,scale_xy_sqrt(),scale_x/y_reverse();分类坐标轴度量包括scale_x/y_discrete();时间坐标轴度量包括:scale_x/y_date(),scale_x/y_datetime(),scale_x/y_time()。这些度量的主要参数包括:①name表示指定坐标轴名称,也将作为对应的图例名:2breaks表示指定坐标轴刻度位置,即粗网格线位置;③labels表示指定坐标轴刻度标签内容;4limits表示指定坐标轴显示范围,支持反区间:5expand表示扩展坐标轴显示范围;6trans表示指定坐标轴变换函数,自带有exp()、log()、log100等,还支持scales包内的其他变换函数,如scales:percent()百分比刻度、自定义等。

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(RColorBrewer)
library(reshape2)
df<-read.csv("MappingAnalysis_Data.csv", header = TRUE)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
scale_x_continuous(name="Time(d)",breaks=seq(0,20,2))+
scale_y_continuous(breaks=seq(0,90,10),limits=c(0,90),expand =c(0, 1))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
就是在
的基础上添加了scale_x_continuous()和scale_y_continuous()以调整X轴和Y轴的刻度与轴名:X轴度量:scale_x_continuous(name=Time(d)breaks=seq(0.20.2))Y轴度量:scale_y_continuous(breaks=seq(0.90.10).limits=c(0.90),expand=c(0.1))口线性坐标轴度量(linearscale)上的间距处处相等,无论处于坐标轴的什么位置。因此,在尺度的低端测量两点间的距离,和在尺度高端测量的结果是一样的。然而,对数坐标轴度量(logarithmicscale)是一个非线性的测量尺度,用在数量有较大范围的差异时。
像里氏地震震级、声学中的音量、光学中的光强度,以及溶液的pH值等。对数尺度以数量级为基础,不是一般的线性尺度,因此每个刻度之间的商为一定值。若数据有以下特性时,用对数尺度来表示会比较方便:(1)数据有数量级的差异时,使用对数尺度可以同时显示很大和很小的数据信息;(2)数据有指数增长或幂定律的特性时,使用对数尺度可以将曲线变为直线表示。

的X轴和Y轴都为线性尺度,而
X轴仍为线性尺度,将Y轴转变成对数尺度,就可以很好地展示很大和很小的数据信息。
(a):scale_y_continuous(breaks=seq(0.2.1.0.5).limits=c(0.2))
(b):scale_y_log10(name=log(value).limits=c(0.00001,10)分类坐标轴度量(categoricalscale):数据不仅仅包括数值,有时候还包括类别,比如不同实验条件、实验样品等测试得到的数据。分类标尺通常和数字标尺一起使用、以表达数据信息。条形图就是水平X轴为数字标尺、垂直Y轴为分类标尺;而柱形图是水平X轴为分类标尺、垂直Y轴为数字标尺,如

所示。其中,条形图和柱形图一个重要的视觉调整参数就是分类间隔,但是它和数值没有关系(如果是多数据系列,还包括一个视觉参数:系列重叠)。另外,饼图和圆环图也是数字尺度和分类尺度的组合。
注意对于柱形图、条形图和饼图最好对数据先排序后再进行展示。对于柱形图和条形图,把数据从大到小排序,最大的位置放置在最左边或者最上边。而饼图的数据要从大到小排序,最大的从12点位置开始。
常见的相关性系数图的X轴、Y轴都为分类标尺,如

所示。相关系数图一般都是三维及以上的数据,但是使用二维图表显示。其中,X列、Y列为都为类别数据,分布对应图表的X轴和Y轴:Z列为数值信息,通过颜色饱和度、面积大小等视觉暗示表示。
使用颜色饱和度和颜色色相综合表示Z列数据:
使用方块的面积大小及颜色综合表示Z列数据,从图中很容易观察到哪两组变量的相关性最好。0.10.20.30.80.40.50.60.60.70.40.80.90.2
1.6.5 相关系数
一句话:相关系数衡量变量间线性相关程度,是后续相关系数图的基础概念。
相关系数(correlationcoefficient)是用以反映变量之间相关关系的密切程度的统计指标。它是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。由于研究对象的不同,相关系数有如下几种定义方式。
(1)简单相关系数:又叫相关系数或线性相关系数,一般用字母r表示,用来度量两个变量间的线性关系。
相关性图就是研究多个变量两两之间的简单相关关系。(2)复相关系数:又叫多重相关系数。复相关是指因变量与多个自变量之间的相关关系。
例如,某种商品的季节性需求量与其价格水平、职工收入水平等现象之间呈现复相关关系。(3)典型相关系数:是先对原来各组变量进行主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间的相关关系。时间坐标轴度量(timescale):时间是连续的变量,你可以把时间数据画到线性度量上,也可以将其分成时刻、星期、月份、季节或者年份,如

所示。时间是日常生活的一部分。随着日52IR语言数据可视化之美:专业图表绘制指南出和日落,在时钟和日历里,我们每时每刻都在感受和体验着时间。
所以我们会经常遇见时间序列的数据,时间序列的数据常用柱形图、折线图或者面积图表示,有时候使用极坐标图也可以很好地展示数据,因为时间往往存在周期性,以天(day)周(week)月(month)、季(season)或年(year)为一个周期。需要注意的是:Rggplot2时间坐标轴度量函数scale_xxx_date()要求变量是Date格式;scalexxx_datetime()要求变量是POSIXct格式;scale_x××_time()要求变量是hms格式。Mon TusWed Thu Fri Sat Sun
1.6.6 图例
一句话:图例是图表背景信息的关键:guide_colorbar()管连续变量、guide_legend()管离散变量。
图例作为图表背景信息的重要部分,对图表的完整与正确表达尤为重要。Rggplot2的guide_colorbar()/guide_colourbar()函数用于调整连续变量的图例:guide_legend()函数用于离散变量的图例,也可以用于连续变量。guides()函数将guide_colorbar和guide_legend两种图例嵌套进去,方便映射与处理,如guides(fillguide_colorbar()),对多个图例共同处理的时候尤为有效。
另外,我们也可以在scale_xxx()度量中指定guide类型,guide="colorbar"或guide="legend”。其中,尤为重要的部分是图例位置的设定,Rggplot2默认是将图例放置在图表的右边(right"),但是我们在最后添加的theme()函数中,用legend.position设定图例的位置。legend.position可以设定为"right"、"left"、“bottom"和"top”。
ggplot2绘图过程中,控制图例在图中的位置利用theme(legend.position)参数,该参数对应的设置为:“none"(无图例)"left"(左边)“right"(右边)“bottom"(底部)“top"(头部),legend.position也可以用两个元素构成的数值向量来控制,如c(0.9.0.7),主要是设置图例在图表中间所在的具体位置,而不是图片的外围。数值大小一般在0~1之间,超出数值往往导致图例隐藏。如果图例通过数值向量设定在图表的具体位置,那么最好同时设定图例背景(legend.background)为透明或者无的。

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(RColorBrewer)
library(reshape2)
df<-read.csv("MappingAnalysis_Data.csv", header = TRUE)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
scale_x_continuous(name="Time(d)",breaks=seq(0,20,2))+
scale_y_continuous(breaks=seq(0,90,10),limits=c(0,90),expand =c(0, 1))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
legend.background = element_rect(fill="white"),
legend.position="right"
)
#--------------------------------------color+shape---------------------------
ggplot(data=df, aes(x=Time,y=value,fill=variable,shape=variable)) +
geom_line()+
geom_point(size=4,colour="black") +
scale_fill_manual(values=c("#FF9641","#FF5B4E","#B887C3","#38C25D"))+
scale_shape_manual(values=c(21,22,23,24))+
scale_x_continuous(name="Time(d)",breaks=seq(0,20,2))+
scale_y_continuous(breaks=seq(0,90,10),limits=c(0,90),expand =c(0, 1))+
theme_classic()+
theme(
text=element_text(size=14,color="black"),
legend.background = element_blank(),
legend.position=c(0.2,0.8)
)
使用的是theme_classic()内置的图表系统主题,使用theme()函数调整图例的具体位置。图1-6-23(a)所示图例的默认设定语句为:上述语句表示将图例的背景设为白色填充的矩形,位置设定为图表的右边。
将图例的位置设定为图表内部的左上角,并将图例背景(legend.background)设置为无。其中c(0.2,0.8)表示图例的位置放置在图表内部X轴方向20%、Y轴方向80%的相对位置。legend.position=c(0.2,0.8))
1.6.7 主题系统
一句话:主题系统(theme)控制背景、网格线、坐标轴等"外貌",一键换风格。
主题系统包括绘图区背景、网格线、坐标轴线条等图表的细节部分,而图表风格主要是指绘图区背景、网格线、坐标轴线条等的格式设定所展现的效果。ggplot2图表的主题系统主要对象包括文本(text)、矩形(rect)和线条(line)三大类,对应的函数包括element_text()、element_rect()、elementline(),另外还有elementblank()表示该对象设置为无,具体如表1-6-6所示。其中,我们使用比较多的系统对象是坐标轴的标签(axis.text.x、axis.text.y)、图例的位置与背景(legend.position和legend.background)。
X轴标签(axis.text.x)在绘制极坐标柱形图和径向柱形图时会用于调整X轴标签的旋转角度,Y轴标签(axis.text.y)也会用于时间序列峰峦图的Y轴标签的替换等,具体可见后面图表案例的讲解。表1-6-6主题系统的主要对象对象函数图形对象整体绘图区(面板)坐标轴图例分面系统参数:family,face,参数:colour,size,参数:fill,colour,由于ggplot2主题设置的内部函数及参数非常多,所以不建议新手直接学习。针对新手,建议使用ggThemeAssist包进行主题设置,用鼠标而不是代码,这样更加方便,也可以直接套用主题模板。
1.ggThemeAssist包使用ggThemeAssist包,需要先安装shiny包。安装好该包后,在RStudio界面选择“Tools”→“Addins”→“ggplot ThemeAssistant”选项,弹出界面如

所示。具体使用方法:首先运行函数要画图的ggplot2代码,以加载到内存:然后选中该画图函数,如ggplot;再选择“Tools”→“Addins”“ggplot ThemeAssistant”选项,就会出现一个交互式的shiny弹窗,在该弹窗上用鼠标操作;在弹窗中处理完后,点击右上角的“Done”按钮,就将主题代码输出到需要的位置,最后对代码进行微调即可。但是需要注意的是:有的地方可能会少括号或引号。
ggplot ThemeAssistant 操作界面2.套用主题模板R语言的主题模板包包括ggthemes、ggtech、ggthemer、ggsci、cowplot等。其中ggsci包就是专门为学术图表开发的包。Rggplot2自带的主题模板也有多种,包括theme_gray()、theme_minimal()、theme_bw()、theme_light()、theme_test()、theme_classic()等函数。
相同的数据及数据格式,可以结合不同的图表风格,如

#EasyCharts团队出品, #如有问题修正与深入学习,可联系微信:EasyCharts library(ggplot2) library(wesanderson) ggplot(iris,aes(Sepal.Length, Petal.Length, fill= Species))+ geom_point(size=3.5,shape=21,colour="black") + scale_fill_manual(values=wes_palette(n=3, name="Darjeeling1"))+ theme_light() #----------------------------Python--------------------------- ggplot(iris,aes(Sepal.Length, Petal.Length, fill= Species))+ geom_point(size=3.5,shape=21,colour="black") + scale_fill_manual(values=wes_palette(n=3, name="Darjeeling1"))+ theme_minimal()
所示。下面挑选几种具有代表性的图表风格讲解:(1)
是Rggplot2风格的散点图,使用Rggplot2Set3的颜色主题,绘图区背景填充颜色为RGB(229,229,229)的灰色,以及白色的网格线[主要网格线的颜色为RGB(255,255,255),1ggsci包的参考手册:https://nanx.me/ggsci/articles/ggsci.html次要网格线的颜色为RGB(242,242,242)。这种图表风格给读者清新脱俗的感觉,推荐使用在PPT演示中:(2)
的绘图区背景填充颜色为RGB(255,255,255)的白色,无主要和次要网格线,没有过多的背景信息。当图表尺寸较小时,仍然可以清晰地表达数据内容,不像
会因为背景线条太多而显得凌乱,其常应用在学术期刊的论文中展示数据。(3)
的基础上,将绘图区边框设定为“无”,也没有主要和次要网格线,同样常应用在学术期刊的论文中展示数据。所以,总地来说,
的风格适合PPT演示,
适合于学术论文展示。其实,不管是使用R、Python,还是Origin、Excel,都可以通过调整绘图区背景、主要和次要网格线、坐标轴线条等的格式,实现如
所示的6种不同的图表风格。
1.6.8 位置调整
一句话:position参数控制系列摆放:簇状/堆积/百分比堆积柱形图全靠它。
在geom_xxx()函数中,参数position表示绘图数据系列的位置调整,默认为"identity”(无位置调整),这个参数在绘制柱形图和条形图系列时经常用到,以绘制簇状柱形图、堆积柱形图和百分比堆积柱形图等。ggplot2位置调整参数如表1-6-7所示。在柱形图和条形图系列中,position的参数有4种:1identity:不做任何位置调整,该情况在多分类柱形图中不可行,序列间会遮盖,但是在多序列散点图、折线图中即可行,不存在遮盖问题;②stack:垂直堆叠放置(堆积柱形图);3dodge:水平抖动放置(簇状柱形图,position=position_dodge());4fill:百分比化(垂直堆叠放置,如百分比堆积面积图、百分比堆积柱形图等)。
其中,箱形图和抖动散点图的位置调整如

所示。构造的数据集为:

所示。0.9880.9840.9840.9885.06.06.50.988高手必备特别强调的是,要想熟练使用ggplot2绘制图表,就必须深入理解ggplot与geom对象之间的关系。在实际绘图语句中存在如表1-6-8所示的3种情况。
在表中的案例,我们使用的数据集为向量排序函数sort()和正态分布随机数生成函数rmorm()构造的df1和df2
geom_xxx(data=NULL,mapping=aes()):geom对象内同样有data和mapping参数,但geom内的data和mapping参数属于局部参数,仅作用于geom对象内部。表1-6-8ggplot与geom对象之间的关系情况所有图层共享数据源和视觉通道映各图层对象均使用独立的数据源与类型所有图层仅共享数据源射参数视觉通道映射参数图例geom_line(aes(colour-x+y),geom_line(aes(x,y,colour=x+y),dfl,sigeom_point(aes(fill=x+y),geom_point(aes(x,y,fill=x+y),df2,col代码geom_point(shape=16,size=5)+color="black",shape=21,size=5)+or="black",shape=21,size=5)+scale_fill_distiller(name="Point",palescale_fill distiller(name="Point",palescale_color_distiller(name="Line”,pascale_color_distiller(name="Line",pa所有geom对象都使用相同的data此种情况,根据参数继承规则,将此种情况属于特殊情况,仅在涉及和mapping(x、y、size、alpha、共享的数据源部分的data写在高级制图或者复杂地理信息多图层linetype、colour、fill、angle等),ggplot内,将不同图层单独使用的图表时才会接触,此时因为各图层根据参数继承规则,可以将data和视觉通道映射参数指定在各自的没有共享任何data和mapping,假说明mapping指定在ggplot 函数内,无geom内,在遇到多图层时,data参设有N个图层需要映射,此时所有论之后有多少个图层需要指定dataa数仅需在ggplot内指定一次,之后的data和mapping参数都需要在各和mapping,你都仅需在ggplot内的geom对象都会自动继承,无须一自的geom内进行一一指定,因为在指定一次即可,后续geom会自动继一指定,但是那些geom内部使用的geom内指定毫无意义承各自美学映射属性则需一一指定应用简单图表较为复杂的图表高级图表与地理信息图表
1.7 学术图表的色彩运用原理
一句话:颜色是图表的脸,本章讲选色原理,避免踩配色坑。
1.7.1 颜色模式
一句话:最常用RGB颜色模式(红绿蓝),用于颜色显示和图像处理。
1.RGB颜色模式我们先从颜色模式开始讲解学术图表的色彩运用原理。在图像处理中,最常用的颜色空间是RGB模式,常用于颜色显示和图像处理。RGB颜色模式使用了红(red)、绿(green)和蓝(blue)来定义所给颜色中红色、绿色和蓝色的光的量。
在24位图像中,每一种颜色成分都由0到255之间的数值表示。在位速率更高的图像中,如48位图像,值的范围更大。这些颜色成分的组合就定义了一种单一的颜色。
RGB颜色模式采用三维坐标的模型形式,非常容易被理解,如











#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
df<-read.csv("Facet_Data.csv", header = TRUE)
#------------------------------------------------------ÀëÉ¢ÐÍ------------------------------------------
library(RColorBrewer)
ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25) +
scale_fill_brewer(palette='Set1')+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.8,0.15)
)
library(viridis)
ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25) +
scale_fill_viridis(option = "plasma",discrete =TRUE)+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.8,0.15)
)
library(wesanderson)
ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25) +
scale_fill_manual(values=wes_palette("Darjeeling1")[c(1,3,5)])+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.8,0.15)
)
ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25) +
scale_fill_manual(values=c("#E7298A","#66A61E","#E6AB02"))+
theme(
legend.background = element_blank(),
legend.position=c(0.8,0.15)
)
#-------------------------------------------------Á¬ÐøÐÍ------------------------------------------------
ggplot(df, aes(x = tau, y = SOD, fill=age)) +
geom_point(shape=21,size=4,colour="black",alpha=0.95) +
scale_fill_distiller(palette="RdYlBu")+
theme(
text=element_text(size=15,color="black"),
plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.85,0.2)
)
ggplot(df, aes(x = tau, y = SOD, fill=age)) +
geom_point(shape=21,size=4,colour="black",alpha=0.95) +
scale_fill_viridis(option = "viridis",discrete =FALSE)+
theme(
text=element_text(size=15,color="black"),
plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.85,0.2)
)
ggplot(df, aes(x = tau, y = SOD, fill=age)) +
geom_point(shape=21,size=4,colour="black",alpha=0.95) +
scale_fill_gradient2(low="#00A08A",mid="white",high="#FF0000",midpoint = mean(df$age))+
theme(
text=element_text(size=15,color="black"),
plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.85,0.2)
)
ggplot(df, aes(x = tau, y = SOD, fill=age)) +
geom_point(shape=21,size=4,colour="black",alpha=0.95) +
scale_fill_gradientn(colors= terrain.colors(10))+
theme(
text=element_text(size=15,color="black"),
plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.85,0.2)
)
所示:原点到白色顶点的中轴线是灰度线,R、G、B三分量相等,强度可以由三分量的向量表示。我们可以用RGB来理解色彩、深浅、明暗变化。(1)色彩变化:三个坐标轴RGB最大分量顶点与黄、紫、青(YMC)色顶点的连线;(2)深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离:(3)明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮。
RGB模式也称为加色法混色模式。它是以RGB三色光互相叠加来实现混色的方法,因而适合于显示器等发光体的显示。其混色规律是:以等量的红、绿、蓝基色光混合。
我们平时在绘图软件中调整颜色主要就是通过修改RGB颜色的三个数值,如

所示的Windows系统自带的选色器的右下角。1https://en.wikipedia.org/wiki/HSL_and_HSV2.HSL颜色模式大家平时在颜色选择中还会遇到一种颜色模式:HSL(色相、饱和度、亮度),如
(b)所示,在这里也给大家做简要的介绍。HSL色彩模式是基于人眼的一种颜色模式,是普及型设计软件中常见的色彩模式,其中:(1)色相H(hue):代表的是人眼所能感知的颜色范围,这些颜色分布在一个平面的色相环上,取值范围是0°到360°的圆心角,每个角度可以代表一种颜色,如







#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(RColorBrewer)
library(reshape2)
mat <- round(cor(mtcars), 1)
mydata <- melt(mat)
colnames(mydata)<-c("Var1","Var2","value")
mydata$AbsValue<-abs(mydata$value)
#--------------------------------(b) 双色渐变系颜色方案---------------------------------------------------------
ggplot(mydata, aes(x= Var1 , y=Var2)) +
geom_point(aes(size=AbsValue,fill = value), shape=21, colour="black") +
scale_fill_gradientn(colours=c(brewer.pal(7,"Set1")[2],"white",brewer.pal(7,"Set1")[1]),na.value=NA)+
scale_size_area(max_size=12, guide=FALSE) +
theme(
text=element_text(size=15,face="plain",color="black"),
axis.title=element_text(size=13,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.position="right"
)
#--------------------------------(a) R多色系颜色方案---------------------------------------------------------
mydata$Ceilingcound<-ceiling(mydata$value)
ggplot(mydata, aes(x= Var1 , y=Var2)) +
geom_point(aes(size=AbsValue,fill = factor(Ceilingcound)), shape=21, colour="black") +
scale_fill_manual(values =c(brewer.pal(7,"Set1")[2],brewer.pal(7,"Set1")[1]),labels=c('Negative','Positive'),na.value=NA,name="factor")+
scale_size_area(max_size=12, guide=FALSE)
所示。色相值的意义在于,当不改变光感的时,可以通过旋转色相环来改变颜色。在实际应用中,可用作基本参照的色相环上六大主色为:360°/0°红、60°黄、120°绿、180°青、240°蓝、300°洋红,它们在色相环上按照60°圆心角的间隔排列。
(2)饱和度S(saturation):是指色彩的饱和度,它用0%至100%的值描述了相同色相、明度下色彩纯度的变化。数值越大,颜色中的灰色越少,颜色越鲜艳,呈现一种从理性(灰度)到感性(纯色)的变化,如
所示。(3)亮度L(lightness):是色彩的明度,作用是控制色彩的明暗变化。通常是从0(黑)~100%(白)的百分比来度量的,数值越小,色彩越暗,越接近于黑色;数值越大,色彩越亮,越接近于白色,如
所示。饱和度饱和度亮度亮度与HSL颜色模式类似的还有:HSB[色相(hue)饱和度(saturation)、亮度(brightness)]有时也被称作HSV[色相(hue)饱和度(saturation)、色调(value)],如
所示。比起RGB系统,HSL使用了更贴近人类感官直觉的方式来描述色彩,可以指导设计者更好地搭配色彩,在色彩搭配中经常被用到,如
所示。色诚颜色标准定义确定基本颜色B):取通授色式:自定义颜色(C)新酒色调():160红B):0饱和度(S):0绿(G):0亮度儿规定自定义颜色00>颜色纯色(0)亮度):0蓝(0):0确定取消添加到自定义颜色(A)兰前(a)MicrosoftOffice默认的选色器(b)Windows系统自带的选色器我们使用颜色时参考的色轮(色相轮)就是来源于HSB、HSL颜色模式或LUV颜色模式。配色网就是基于HSL颜色空间模型自动生成高级配色方案的在线网站,如

所示。HSL色彩空间可以更加直观地表达颜色。HSL是色相、饱和度和亮度这三个颜色属性的简称。
色相是色彩的基本属性,就是人们平常所说的颜色名称,如紫色、青色、品红等。我们可以在一个圆环上表示出所有的色相。它不仅基于常用的场景给出合适的配色方案,而且还允许用户使用配色工具自行配置出极具个人风格又不失美观的方案,功能完备且实用。
色彩搭配基本理论方法除了

所说的三种外,还有:类似色(analogous)搭配、分裂互补色(splitcomplement)搭配、矩形(rectangle)搭配和正方形(square)搭配等。1配色网的官网:http://www.peise.net2色彩搭配理论的详细说明:http://www.tigercolor.com/color-lab/color-theory/color-harmonies.htm3配色网推出的高级配色工具官网:http://www.peise.net/tools/web色环又称作为色轮,是一种按照色相将色彩排列的呈现方式。当我们开始进行色环排列时,需要把原色按照等距关系排列,如
的12色5轮色轮所示。(1)单色(monochromatic)搭配:色相由暗、中、明三种色调组成的单色。单色搭配并没有形成颜色的层次,但形成了明暗的层次。
这种搭配在设计中应用时,效果永远不错,其重要性也可见一斑。(2)互补色(complement)搭配:如果颜色方案只包括两种颜色,就会选择色环上对立的2个颜色(在色轮上直线相对的两种颜色称为补色,比如红色和绿色),如
所示。互补色搭配在正式的设计中比较少见,主要由于它色彩之间强烈对比所产生的特殊性和不稳定,但是很显然的是,在各种色相搭配中,互补色搭配无疑是一种最突出的搭配,所以如果你想然你的作品特别引人注目,那互补色搭配或许是种最佳选择。(3)三角形(triad)搭配:如果颜色方案只包括三种颜色,那么就会以120°的间隔选择3个颜色,如
所示。三角形搭配是一种能使得画面生动的搭配方式,即使使用了低饱和度的色彩也是如此。在使用三角形搭配的时候一定要选出一种色彩作为主色,另外两种作为辅助色。
3.LUV颜色模式LUV色彩空间全称CIE1976(L*u*,v*)(也作CIELUV)色彩空间,L*表示物体亮度,u*和v*是色度,如

所示。于1976年由国际照明委员会(InternationalCommissiononIllumination)提出,由CIEXYZ颜色空间经简单变换得到,具有视觉统一性。对于一般的图像,u*和v*的取值范围为-100到+100,亮度为0到100。
类似的色彩空间有CIELAB,如
所示。Rggplot2包绘图默认的颜色主题方案如

所示,色轮为HSLu颜色模式。HSLu是相对于HSL颜色空间模式更加人性化的选择。当把CIELUV颜色空间转换到极坐标系时,就类似于HSL颜色空间模式。
它拓展了CIELUV颜色模式,从而新的饱和度(saturation)分量可以允许用户间隔选择色度(chroma)²。但是HSLu颜色模式又不同于CIELUVLCh颜色模式。CIELUVLCh颜色模式有一部分颜色不能显示,比如饱和度高的深黄色3。
离散的颜色主题也可以通过函数gg_color_hue(n)获取,其中n表示输出的颜色总数:
Rggplot2默认颜色主题(HSLw颜色空间)1图片来源:https://commons.wikimedia.org/wiki/File:SRGB_gamut_within_CIExyY_color_space_isosurface.png#/media/File:Visible_gamut_within_CIELAB_color_space_D65_whitepoint_mesh.png3HSLuvvs.HSL:http://www.hsluv.org/comparison
1.7.2 颜色主题的搭配原理
一句话:相同数据不同配色效果天差地别——配色有原理可循。
我们对相同的数据图表对比不同的颜色效果,如

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(RColorBrewer)
color_theme<-brewer.pal(7,"Set2")[c(1,2,4,5)]
mydata<-read.csv("Boxplot_Data.csv",stringsAsFactors=FALSE)
ggplot(mydata, aes(Class, Value))+
geom_boxplot(aes(fill = Class),size=0.25) +
geom_jitter(width=0.2,size=1.)+
#geom_dotplot(aes(fill = Class),binaxis = "y", stackdir = "center",dotsize = 0.4)+
scale_fill_manual(values=c("#4F81BD","#C0504D","#9BBB59","#8064A2"))+
theme_bw()+
theme(legend.position="none")
ggplot(mydata, aes(Class, Value))+
geom_boxplot(aes(fill = Class),size=0.25) +
geom_jitter(width=0.2,size=1.)+
#geom_dotplot(aes(fill = Class),binaxis = "y", stackdir = "center",dotsize = 0.4)+
scale_fill_manual(values=c("#FF0000","#0000FF","#00FFFF","#FF00FF"))+
theme_bw()+
theme(legend.position="none")
ggplot(mydata, aes(Class, Value))+
geom_boxplot(aes(fill = Class),size=0.25,outlier.color=NA) +
geom_jitter(width=0.2,size=1.)+
theme_bw()+
theme(legend.position="none")
所示的带散点分布的箱形图。图1-7-8(a)~
(c)的颜色主题方案分别对应的软件为Excel、Origin和Rggplot2,
(c)使用的就是
所示的4种颜色的颜色主题方案。所谓“人靠衣装,佛靠金装”,符合美学规律设计的颜色主题方案往往能很大程度上提高图表的美观程度,如
所示。所以,我们很有必要研究与讲解颜色主题方案的搭配。0.40.30.20.20.2(c)Rggplot2默认颜色主题R语言作为经典的数据可视化语言,很大的优势就在于它的包(如经典的RColorBrewer包)提供了丰富的颜色主题方案,如

所示。Origin2017、Python(Seabom包)等绘图软件都有参考与引入该颜色主题方案。该颜色主题方案主要可以分成三大类:单色系、多色系和双色渐变系(这个分类会在后文中详细说明)。
或许你不知道,其实RColorBrewer包的颜色主题方案系列来源于一个颜色主题方案搭配网站:ColorBrewer2.0,如

所示。该网站提供了大量的颜色搭配主题方案,可以供用户学习与使用。强烈建议大家登录这个网站,自己操作与观看这里面的配色方案,由于版面有限不能全面地介绍ColorBrewer2.0配色的各个系列与功能。
从另一个角度说,可以将图1-7-10看成ColorBrewer2.0网页颜色主题系列方案的精华版。1ColorBrewer2.0的官网:http://colorbrewer2.org/#type=sequential&scheme=BuGn&n=3单色系多色系双色渐变系1RColorBrewer包的颜色主题方案:https://github.com/timothyrenner/ColorBrewer.jl这重够选择偿的配色方案分段数,不的数据数据性质下分做数有所不,最多提供12个分级。(不建双分应大多,一般情况下5-8现比致含)这里可速你的配急方案性质,分然现供伟变(同色系)、二分新变[双色系变、多分类(不同色系)配色方重,具体选用脱则要看具体的业务性质,依次对运单度(秘里正值或者都是分值),双向度(证负值湿杂)或者仅作分类的情况。
在序渐变的情况下,可以现供多色调和承色可的题择,其实不仔经税客几乎看不出差剂、多色系情况下,部色会在一个临近色相范质内疏动:但是波动范的很小,单色系色相范用比较国定。这里可无进择题色输出时的注意事项,建否餐要老原色言强形。是而打印友好等,这里光速择色喻出格式,其提供三种格式出HEX、RBG,CMYK这里提供对应色色值代码及色预资。
这津提供色通明度选择。
ColorBrewer2.0网页界面(续)ColorBrewer2.0的配色功能如此强大,它的颜色搭配原理又是什么呢?其实,它的原理如图1-7-11所示:通过排列组合实现二值色系、单色系、双色渐变系和多色系等颜色主题方案。其中,最为常用的三种颜色搭配方法如

所示。圆形分布的多色系(circularcolorsystem)是一类特殊的多色系配色方案,如PythonSeabron包的HLS颜色主题方案。这类颜色方案适合时间类的周期性数据,如小时、天、月、年等有关的时序数据。
二值色系多色系多色系二值色系多色系渐变双色系值色系渐变双色系渐变双色系单色系渐变双色系单色系渐变双色系单色系图表绘制的颜色搭配原理1ColorBrewer 2.0网页界面:http://colorbrewer2.org/#type=sequential&scheme=BuGn&n=32http://www.personal.psu.edu/cab38/ColorSch/Schemes.html单色系双色渐变系多色系色相基本相同,饱和度呈单调递增的两个不同的色系使用于不同的两类数据为非数值情况,不同色系的颜色变化。有序数据一般从大到小排列情况,如正值与负值。双色渐变系搭用于表示不同类别,尤其是使用色相对应的颜色亮度也逐步增加。
小数值配方案主要强调数据基于一个关键最轻或最暗的颜色强调关键的类别。通常使用较亮的颜色表示,而大数值中间数值(midpoint)的级数分布情多色系颜色搭配方案使用不同色相通常使用较暗的颜色表示。单色系颜况。
把关键的中间数值作为中间点,值的颜色,表示不同类别或数值的差色搭配方案中可能存在颜色的色相使用一个较亮的颜色表示,然后两端异。这些颜色的亮度不一定要完全相不同,但它的主要特征还是颜色从亮逐步变化到两个不同色相的颜色。比等,但是要基本差不多。
多色系还包到暗的亮度变化。比如地区的人口密如基于某疾病平均死亡率的分布情括圆形分布的多色系度等通常使用单色系搭配方案况,就可以使用双色渐变系搭配方案[A,O.B]或者[A.C.B]类别,特征,[-A.0].[0.A].或者[A,B](C为mean,medium等)时间类的周期性数据
1.7.3 学术图表的颜色主题
一句话:别自己配色,直接用现成主题(RColorBrewer/terrain.colors等)省时又好看。
我们毕竟不是专业的设计师,专业的设计师懂得自己根据配色原理与色相轮搭配颜色。如果自己配色,既费时费力,也不一定达到美观的效果。幸好,
提供了诸多颜色主题70-R语言数据可视化之美:专业图表绘制指南terrain.colors、topo.colors、cm.colors,如

所示。我们还比较常用的是:colorRampPalette(c(“red",“white",“green”,,alpha=TRUE)(n),其中n表示插值的颜色值总数,使用该语句可以将少量的颜色值插值生成n个颜色值。R中的wesanderson包、viridis包、ggthemes包和ggtech包等也提供了一系列新的颜色主题方案。
尤其需要强调的是R中的ggsci包提供了几个经典期刊推荐的颜色主题方案,包括Nature、Science等学术期刊。但是,这并不是说投稿这些期刊就必须使用这些配色方案,而是说推荐使用,你可以选择使用其他颜色主题方案。所以,下面罗列了很多颜色主题方案,但毕竟“萝卜白菜,各有所爱”,你只要选择1~2种自己喜欢的,然后就可以应用到自己绘制的学术图表中。
当你问笔者这幅图表使用哪个颜色主题方案比较美观时,笔者也没法确定,实践出真知。另外,由于不同的数据与图表,所以自己要多尝试不同的颜色主题方案,才能找出哪个颜色主题适合这幅图表。wesanderson包²:可以使用语句wes_palette(“Darjeeling1")获得离散的颜色值(见

)。1R语言预色调色板:https://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/palettes.html2wesanderson包的官网:https://github.com/karthik/wesandersonggsci包':可以使用语句:pal_npg(nrc",alpha=0.7)((9),语句中的“9”可以指定数目,获得透明度为0.7的10个Nature期刊推荐的颜色主题的颜色值(见

)。Journal of Clinical Oncologyviridis包:可以使用语句scale_fill_viridis(option=magma",discrete=TRUE)获得离散的颜色值;当discrete=FALSE时,即可获得连续的颜色条(见

1.7.4 颜色方案的拾取使用
一句话:取色工具获取Hex码/RGB数值,把好配色搬进自己的图。
刚刚提供给大家这么多颜色主题方案,怎么使用呢?在绘图软件中修改颜色,一般是通过RGB数值设定。这时候,我们就需要获取颜色方案中每个颜色的RGB数值或者Hex颜色码,其可以通过

所示的几种方式获得相关颜色数值。1ggsci包的官网:https://cran.r-project.org/web/packages/ggsci/vignettes/ggsci.html2viridis包的官网:https://cran.r-project.org/web/packages/viridis/vignettes/intro-to-viridis.htmlQQ社交软件FastStone截图软件ColorPix取色软件点击该软件最右边的按钮打开软件将鼠标放置在相应最简单的取色方法就是借助QQ然后选择屏幕取色器,就可的缘素点位置.按任意键就可以软件,按下Ct+At+A组合键后以拾取桌面的任意像素点的颜色。锁定软件,获得RGB、HSB和鼠标放置的位置就是该像素点的该软件提供RGB颜色值、Dec和CMYK颜色数像以及Hex鼓色颜色,但是其只提供RGB颜色值。
Hex颜色码。码,如图所示。有时候手动调整数据系列的RGB颜色值会觉得很麻烦,其实还有一种利用取色器的便捷方法,如PPT和AI软件都有取色器,但是R、Excel、Origin等绘图软件没有取色器。
对于R、Origin等绘图软件的图表,可以导出SVG、EPS等矢量格式的图片,然后使用AI软件打开后:①选择图片,选择“对象(O)”→“剪切蒙版(M)”→“释放(R)”选项:②再选择图片,选择“对象(O)”→“复合路径(O)”→“释放(R)”选项;③选择要修改的图表元素,然后使用取色器调整“填充”和“描边(边框”颜色:④导出相应的标量格式的图片,同时设定好图片的分辨率。Hex-十六进制颜色码在软件中设定颜色值的代码通常使用十六进制颜色码(HexColorCode)。颜色一般可以使用RGB三个数值表示。
十六进制颜色码指定颜色的组成方式:前两位表示红色(red),中间两位表示绿色(green),最后两位表示蓝色(blue)。把三个数值依次并列起来,以#开头,就是我们平时使用的十六进制颜色码。如纯红:#FF0000,其中FF即十进制的R(红)=255,00和00即G(绿)=0和B(蓝)=0;同样的原理,纯绿:#00FF00,即R=0,G=255,B=0。
结合以上颜色主题的获取方法:我们可以使用R自带的颜色主题方案,或者使用R的颜色包获取颜色方案,或者使用颜色拾取软件获得颜色值。根据数据映射变量的类型,可以将颜色度量调整scale_color/fill_*0函数的应用主要分成离散型和连续型,具体如

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
df<-read.csv("Facet_Data.csv", header = TRUE)
#------------------------------------------------------ÀëÉ¢ÐÍ------------------------------------------
library(RColorBrewer)
ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25) +
scale_fill_brewer(palette='Set1')+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.8,0.15)
)
library(viridis)
ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25) +
scale_fill_viridis(option = "plasma",discrete =TRUE)+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.8,0.15)
)
library(wesanderson)
ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25) +
scale_fill_manual(values=wes_palette("Darjeeling1")[c(1,3,5)])+
theme(
text=element_text(size=14,color="black"),
plot.title=element_text(size=14,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.8,0.15)
)
ggplot(df, aes(x=SOD,y=tau,fill=Class)) +
geom_point(shape=21,size=3,colour="black",stroke=0.25) +
scale_fill_manual(values=c("#E7298A","#66A61E","#E6AB02"))+
theme(
legend.background = element_blank(),
legend.position=c(0.8,0.15)
)
#-------------------------------------------------Á¬ÐøÐÍ------------------------------------------------
ggplot(df, aes(x = tau, y = SOD, fill=age)) +
geom_point(shape=21,size=4,colour="black",alpha=0.95) +
scale_fill_distiller(palette="RdYlBu")+
theme(
text=element_text(size=15,color="black"),
plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.85,0.2)
)
ggplot(df, aes(x = tau, y = SOD, fill=age)) +
geom_point(shape=21,size=4,colour="black",alpha=0.95) +
scale_fill_viridis(option = "viridis",discrete =FALSE)+
theme(
text=element_text(size=15,color="black"),
plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.85,0.2)
)
ggplot(df, aes(x = tau, y = SOD, fill=age)) +
geom_point(shape=21,size=4,colour="black",alpha=0.95) +
scale_fill_gradient2(low="#00A08A",mid="white",high="#FF0000",midpoint = mean(df$age))+
theme(
text=element_text(size=15,color="black"),
plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.85,0.2)
)
ggplot(df, aes(x = tau, y = SOD, fill=age)) +
geom_point(shape=21,size=4,colour="black",alpha=0.95) +
scale_fill_gradientn(colors= terrain.colors(10))+
theme(
text=element_text(size=15,color="black"),
plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
legend.background = element_blank(),
legend.position=c(0.85,0.2)
)

所示。1十六进制颜色码:https://www.mathsisfun.com/hexadecimal-decimal-colors.html7.06.55.55.55.04.56.04.55.05.56.54.55.50.9880.9880.9660.9060.9840.9840.9840.9848.55.07.05.07.05.07.0
的数据集df,df是总共有4列数据:tau、SOD、age和Class(Control、Impaired和Uncertain),其数据映射代码如下所示。将离散的类别型变量Class映射到数据点的填充颜色(fill),
离散型颜色主题方案的代码如表1-7-1所示
离散型颜色主题方案代码图颜色度量语句说明p+scale fill _brewer(palette='Setl)p+scale_fill_viridis(option="plasma",discrete =TRUE)p+scale_fill_manual(values=wes_palette(Darjeeling1")[c(1,3,5)])p+scale_fillmanual(values=c("#E7298A","#66A61E","#E6AB02"))使用Hex颜色码自定义填充颜色
的数据集df,其数据映射代码如下所示。将连续的数值型变量Class映射到数据点的填充颜色(fill),
离散型颜色主题方案的代码如表1-7-2所示
连续型颜色主题方案代码图颜色度量语句说明p+scale_fill_distiller(palette="RdYIBu")p+scale _fill_viridis(option="viridis",discrete=FALSE)p+scale_fill_gradient2(low="#00A08A",mid="white",high="#FF0000",自定义连续的颜色条,mean(dfSage)表示age均值对应中间色white”p+scale_fill_gradientn(colors=terrain.colors(10))R语言预色调色板terrain.colors()
1.7.5 颜色主题的应用案例
一句话:多色系直接换主题即可;单色系/双色渐变系的应用有讲究。
关于颜色的基础知识讲解这么多,下面带大家一起来应用各个颜色主题方案,提升图表的美观性。对于多色系颜色方案的应用,大家很容易使用:直接选择一个颜色主题方案,然后修改数据系列的颜色(见
)。但是对于单色系和双色渐变系的颜色主题方案的应用,大家可能不是那么容易适应。所以,现在重点给大家讲解单色系和双色渐变系的颜色主题方案的应用。

是使用Excel绘制的默认多色系颜色方案的带误差线柱形图,
是使用单色系颜色方案(蓝色系列:改进的Science期刊上的图表。虽然数据是类别型,但是使用单色系颜色主题方案更加美观。

是使用Excel绘制的默认多色系颜色方案的曲线散点图,
是使用单色系颜色方案(橙色系列:)改进的曲线散点图,单色系颜色主题方案就是根据数据系列的数值类别设定,亮度随数值从低到高。
是使用单色系颜色方案改进的曲线图,省去散点数据标记,只留下曲线以展示数据系列的规律。
1.8 图表的基本类型
一句话:数据可视化四步:有什么数据→想问什么→怎么展示→怎么好看,反复打磨。
NathanYau将数据可视化的过程总结为4个步骤,如

所示[19]。不论是商业图表还是学术图表,要想得到完美的图表,在这4个步骤中都要反复进行思索。你拥有什么样的数据(Whatdatadoyouhave)?
你想表达什么样的数据信息(Whatdoyouwanttoknowaboutyourdata)?你会什么样的数据可视化方法(Whatvisualizationmethodsshouldyouuse)?你从图表中能获得什么样的数据信息(Whatdoyouseeanddoesitmakessense)?
从这里开始没有或几乎没有待确定你所拥有的你想表达的数据最好的数据数据信息产生新问题查找相关数据表现特定问题类别比较数据关系你从图表获得的数据分布你会使用的数据信息时间序列数据可视化方法局部整体地理空间探索不同的维度其中,你采用什么样的数据可视化方法尤为关键,所以我们需要了解有哪些图表类型。现暂时根据数据想侧重表达的内容,将图表类型分为六大类:类别比较、数据关系、数据分布、时间序列、局部整体和地理空间。注意:有些图表也可以归类于两种或多种图表类型。
1.8.1 类别比较
一句话:类别+数值两类数据→柱形/条形/雷达/坡度图等,用位置+长度比较。
类别比较型图表的数据一般包含数值型和类别型两种数据类型(见

),比如在柱形图中,X轴为类别型数据,Y轴为数值型数据,采用位置+长度两种视觉元素。类别型数据主要包括柱形图、条形图、雷达图、坡度图、词云图等,通常用来比较数据的规模。有可能是比较相对规模(显示出哪一个比较大),有可能是比较绝对规模(需要显示出精确的差异)。
柱形图是用来比较规模的标准图表(注意:柱形图轴线的起始值必须为0)。条形图柱形图不等宽柱形图状条形图状柱形图堆积柱形图堆积条形图马赛克图矩形树状图多系列条形图条形范围图子弹图瀑布图漏斗图桑基图三维柱形图散点直线图散点直线图坡度图点阵图雷达图极坐标系柱形图径向柱形图仪表盘热力图词云图
1.8.2 数据关系
一句话:看变量间相关或流向:散点、气泡、曲面、平行坐标、桑基图等。
数据关系型图表包括展示数据相关性(correlation)与数据流向(flow)两种主要类别的图表(见

)。散点图气泡图散点曲线图曲线图三维气泡图等高线图瀑布图曲面图雷达图三元相图径向坐标图平行坐标系矩阵散点图星形图相关系数图和弦图弧长链接图韦思图树状图网络图力导向图数据流向型图表主要向读者展示两个或两个以上的状态、情境之间的流动量或流动强度,包括网络图、和弦图、桑基图、蜂巢图等。其中,网络图可以展示出不同类型对象之间的关系强度和内部关联关系。
数据相关性型图表主要展示两个或多个变量之间的关系,包括最常见的散点图、气泡图、曲面图、矩阵散点图等。该图表的变量一般都为数值型,当变量为1~3个时,可以采用散点图、气泡图、曲面图等:当变量多于3个时,可以采用高维数据可视化方法,如平行坐标系、矩阵散点图、径向坐标图、星形图和切尔若夫脸谱图等。
1.8.3 数据分布
一句话:看数值分布规律:直方图、箱形图、小提琴图,直方图最简单常用。
数据分布型图表主要显示数据集中的数值及其出现的频率或者分布规律,包括统计直方图、核密度曲线图、箱形图、小提琴图等(见

)。其中,统计直方图最为简单与常见,又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。
统计直方图核密度曲线图蜂巢图点阵图点状条带图条带编码图带误差线的柱形图带误差线的散点图带误差线的曲线图箱形图瓶状图小提琴图豆状图复合图维统计直方图二维核密度估计图二维核密度曲面图三维统计直方图三维带模基线的柱形围金字塔图扇形预测图带置信区间图
1.8.4 时间序列
一句话:强调随时间变化:折线图是标准方式,还有面积图、日历图、柱形图。
时间序列型图表强调数据随时间的变化规律或者趋势,X轴一般为时序数据,Y轴为数值型数据,包括折线图、面积图、雷达图、日历图、柱形图等(见

)。其中,折线图是用来显示时间序列变化趋势的标准方式,非常适用于显示在相等时间间隔下数据的趋势。折线图面积图堆积面积图折线图散点直线图坡度图交替图迷你曲线图景化波形图扇形预测图雷达图日历图甘特图柱形图
1.8.5 局部整体
一句话:展示占比:饼图、旭日图、华夫饼图、矩形树状图等。
局部整体型图表能显示出局部组成成分与整体的占比信息,主要包括饼图、圆环图、旭日图、华夫饼图、矩形树状图等(见

)。饼图是用来呈现部分和整体关系的常见方式,在饼图中,每个扇区的弧长(以及圆心角和面积)大小为其所表示的数量的比例。但要注意的是,这类图很难去精确比较不同组成的大小。
饼图圆环图半圆环图肩形图百分比堆积柱形图百分比堆积条形图马赛克图矩形树状图百分比堆积画积图旭日图沃罗诺伊图南丁格尔玫瑰图华夫饼图如需绘制这些不同类型的图表,我们主要使用Rggplot2及其拓展包extension,比如ggrepel、ggally、ggalluvial等包:也还会使用lattice、plot3D等其他包。因为ggplot2包暂时不擅长三维图表的绘制,我们需要使用lattice包的wireframe()和cloud()等函数,plot3D包的persp3DO、hist3DO、scatter3DO、lines3DO,text3DO、surf3DO、polygon3D0等函数,绘制三维柱形图、散点图和曲面图等。这些图表的绘制方法在后面的章节都会进行详细的讲解。
1.8.6 地理空间
一句话:展示位置与地理分布:等值区间地图、气泡地图、散点地图,用经纬度定位。
地理空间型图表主要展示数据中的精确位置和地理分布规律,包括等值区间地图、带气泡的地图、带散点的地图等。地图用地理坐标系可以映射位置数据。位置数据的形式有许多种,包括经度、纬度、邮编等,但通常都是用纬度和经度来描述的。
R中ggplot2包的geom_path()和geom_polygon()等函数,结合地理空间坐标系可以使用DataFrame格式的数据,绘制不同投影下的世界与国家地图,包括中国、美国等。Baidumap包可以使用getBaiduMap()函数下载百度局部地图,然后使用ggmap包的ggmap()函数显示:也可以直接使用ggmap包的get_map()函数下载Google局部地图等。另外,tmap包使用SpatialPointsDataFrame和SpatialPointsDataFrame格式的地理数据信息,可以绘制不同的地图。
其优势在于可以绘制二维插值地图。1tmap包的参考手册:https://mgimond.github.io/Spatial/interpolation-in-r.html《地图管理条例》第十五条规定:“国家实行地图审核制度。向社会公开的地图,应当报送有审核权的测绘地理信息行政主管部门审核。
但是,景区图、街区图、地铁线路图等内容简单的地图除外。”本书原计划用专门的章节讲解使用R语言如何绘制不同地理坐标投影下,从世界到不同国家与区域的地图,但是由于出版审核周期等原因已移除。1《地图管理条例》:http://www.gov.cn/zhengce/content/2015-12/14/content_10403.htm