导图社区 R语言可视化及绘图
这是一篇关于R语言可视化及绘图01的思维导图,从散点图、盒型图、几何对象、低级绘图函数等方面进行了分析和概述。
编辑于2021-09-04 23:32:33R语言可视化及绘图
1.par函数
R语言绘图系统
基础绘图包
Lattice
ggplot2家族
其他,比如: sjplot; gplot; plotrix.....
参数
adj——调整;ask——询问;bg——背景;bty——图形边框;cex——大小;col——颜色;family——字体;font——粗体、斜体;lab——轴;las——轴的刻度标签;lend——线的两端;lty——线的形式;lwd——线的粗细;mfcol,mfrow——画布切分;xaxt,yaxt——是否显示轴标。
fig与new连用——图中图;hist——绘制直方图
2.散点图&盒形图
散点图
plot绘制散点图类型,type有6种,即p, b, l, s, o, n。
type=c('p','b','l','s','o','n') par(mfrow=c(2,3)) for(i in 1:6){ plot(1:10,type = type[i], main = paste('type is: ',type[i])) }
盒形图
原始图
boxplot(rnorm(10))
添加参数
#range参数:触须线(去除异常值后的最大和最小值)的延伸范围 par(mfrow=c(1,3)) set.seed(100) data=rnorm(40) boxplot(data,range=0.5,xlab='range is 0.5',col = 'blue') boxplot(data,range=1,xlab='range is 1',col = 'blue') boxplot(data,range=1.5,xlab='range is 1.5',col='blue')
#其他参数 boxplot(len ~ dose, #连续+分类变量 data=ToothGrowth, boxwex=0.25, #box宽度 at=1:3-0.2, #盒子的位置 subset=supp=="VC", #数据取子集 col="yellow", #填充色 names=c('dose=0.5','dose=1.0','dose=2.0'), #box标签 main="Tooth Growth", xlab="Vitamin C dose mg", ylab="tooth length", xlim=c(0.5,3.5),ylim=c(0,35), yaxs="i") #y轴样式
多个盒子比较
boxplot(len ~ dose, data=ToothGrowth, add=TRUE, #在当前图形添加新的盒形图 boxwex=0.25, at=1:3+0.2, subset=supp=="OJ", col="orange", names=c('dose=0.5','dose=1.0','dose=2.0') #box标签 )
突出某个盒子,如阳性和阴性对照
names=c(rep('Maestro',20),rep('Presto',20), rep('Nerak',20),rep('Eskimo',20),rep('Nairobi',20), rep('Artiko',20)) value=c(sample(3:10,20,replace = T),sample(2:5,20,replace = T), sample(6:10,20,replace = T),sample(6:10,20,replace = T), sample(1:7,20,replace = T),sample(3:10,20,replace = T)) data=data.frame(names,value) boxplot(data$value ~ data$names, col=ifelse(levels(data$names)=="Nairobi",rgb(0.1,0.1,0.7,0.5), ifelse(levels(data$names)=="Eskimo",rgb(0.8,0.1,0.3,0.6), "grey90")), ylab="disease",xlab="- varity -")
排序
#排序 order_names <- with(data,reorder(names,value,median,na.rm=T)) #reorder排序:第一个参数需要排序的因子变量,第二个排序标准,第三个排序函数 boxplot(data$value ~ order_names,ylab = "disease",xlab = '- variety -')
主要参数的含义: x: 向量,列表或数据框。 formula: 公式,形如y~grp,其中y为向量,grp是数据的分组,通常为因子。 data: 数据框或列表,用于提供公式中的数据。 range: 数值,默认为1.5,表示触须的范围,即range × (Q3 - Q1) width: 箱体的相对宽度,当有多个箱体时,有效。 varwidth: 逻辑值,控制箱体的宽度, 只有图中有多个箱体时才发挥作用,默认为FALSE, 所有箱体的宽度相同,当其值为TRUE时,代表每个箱体的样本量作为其相对宽度 notch: 逻辑值,如果该参数设置为TRUE,则在箱体两侧会出现凹口。默认为FALSE。 outline: 逻辑值,如果该参数设置为FALSE,则箱线图中不会绘制离群值。默认为TRUE。 names:绘制在每个箱线图下方的分组标签。 plot : 逻辑值,是否绘制箱线图,如设置为FALSE,则不绘制箱线图,而给出绘制箱线图的相关信息,如5个点的信息等。 border:箱线图的边框颜色。 col:箱线图的填充色。 horizontal:逻辑值,指定箱线图是否水平绘制,默认为FALSE。
3.条形图&直方图
条形图
例:绘制出有关每个月的降雨量的条形图
h<-c(1,2,3,4,5,5)
M<-c("MAR","APR","JUN","JUL","AGU","JAN")
barplot(h,names.arg= M,xlab="Month",ylab = "Rain",col="blue",main="Rain chart",border = "red")
h是包含在条形图中使用的数值的向量或矩阵。 names.arg是在每个条下出现的名称的向量。
直方图
基本语法
hist(v,main,xlab,xlim,ylim,breaks,col,border)
首先创建一系列的数据:h<-c(4,6,3,46,3,5,7,8,3,4,3,4,5)
创建完之后将这个数据纳入到直方图histogram的绘制函数hist()当中:hist(h,xlab = "number'scale",ylab="Right",col="blue",border = "red")
如果想要对绘制的数据加以限制,比如说x轴上只绘制从0到20的数据,y也只绘制0到10的数据的话,则可以直接使用xlim和ylim来进行指定,指定的参数应当为向量(这个是R语言当中的规定),重新编写的代码为:hist(h,xlab = "number'scale",ylab="Right",col="blue",border = "red",xlim=c(0,20),ylim=c(0,10))
v是包含直方图中使用的数值的向量。 main表示图表的标题。 col用于设置条的颜色。 border用于设置每个条的边框颜色。 xlab用于给出x轴的描述。 xlim用于指定x轴上的值的范围。 ylim用于指定y轴上的值的范围。 break用于提及每个条的宽度。
4.饼图&克利夫兰点图&条件图
饼图
pie(rep(1,26),col=rainbow(26), labels = LETTERS[1:26], #标签 radius = 1) #半径
x-是包含饼图中使用的数值的向量。 labels-用于描述切片的标签。 main-用来表示图表的标题。 col-表示调色板。 rainbow函数是一个调色工具。
克利夫兰点图
op <- par(xaxs='i') dotchart(t(VADeaths), xlim = c(0,100), main='Death rates in virginia -1940', lcolor = 'gray', #点和标签颜色 color = 'forestgreen', #组的标签和值颜色 gcolor = 'blue', #水平线的颜色 pch = 16) par(op)
条件图
#将震源分为4组,且每组间不重叠 given.depth <- co.intervals(quakes$depth,number = 4,overlap = 0) coplot(lat ~ long|depth, data=quakes, given.v=given.depth, #给定值 rows = 1, #分割画布 #自定义panel函数 panel = function(x,y,...)panel.smooth(x,y,span = 0.7))
5.低级绘图函数
在已有图形基础上添加元素
图例
a=c(1:5) b=c(2,3,3,4,5) c=c(4,5,2,3,1) plot(b~a,type='b',bty='l', xlab='value of a',ylab='value of b', col='red',lwd=3,pch=17,ylim=c(1,5)) lines(c~a,col='blue',lwd=3,pch=19,type='b') legend(#'bottomleft', #位置参数:字符串 topright 3,5, #位置参数:坐标位置 legend=c('Group 1',"Group 2"), #图例标签 col = c('red','blue'), #图例填充色 pch=c(17,19), #图标形状 bty='n', #定义边框,n不要 pt.cex = 2, #图标大小 cex = 1.2, #标签文字大小 text.col = 'black', #标签文字颜色 horiz = F, #是否水平放置,默认F(垂直) inset = c(0.1,0.1),#距离x、y轴程度,0-1 x.intersp = 0.1, #水平图标间距 y.intersp = 0.4) #竖直图标间距 #后两个参数对于图形中图例非常多时很有用
plot(iris$Sepal.Length~iris$Sepal.Width, pch=c(21:23)[iris$Species], #三种不同点型对应三个不同品种 col=c('orange','sky blue','pink')[iris$Species], bg=c('orange','sky blue','pink')[iris$Species]) legend( #x=3.7,y=8.0, #坐标法 locator(1), #去图上找一个合适位置,左击鼠标 legend = c('Setosa','Versicolor','Virginica'), col=c('orange','sky blue','pink'), pch = 21:23, pt.cex = 2, y.intersp = 0.8, #图例间距 pt.bg = c('orange','sky blue','pink'))
添加文本
x <- rnorm(1000) hist(x,xlim = c(-4,4)) usr <- par('usr') #为找到画布四个角的坐标,左下角/右下角/左上角/右下角 clip(usr[1],-1,usr[3],usr[4]) #切割画布 hist(x,col = 'red',add=T) text(-3,50,labels = 'red area', col = 'red',srt=60,cex=2) #切割另一个矩形 clip(1,usr[2],usr[3],usr[4]) hist(x,col = 'blue',add=T) text(x=3,y=50,labels = 'blue area', col='blue',srt=300,cex=2)
data <- sample(20:80,20) par(mar=c(4,3,3,1)) barcenter <- barplot(data,col='skyblue',axes = F, ylim = c(-5,100)) #限定y轴范围,为了使后面文本显示出来 #存储了条柱中心横坐标 axis(2,at=seq(0,100,10)) text(barcenter,-2,labels = LETTERS[1:20], col = 'red',cex = 0.8)
mycars <- data.frame(car=c('Honda','Benz','BMW', 'Audi','Chery','Toyota','Ford'), mtg=c(4,5.2,5.5,2.8,1.8,2.8,3)) plot(mycars$mtg,cex=mycars$mtg,col='pink',pch=21, bg='lightblue',ylab='cars\' mtg',xlab='cars', xlim = c(0,7.5)) text(1:7,mycars$mtg,labels = mycars$car)
函数 功能 arrows 添加箭头 axis 坐标轴 box 图形边框 abline 添加直线 clip 修剪图形 locator 识别图中点的坐标 layout 切分画布 legend 添加图例 lines 添加线条 segments 添加线段 rug 添加小地毯 polygon 构建多边形 points 添加散点 titles 添加标题 text 添加文字 mtext 在图形四周添加文字 grid 添加背景网格线
6.图形颜色选取
方法一
直接用color的名称,如:“red”,“green”,“black”。。。 R中有657种颜色可以选择,可以通过函数colors() 查看和使用。
cl=colors() x=runif(10000,-250,250) hist(x,breaks=seq(-250,250,5),col=cl[1:100])
方法二
hcl()函数
> args(hcl) function (h = 0, c = 35, l = 85, alpha, fixup = TRUE) 其中h指定颜色,为0~360间的整数,0为红色,120为绿色,240为蓝色;c指定浓度;l指定亮度;alpha指定透明度。
x=runif(10000,-250,250) hist(x,breaks=seq(-250,250,5),col=hcl(1:100))
方法三 hsv()函数
> args(hsv) function (h = 1, s = 1, v = 1, gamma = 1, alpha) 色调(H),饱和度(S),亮度(V)。
x=runif(10000,-250,250) hist(x,breaks=seq(-250,250,5),col=hsv(seq(0,1,0.01))) #用seq序列,默认饱和度和亮度是1
方法四 灰度函数grey() 或者gray()
> args(grey) function (level) 其中:level指定灰度,为0~1间的数,0为黑,1为白。
hist(x,breaks=seq(-250,250,5),col=grey(seq(0,1,0.01)))
方法五 rgb()函数
该函数按三元色,红,绿,蓝原理指定颜色,rgb(r=1,g=0,b=0)为红色, rgb(r=0,g=1,b=0)为绿色,rgb(r=0,g=0,b=1)为蓝色。 > args(rgb) function (red, green, blue, alpha, names = NULL, maxColorValue = 1) maxColorValue(max)设置为255时,rgb可以从1~255变化。与配色表查询值一致。
hist(x,breaks=seq(-250,250,5),col=rgb(r=1,g=0,b=0))
8.几何对象
点图
颜色标度设置
#双色梯度函数 scale_color_gradient(...,high='#56B1F7',low='#132B43',...) scale_fill_gradient #三色梯度函数 scale_color_gradient2(...,low=muted('red'),mid='white',high=muted('blue'),...) scale_fill_gradient2 #自定义n色梯度函数,接受颜色向量 scale_color_gradientn(...,colors,...) scale_color_gradientn #手动设置颜色标度函数(对已有设置颜色不满意时) scale_color_mauual(..,values) scale_fill_mauual
函数
df <- data.frame(x=runif(100),y=runif(100), z1=rnorm(100),z2=abs(rnorm(100))) #color后接连续型变量也可做到颜色梯度展示,但只是映射,没那么精细。 ggplot(df,aes(x,y))+geom_point(aes(color=z2)) ggplot(df,aes(x,y)) +geom_point(aes(color=z1))+ scale_color_gradient2() #默认的三色梯度
ggplot(df,aes(x,y)) +geom_point(aes(color=z1))+ scale_color_gradient(low='green',high = 'blue') ggplot(df,aes(x,y)) +geom_point(aes(color=z1))+ scale_color_gradientn(colors = RColorBrewer::brewer.pal(5,'Set3'))
ggplot(mtcars,aes(mpg,wt))+geom_point(aes(color=factor(cyl)))+ scale_color_manual(values = c("red","blue","green")) #注意传入的颜色向量长度必须和颜色映射变量因子水平一致
示例
点的形状标度
scale_shape(...,solid=TRUE) #默认实心点 #自定义点型 scale_shape_manual(...,values)
函数
点的大小标度
scale_radus(name,breaks,labels,limits,range,trans,guide) scale_size(name,breaks,labels,limits,range,trans,guide) scale_size_area(...,max_size) scale_size_manual
函数
ggplot(mpg,aes(displ,hwy,size=hwy))+ geom_point()+ scale_size(name = 'hwy size',breaks = c(12,24,44), labels = c('low','middle','high')) ggplot(mpg,aes(displ,hwy,size=hwy))+ geom_point()+ scale_radius() #将hwy大小传至圆点半径
df <- data.frame(x=c(0:10),y=c(20:30)) ggplot(df,aes(x=x,y=y,size=x))+ geom_point()+ scale_size_area()
示例
条图
格式
geom_bar(mapping = , data = , stat = 'count', #统计变换默认计数 position = 'stack', #默认堆栈 width = , #条形宽度 binwidth = , na.rm = FALSE, show.legend = , inherit.aes = TRUE)
positon: dodge并排 fill堆叠填充标准化为1 stack堆栈 identity不做调整 jitter点扰动
误差条图
geom_crossbar #绘制盒形
geom_errorbar #绘制误差条图
dff <- data.frame(mean_value=c(18,20,23,16,24,15), group=factor(LETTERS[1:6]), sd_value=c(1.4,1.7,2.1,1.2,1.9,1)) #error_bar上限下限 dff$lower <- with(dff,mean_value - 1.5*sd_value) dff$upper <- with(dff,mean_value + 1.5*sd_value) p <- ggplot(dff,aes(group,mean_value))+ geom_bar(position = 'dodge',fill='sky blue', stat = 'identity') p+geom_errorbar(aes(ymin=lower,ymax=upper), position = 'dodge',width=0.2, color='red')
geom_linerange #绘制一条线段
geom_pointrange #绘制点线段
pp <- ggplot(dff,aes(group,mean_value)) pp+geom_pointrange(aes(ymin=lower,ymax=upper), color='red',size=1.5, fatten = 4) #点的大小
geom_errorbarh #水平误差条图 horizontal
gp <- ggplot(dff,aes(x=mean_value,y=group)) #注意x和y互换了 gp+geom_errorbarh(aes(xmin=lower,xmax=upper), height=0.2,color='blue')+ #height定义errorbar两端高度 geom_point(color='black',size=2.5)
直方图、密度图
直方图
ggplot(diamonds,aes(carat))+ geom_histogram(fill='darkorchid4') ggplot(diamonds,aes(carat))+ geom_histogram(fill='darkorchid4',bins=45)+ xlim(0,3)
# bins和binwidth ggplot(diamonds,aes(carat))+ geom_histogram(fill='darkorchid4',bins = 300) ggplot(diamonds,aes(carat))+ geom_histogram(fill='darkorchid4',binwidth = 0.01) #binwidth参数是一个相对宽度
#颜色映射 ggplot(diamonds,aes(price,fill=cut))+ geom_histogram(binwidth = 500)
参数: geom_histogram(mapping = , data = , stat = 'bin', #统计变换,概率密度为density position = 'stack', binwidth = , #条柱宽度 bins = , #条柱数目,默认30 na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
概率密度曲线
#stat=density ggplot(diamonds,aes(price))+ geom_histogram(color='darkorchid4',stat='density')
#aes映射,..density..表示将y轴表示为density ggplot(diamonds,aes(price, ..density..))+ geom_histogram(fill='darkorchid4',color='black')
#geom_density ggplot(diamonds,aes(depth,fill=cut,color=cut))+ geom_density(alpha=0.1)+xlim(55,70)
折线图
基本折线图
准备
# 加载R包
library(ggplot2)
# 构造数据集
df <-data.frame(dose=c("D0.5", "D1", "D2"), len=c(4.2,10, 29.5))
ggplot(data=df,aes(x=dose,y=len,group=1))+ geom_line()+ geom_point()
改变线的类型
ggplot(data=df,aes(x=dose,y=len,group=1))+ geom_line(linetype= "dashed")+ geom_point()
改变线的颜色
ggplot(data=df,aes(x=dose,y=len,group=1))+ geom_line(color="red")+ geom_point()
分组折线图
准备
df2 <-data.frame(supp=rep(c("VC", "OJ"), each=3), dose=rep(c("D0.5", "D1", "D2"),2), len=c(6.8,15, 33, 4.2, 10, 29.5))
多组折线图
ggplot(data=df2,aes(x=dose,y=len,group=supp))+ geom_line()+ geom_point()
改变直线类型
ggplot(data=df2,aes(x=dose,y=len,group=supp))+ geom_line(linetype="dashed", color="blue", size=1.2)+ geom_point(color="red", size=3)
标签绘制
7.ggplot2
qplot
做散点图
使用向量数据
library(ggplot2) x <- 1:1000 y <- rnorm(1000) plot(x, y, main="Scatter plot by plot()") qplot(x,y, main="Scatter plot by qplot()")
使用数据框数据
library(ggplot2)
str(diamonds)
载入示范数据
set.seed(1000) # 设置随机种子,使随机取样具有可重复性 datax<- diamonds[sample(53940, 100), seq(1,7)] head(datax, 4)
取前7列的100个随机观测值
plot(x=datax$carat, y=datax$price, xlab="Carat", ylab="Price", main="plot function") qplot(x=carat, y=price, data=datax, xlab="Carat", ylab="Price", main="qplot function")
qplot(x=carat, y=price, data=datax, color=cut, shape=cut, main="qplot function")
按切工进行分类作图
theme_set(theme_bw()) qplot(x=carat, y=price, data=datax, color=cut, shape=cut, main="qplot function")
改背景
做曲线图
qplot(x=carat, y=price, data=datax, color=cut, geom="line", main="geom=\"line\"")
做统计图
qplot(cut, price, data = diamonds, fill=cut, geom = "boxplot", main = "boxplot")
qplot(price, data = diamonds, fill=cut, geom = "histogram", main = "histogram")
qplot(price, data = diamonds, color=cut, geom = "density", main = "density")
做柱形图
qplot(x=cut, y=price, data = diamonds, fill=cut, geom = "histogram", stat="summary", fun.y="mean")
几何对象(geom):代表你在图中实际看到的图形元素,如点、线、多边形等; geom = 'point'绘制散点图。这是绘制两个变量时qplot的默认几何对象 geom = 'smooth'拟合一条平滑曲线。这种几何对象常常和散点图一起出现,用来探索数据的整体趋势。 geom = 'boxplot'绘制箱线图。 geom = 'line'绘制折线图。常常用于绘制时间序列数据 geom = 'path'绘制路径图。描绘图形的具体走向与走势,较少使用。 geom = 'histogram'绘制直方图。 geom = 'density'绘制密度曲线, geom = 'bar'绘制条形图。 geom = 'pie'绘制饼图。 统计变换(stats):对数据进行的某种汇总。例如,将数据分组计数以创建直方图,或者将一个二维的关系用线性模型进行解释。 标度(scale):将数据的取值映射到图形空间,例如用颜色。大小或形状来表示不同的取值; 坐标系(coord):常见的无非就是笛卡尔坐标系和极坐标系 分面(facet):描述如何将数据分解成各个子集,以及如何对子集进行作图并联合进行展示。
美学函数
数据准备
library(ggplot2)
#load the data set data(mtcars) df <- mtcars[, c("mpg","cyl","wt")] #将cyl转为因子型factor df$cyl <- as.factor(df$cyl) head(df)
散点图
ggplot(data=df, aes(x=mpg, y=wt))+ geom_point()
ggplot(data=df, aes(x=mpg, y=wt))+geom_point(color="blue", size=2, shape=23)
改变点形状、大小、颜色等属性
geom_density()与stat_density()是等价的
数据准备
#构造数据集 set.seed(1234) wdata <- data.frame( sex=factor(rep(c("F", "M"), each=200)), weight=c(rnorm(200, 55), rnorm(200, 58)) ) head(wdata)
a <- ggplot(wdata, aes(x=weight))
先绘制一个图层a,后面逐步添加图层
面积图
a+geom_area(stat = "bin")
a+geom_area(aes(fill=sex), stat = "bin", alpha=0.6)+ theme_classic()
改变颜色
密度图
a+geom_density()
a+geom_density(aes(color=sex))
根据sex修改颜色,将sex映射给line颜色
a+geom_density(aes(fill=sex), alpha=0.4)
修改填充颜色以及透明度
a+geom_density(aes(color=sex))+ geom_vline(data=mu, aes(xintercept=grp.mean, color=sex), linetype="dashed")+ scale_color_manual(values = c("red", "blue"))
添加均值线以及手动修改颜色
点图
a+geom_dotplot()
a+geom_dotplot(aes(fill=sex))
将sex映射给颜色
a+geom_dotplot(aes(fill=sex))+ scale_fill_manual(values=c("#999999", "#E69F00"))
手动修改颜色