R语言可视化及作图6--ggplot2之点图、条形图、盒形图、直方图、线图
R语言绘图系列:
一. 点图
ggplot2绘制点图使用的是geom_point()
标度函数scale:
标度控制着数据到图形属性的映射,标度将我们的数据转化为视觉上可以感知的东西,比如大小、位置、颜色、形状等。标度也为我们提供了读图时所使用的工具,比如说坐标轴和图例。总的来说,可以称为引导元素。标度函数控制元素的属性,可以理解为图形的遥控器,可以用它来调整画布大小、颜色等等。此前学的shape,color,size等参数和标度函数相比显得不够灵活。
表格中的加粗:默认参数
用法:scale_+图形属性名称(例如,colour_、shape_或x_)+标度的名称(例如,gradient、hue 或manual)。
比如:离散性数据的颜色图形属性默认标度名为scale_colour_hue(),形状图形属性标度为scale_shape_shape()。使用?或者help()可以查看相关参数及具体用法。
scale_x_XXX、scale_y_XXX 是控制x、y 轴的标度,用于设置x、y 轴的显示标签、显示范围、刻度上的值等等。XXX 主要有continuous、data、datatime、discrete、log10、sqrt 等等。
对于图例的标度,如果图例是控制着颜色属性colour,那么使用
scale_colour_XXX 可以设置这个图例的属性(比如标签、显示的值)。类似的还有scale_size_XXX、scale_fill_XXX、scale_shape_XXX 等等,具体用法以及参数请查看帮助文档。
1. 点的颜色
library(ggplot2)
#生成演示数据集
df <- data.frame(
x=runif(100),
y=runif(100),
z1=rnorm(100),
z2=abs(rnorm(100))
ggplot(df,aes(x,y))+geom_point(aes(colour=z2))
自定义颜色:scale_colour_manual函数
p <- ggplot(mtcars,aes(mpg,wt))+geom_point(aes(color=factor(cyl)))
p+scale_color_manual(values=c('red','blue','green'))
data('diamonds')
dsmall <- diamonds[sample(1:nrow(diamonds),1000),] #从diamonds数据集中取1000行做演示
ggplot(dsmall,aes(carat,price))+geom_point(aes(shape=cut))
#Warning message:
#Using shapes for an ordinal variable is not advised
ggplot(dsmall,aes(carat,price))+geom_point(aes(shape=cut))+scale_shape(name='diamonds cut',solid = FALSE)
#图中变成了空心点,图例也进行了修改,name设置的是图例名称
自定义点的形状:scale_shape_manual
ggplot(dsmall,aes(carat,price))+geom_point(aes(shape=cut))+scale_shape_manual(name='diamonds cut',values = c(1:5))
#1:5和基础绘图包中的形状是一一对应的
p <- ggplot(mpg,aes(displ,hwy,size=hwy))+geom_point()
p+scale_size(name='hwy size',breaks = c(12,24,44),
labels = c('low','middle','high'))
#break是对原始数据进行切分,相应的标签是low middle high。但是hwy是一个连续型变量,因而点的大小并不是和这三个标签一一对应的,而是和数值大小有关。
set.seed(2021)
dsmall <- diamonds[sample(nrow(diamonds),1000),]
p <- ggplot(dsmall,aes(x=color,fill=cut))
p+geom_bar(position = 'stack')
#position参数默认是stack,也就是堆栈的意思
3. 改变图形堆栈中颜色的填充方式
scale_fill_brewer 调色板函数
p+geom_bar(position = 'dodge')+scale_fill_brewer(type = 'qual')
#这里的type和RcolorBrewer里的三种type(seq, div, qual)是一样的,type=qual是离散型颜色
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.0))
dff$lower=with(diff,mean_value-1.5*sd_value)
dff$upper=with(diff,mean_value+1.5*sd_value)
p <- ggplot(dff,aes(group,mean_value))+geom_bar(position = 'dodge',fill='skyblue',stat='identity')
p+geom_errorbar(aes(ymin=lower,ymax=upper),position = 'dodge',width=0.2,color='red')
gp <- ggplot(dff,aes(x=mean_value,y=group)) #注意,x和y互换了
gp+geom_errorbarh(aes(xmin=lower,xmax=upper),height=0.2,color='sky blue')+geom_point(color='blue')
#errorbarh就是水平errorbar的意思
值得注意的是,图上点的多少并不能完全反应原始数据的多少,因为有的点可能因为点过于密集就会被覆盖,看起来是一个点,其实可能是多个点。
因此可以使用geom_jitter函数将不同的点区分开(jitter是震荡散点),width设置如果遇到相同的点,点向左右方平移的距离。alpha设置透明度。
p+geom_boxplot()+geom_jitter(width=0.2, alpha=0.5, color='orange')
bins可以设置直方图条柱的数目,默认为30。当bins和binwidth(设置条柱宽度)同时设置时,默认以binwidth为准。
ggplot(dsmall,aes(carat))+geom_histogram(fill='darkorchid4',bins = 45)+xlim(0,3)
#将条柱数目设置为45,xlim将x轴范围限定0-3
geom_line/geom_path/geom_step
绘制一个简单的线图
ggplot(economics,aes(date,unemploy))+geom_line(color='red')
#使用economics数据集,反映时间和失业率的变化
线的颜色出现了渐变
ggplot(economics_long,aes(date,value01))+geom_line(aes(linetype=variable,color=variable))
#改变线型
methods还有其他的方法,如glm:广义线性模型;losses:纯粹平滑;gam:广义加性模型等等(lm和glm最常用)
mydata <- data.frame(time=seq(2000,2016,1),
m_value=rnorm(17,20,5),
sd_value=runif(17,1,3))
ggplot(mydata,aes(time,m_value))+geom_line(color='deeppink4',size=1)+
geom_line(aes(time,m_value+1.96*sd_value),color='black',linetype=2)+
geom_line(aes(time,m_value-1.96*sd_value),color='black',linetype=2)+
geom_ribbon(aes(time,ymin=m_value-1.96*sd_value,ymax=m_value+1.96*sd_value),fill='light green',alpha=0.3)
#geom_line绘制了三条线,中间是均值曲线,两边则分别是95%置信区间的上限和下限曲线,linetype=2是虚线
#geom_ribbon函数:绘制色带
geom_hline绘制水平线,geom_vline绘制垂直线。xintercept和yintercept是截距,slope是斜率。
ggplot(mpg,aes(displ,hwy))+geom_point(color='deeppink2')+
geom_hline(yintercept=c(15,25,35),linetype=2,color='black')+
geom_vline(xintercept=c(3,4.5,6),linetype=2,color='green')+
geom_abline(slope = 6,intercept = 5,color='blue')