# 13.其他图形
# 13.1 绘制相关矩阵图
mtcars
mcor <- cor(mtcars)
# 输出mcor,保留两位小数
round(mcor,digits = 2)
# 如果数据含有不能用来计算系统的任何列,应该先将这些列剔除。
# 如果在原始数据中存在缺失值(NA),得到的相关矩阵中也会有缺失值。
# 可以使用函数选项use="complete.obs"或者use="pairwise.complete.obs"
# 使用corrplot包来绘制相关矩阵图
library(corrplot)
corrplot(mcor)
# 使用颜色方块和黑色文本标签,并且上边的文本标签呈45°右倾
corrplot(mcor,method = "shade",shade.col = NA,tl.col = "black",tl.srt = 45)
# 对矩阵重新排序,这样相近的变量在图中会更近,其中使用的参数时order="AOE"(前两个特征向量的角排序)
# 生成一个淡一点的调色板
col <- colorRampPalette(c("#BB4444","#EE9988","#FFFFFF","#77AADD","#4477AA"))
corrplot(mcor,method = "shade",shade.col = NA,tl.col = "black",tl.srt = 45,col = col(200),addCoef.col = "black",cl.pos="no",order = "AOE")
# 13.2绘制函数曲线
# 使用stat_function()函数
library(ggplot2)
# 这个数据库仅仅用来设定范围
p <- ggplot(data.frame(x=c(-3,3)),aes(x=x))
p+stat_function(fun = dnorm)
# 某些函数需要格外的参数
p+stat_function(fun = dt,args = list(df=2))
# 绘制自定义的函数
myfun <- function(xvar){
1/(1+exp(-xvar+10))
}
ggplot(data.frame(x=c(0,20)),aes(x=x))+stat_function(fun = myfun)
# 计算函数值时默认使用了给出x范围内的101个点。
# 为了让曲线更加光滑,可以给stat_function()传递一个更大的n
ggplot(data.frame(x=c(0,20)),aes(x=x))+stat_function(fun = myfun,n=200)
# 13.3 在函数曲线下添加阴影
# 根据曲线函数定义一个新的函数,把x范围外对应的值替换为NA
# 在0<x<2时返回dnorm(x),其他的时候返回NA
dnorm_limit <- function(x){
y <- dnorm(x)
y[x<0|x>2] <- NA
return(y)
}
# ggplot()使用“哑”数据
p <- ggplot(data.frame(x=c(-3,3)),aes(x=x))
p+stat_function(fun = dnorm_limit,geom = "area",fill="blue",alpha=0.2)+stat_function(fun = dnorm)
# 给这个函数传入的是一个向量,并不是一个单独的值。
# R中有第一类函数,可以写一个函数来返回一个闭包。也就是说,可以编写一个能够编写函数的函数
limitRange <- function(fun,min,max){
function(x){
y <- fun(x)
y[x<min|y>max] <-NA
return(y)
}
}
# 调用这个函数来生成另一个函数
dlimit <- limitRange(dnorm,0,2)
# 仅对0-2之间的输入返回输出值
dlimit(-2:4)
# 使用limitRange()来生成函数,并传递给stat_function():
p+stat_function(fun = dnorm)+stat_function(fun = limitRange(dnorm,0,2),geom = "area",fill="blue",alpha=0.2)
# limitRange()函数可以用来生成任何函数的“区间限制式”函数。
# 13.4绘制网络图
# 使用igraph包。
# 首先给graph()函数传递一个包含所有边的向量,然后绘制结果对象
install.packages("igraph")
library(igraph)
# 指定一个有向图的边
gd <- graph(c(1,2,2,3,2,4,1,4,5,5,3,6))
plot(gd)
# 一个无向图
gu <- graph(c(1,2,2,3,2,4,1,4,5,5,2,6),directed = FALSE)
# 不画标签
plot(gu,vertex.label=NA)
# 图对象的结构
str(gd)
str(gu)
# 在网络图中,节点的位置并不是由所给数据确定的,它们是随机放置的。
set.seed(200)
plot(gu)
# 从数据库直接生成图
# Fruchterman-Reingold布局算法。该算法的主要思想是所有节点之间都有电磁斥力,但是连接节点的边像弹簧一样,会把相应的节点拉在一起
library(gcookbook)
madmen2
# 从数据集中生成图对象
g <- graph.data.frame(madmen2,directed = TRUE)
# 移除多余的空白边
par(mar=c(0,0,0,0))
plot(g,layout=layout.fruchterman.reingold,vertex.size=8,edge.arrow.size=0.5,vertex.label=NA)
# 使用圆圈布局
g <- graph.data.frame(madmen,directed = FALSE)
par(mar=c(0,0,0,0))
plot(g,layout=layout.circle,vertex.size=8,vertex.label=NA)
# igraph的一个替代选择是Rgraphviz,该包是Graphviz(一个绘制网络图的开源库)的前端。
# 它的优点是能更方便地处理标签,而且也更容易控制布局。但是它比较难安装,其由Bioconductor系统库维护
# 13.5 在网络图中使用文本标签
# 可以给vertex.label参数传递一个命名向量
library(igraph)
library(gcookbook)
# 赋值madmen并删除偶数行
m <- madmen[1:nrow(madmen)%%2==1,]
g <- graph.data.frame(m,directed = FALSE)
# 输出节点名称
V(g)$name
plot(g,layout=layout.fruchterman.reingold,
vertex.size = 4, #让节点更小
vertex.label = V(g)$name, #设置标签
vertex.label.cex = 0.8, #小号字体
vertex.label.dist = 0.4, #标签和节点的位置错开
vertex.label.color = "black"
)
# 第二种方法:使用V()$xxx <-来代替vertex.xxx参数传递值。
V(g)$size <- 4
V(g)$label <- V(g)$name
V(g)$label.cex <- 0.8
V(g)$label.dise <- 0.4
V(g)$label.color <- "black"
# 设置这个图的属性
g$layout <- layout.fruchterman.reingold
plot(g)
# 设置边的属性,使用E()函数或者给edge.xxx参数传递相应的值
# 查看边
E(g)
# 将几个边的名字赋值为“M”
E(g)[c(2,11,19)]$label <- "M"
# 将所有边颜色设置为灰色,然后把其中的几个变为红色
E(g)$color <- "grey70"
E(g)[c(2,11,19)]$color <- "red"
plot(g)
# 13.6 如何绘制热图
# 使用geom_tile()或者geom_raster(),并将一个连续变量映射到fill上
presidents
str(presidents)
# 将其转化为ggplot()可用的数据框格式,其中的列都是数值形式
pres_rating <- data.frame(
rating = as.numeric(presidents),
year = as.numeric(floor(time(presidents))),
quarter = as.numeric(cycle(presidents))
)
pres_rating
# 基础图形
p <- ggplot(pres_rating,aes(x=year,y=quarter,fill=rating))
# 使用geom_tile()
p+geom_tile()
# 使用geom_raster()
p+geom_raster()
# geom_tile()和geom_raster()的结果看起来一样,实际上,它们是有区别的。
# 自定义热图的外观
p+geom_tile()+scale_x_continuous(breaks = seq(1940,1976,by=4))+scale_y_reverse()+scale_fill_gradient2(midpoint = 50,mid = "grey70",limits=c(0,100))
# 13.7 绘制三维散点图
# 使用rgl包,该包提供了OpenGL图形库的3D绘图接口。要画三维散点图,可使用plot3d()函数。
# 其输入参数可以是两种形式:(1)一个数据框,前三列分别表示x,y,z的坐标;(2)直接传递三个向量,分别表示x,y,z的坐标。
install.packages("rgl")
library(rgl)
plot3d(mtcars$wt,mtcars$disp,mtcars$mpg,type = "s",size = 0.75,lit=FALSE)
# 默认情况下,plot3d()函数使用立方体式的点。
# type="s"选择球形点,size=0.75让点变小,lit=FASLE关闭3D灯光(否则点会闪闪发亮)
# 添加数值线段来增强空间点的位置表达力度
# 交错出现两个向量的值。
interleave <- function(v1,v2) as.vector(rbind(v1,v2))
# 绘制点
plot3d(mtcars$wt,mtcars$disp,mtcars$mpg,xlab = "Weight",ylab="Displacement",zlab="MPG",size = .75,type = "s",lit=FALSE)
# 添加线段
segments3d(interleave(mtcars$wt,mtcars$wt),interleave(mtcars$disp,mtcars$disp),interleave(mtcars$mpg,min(mtcars$mpg)),alpha=0.4,col="blue")
# 不画坐标刻度和标签
plot3d(mtcars$wt,mtcars$disp,mtcars$mpg,xlab = "",ylab = "",zlab = "",axes=FALSE,size=.75,type = "s",lit=FALSE)
segments3d(interleave(mtcars$wt,mtcars$wt),interleave(mtcars$disp,mtcars$disp),interleave(mtcars$mpg,min(mtcars$mpg)),alpha=0.4,col="blue")
# 绘制盒子
rgl.bbox(color="grey50", # 表面颜色为grey60,黑色文本
emission="grey50", # 光照颜色为grey50
xlen = 0,ylen = 0,zlen = 0 # 不添加刻度
)
# 设置默认颜色为黑
rgl.material(color = "black")
# 在指定边添加坐标轴标签,可能的值类似于“x--”,“x-+”,"x+-",“x++”
axes3d(edges = c("x--","y+-","z--"),nticks = 6, # 每个轴上6个刻度线
cex=.75#较小的字体
)
# 添加坐标标签,“line"指定标签和坐标轴的距离
mtext3d("Weight",edge = "x--",line = 2)
mtext3d("Displacement",edge = "y+-",line = 3)
mtext3d("MPG",edge = "z--",line = 3)
# 13.8在三维图上添加预测曲面
# 首先,需要定义一些功能函数来得到模型的预测值
# 给定一个模型,根据xvar和yvar预测zvar
# 默认为变量x和y的范围,生成16*16的网格
predictgrid <- function(model,xvar,yvar,zvar,res=16,type=NULL){
# 计算预测变量的范围,下面的代码对lm、glm以及其他模型方法都适用,
# 但针对其他模型方法时可能需要适当调整
xrange <- range(model$model[[xvar]])
yrange <- range(model$model[[yvar]])
newdata <- expand.grid(x=seq(xrange[1],xrange[2],length.out = res),
y=seq(yrange[1],yrange[2],length.out = res))
names(newdata) <- c(xvar,yvar)
newdata[[zvar]] <- predict(model,newdata = newdata,type = type)
newdata
}
# 将长数据框中的x,y,z转化为列表
# 其中x,y为行列值,z为矩阵
df2mat <- function(p,xvar=NULL,yvar=NULL,zvar=NULL){
if(is.null(xvar)) xvar <- names(p)[1]
if(is.null(yvar)) yvar <- names(p)[2]
if(is.null(zvar)) zvar <- names(p)[3]
x <- unique(p[[xvar]])
y <- unique(p[[yvar]])
z <- unique(p[[zvar]],nrow=length(y),ncol=length(x))
m <- list(x,y,z)
names(m) <- c(xvar,yvar,zvar)
m
}
# 交错出现两个向量的元素
interleave <- function(v1,v2) as.vector(rbind(v1,v2))
# 利用surface3d()函数在原散点图上添加网格式的预测图
library(rgl)
m <- mtcars
# 生成线性模型
mod <- lm(mpg~wt+disp+wt:disp,data=m)
# 根据wt和disp,得到mpg的预测值
m$pred_mpg <- predict(mod)
# 根据wt和disp的网格,得到mpg的预测值
mpgrid_df <- predictgrid(mod,"wt","disp","mpg")
mpgrid_list <- df2mat(mpgrid_df)
# 根据数据点绘图
plot3d(m$wt,m$disp,m$mpg,type = "s",size = 0.5,lit=FALSE)
# 添加预测点(较小)
spheres3d(m$wt,m$disp,m$pred_mpg,alpha=0.4,type = "s",size = 0.5,lit=FALSE)
# 添加表示误差的线段
segments3d(interleave(m$wt,m$wt),interleave(m$disp,m$disp),interleave(m$mpg,m$pred_mpg),alpha=0.4,col="red")
# 添加预测点网络
surface3d(mpgrid_list$wt,mpgrid_list$disp,mpgrid_list$mpg,alpha=0.4,front = "lines",back="lines")
# 调节图形的外观,逐一添加图形的各个组件
plot3d(mtcars$wt,mtcars$disp,mtcars$mpg,xlab = "",ylab = "",zlab = "",axes = FALSE,size = .5,type = "s",lit=FALSE)
# 添加预测点(较小)
spheres3d(m$wt,m$disp,m$pred_mpg,alpha=0.4,type="s",size=0.5,lit=FALSE)
# 添加误差线段
segments3d(interleave(m$wt,m$wt),interleave(m$disp,m$disp),interleave(m$mpg,m$pred_mpg),alpha=0.4,col="red")
# 添加预测值网络
surface3d(mpgrid_list$wt,mpgrid_list$disp,mpgrid_list$mpg,alpha=0.4,front="lines",back="lines")
# 绘制盒子
rgl.bbox(color="grey50", # 表面颜色为grey60,黑色文本
emission = "grey50", # 光照颜色为grey50
xlen = 0,ylen = 0,zlen = 0
)
# 对象默认色设置为黑色
rgl.material(color = "black")
# 在指定边添加坐标轴标签。可能的值类似于“x--”,"x-+","x+-"和“x++"
axes3d(edges = c("x--","y+-","z--"),nticks = 6, # 每个轴上6个刻度线
cex=.75 # 较小字体
)
# 添加坐标标签,“line"指定标签和坐标轴的距离。
mtext3d("Weight",edge = "x--",line=2)
mtext3d("Displacement",edge = "y+-",line=3)
mtext3d("MPG",edge = "z--",line = 3)
# 13.9 保存三维图
# 使用rgl.snapshot()来保存rgl包绘制的位图。它会精确捕捉屏幕上的图形
library(rgl)
plot3d(mtcars$wt,mtcars$disp,mtcars$mpg,type = "s",size = 0.75,lit=FALSE)
rgl.snapshot("3dplot.png",fmt = "png")
# 也可以使用rgl.postscript()保存为PostScript或PDF格式文件:
rgl.postscript("3dplot.pdf",fmt = 'pdf')
rgl.postscript("3dplot.ps",fmt = 'ps')
# PostScript和PDF输出文件并不支持rgl以来的OpenGL库的很多特性。
# 保存当前视角
view <- par3d("userMatrix")
# 恢复保存的视角
par3d(userMatrix = view)
# 将视角保存为代码,使用dput()函数,然后将输出复制粘贴到自己的代码中
dput(view)
view <- structure(c(1, 0, 0, 0, 0, 0.342020143325668, -0.939692620785909,
0, 0, 0.939692620785909, 0.342020143325668, 0, 0, 0, 0, 1), .Dim = c(4L,
4L))
par3d(userMatrix = view)
# 13.10 三维图动画
# 旋转三维图能够更完整、多方位地观察数据,可以在play3d()中使用spin3d()来生成三维动画
library(rgl)
plot3d(mtcars$wt,mtcars$disp,mtcars$mpg,type = "s",size = 0.75,lit=FALSE)
# play3d(spin3d())
# 默认情况下,图像会绕着z轴(竖直的轴)旋转。
# 绕x轴转动,每分钟4转,持续20秒钟
play3d(spin3d(axis = c(1,0,0),rpm = 4),duration = 20)
# 使用movie3d()来保存动画,方法和play3d()一样。它将会生成一系列.png格式的图片文件,每个文件代表一帧,然后利用ImageMagick软件提供的convert命令将这些文件合并转化为.gif动画文件
# 绕z轴转动,每分钟4转,持续15秒
movie3d(spin3d(axis = c(0,0,1),rpm = 4),duration = 15,fps = 50)
# 输出的文件将会被存放在一个临时文件夹中,地址名会在R窗口中输出。
# 如果不想利用ImageMagick将输出的图片装换为.gif。可以设置convert = FALSE,然后用其他软件将这一系列的.png文件转换为动画
# 13.11绘制谱系图
# 使用hclust()并画出它的结果
library(gcookbook)
# 得到2009年的数据
c2 <- subset(countries,Year==2009)
# 去掉含有NA的行
c2 <- c2[complete.cases(c2),]
# 随机选择25个国家
# (设定随机种子保证可重复性)
set.seed(201)
c2 <- c2[sample(1:nrow(c2),25),]
c2
# 去掉聚类中不需要的列
rownames(c2) <- c2$Name
c2 <- c2[,4:7]
c2
# 数据标准化
c3 <- scale(c2)
c3
# scale()函数默认是将每一列相对于其标准差进行标准化
hc <- hclust(dist(c3))
# 画树状图
plot(hc)
# 对齐文本
plot(hc,hang = -1)
# 聚类分析是把n维空间中把点分配到类的一种简单方法。层次聚类分析则将每组分成两个更小的组,以谱系展示
# 对于距离的计算,使用的是默认的方法——“euclidean",这个方式计算的是点与点之间的欧氏距离;还有其他方法,比如”maximum","manhattan","canberra","binary"和"minkowski".
# hclust()函数提供了几种做聚类分析的方法,默认的方法是“complete”;其他可用的方法包括“ward”,"single","average","mcquitty","median"和”centroid“。
# 13.12 绘制向量场
# 使用geom_segment()函数
library(gcookbook)
isabel
# 每段都有一个起点和一个终点。用x和y值作为每段起点,然后在此基础上分别加上vx和vy的一个比例,以此作为终点,如果不按比例缩小这些取值,线条就会变得很长
islice <- subset(isabel, z==min(z))
library(ggplot2)
ggplot(islice,aes(x=x,y=y))+geom_segment(aes(xend=x+vx/50,yend=y+vy/50),size=0.25) # 线段0.25mm粗
# 向量场有两个问题:数据分辨率太高不太容易阅读,而且每段没有箭头表示方向。为了降低分辨率,定义一个函数every_n(),在数据的每n个值中保留一个,其他的去掉。
# 选择z取值等于z的最小值的部分数据
islice <- subset(isabel,z==min(z))
# 向量x中每“by”个只里面保留一个
every_n <- function(x,by=2){
x <- sort(x)
x[seq(1,length(x),by=by)]
}
# x和y每四个值保留一个
keepx <- every_n(unique(isabel$x),by=4)
keepy <- every_n(unique(isabel$y),by=4)
# 保留那些x值在keepx中并且y值在keepy中的数据
islicesub <- subset(islice,x%in%keepx&y%in%keepy)
# 使用arrow(),需要加载grid包
library(grid)
# 用子集画图,箭头的长度为0.1cm
ggplot(islicesub,aes(x=x,y=y))+geom_segment(aes(xend=x+vx/50,yend=y+vy/50),arrow = arrow(length = unit(0.1,"cm")),size=0.25)
# 箭头的一个影响是,短的向量会表现得比它实际长度的比例更大,这会导致曲解数据,为了减轻这种影响,把速度映射到其他属性上可能是有用的
# “speed”列包含z的部分,计算水平速度
islicesub$speedxy <- sqrt(islicesub$vx^2+islicesub$vy^2)
# 映射速度到透明度alpha
ggplot(islicesub,aes(x=x,y=y))+geom_segment(aes(xend=x+vx/50,yend=y+vy/50,alpha=speed),arrow = arrow(length = unit(0.1,"cm")),size=0.6)
install.packages("maps")
library(maps)
# 得到美国地图数据
usa <- map_data("usa")
# 把数据映射到颜色上,颜色从“grey80"到”darkred"
ggplot(islicesub,aes(x=x,y=y))+geom_segment(aes(xend=x+vx/50,yend=y+vy/50,colour=speed),arrow = arrow(length = unit(0.1,"cm")),size=0.6)+
scale_color_continuous(low="grey80",high = "darkred")+geom_path(aes(x=long,y=lat,group=group),data=usa)+coord_cartesian(xlim=range(islicesub$x),ylim = range(islicesub$y))
# isabel数据集是一个三维数据,画一个分面的图形
# x和y中每5个值保留1个,z中每两个值保留一个
keepx <- every_n(unique(isabel$x),by=5)
keepy <- every_n(unique(isabel$y),by=5)
keepz <- every_n(unique(isabel$z),by=2)
isub <- subset(isabel,x%in%keepx&y%in%keepy&z%in%keepz)
ggplot(isub,aes(x=x,y=y))+geom_segment(aes(xend=x+vx/50,yend=y+vy/50,colour=speed),arrow = arrow(length = unit(0.1,"cm")),size=0.5)+scale_color_continuous(low = "grey80",high = "darkred")+facet_wrap(~z)
# 13.13绘制QQ图
# 使用qqnorm()和正态分布比较。给qqnorm()一个数值向量,在此基础上用qqline()加上理论分布
library(gcookbook)
# height的QQ图
qqnorm(heightweight$heightIn)
qqline(heightweight$heightIn)
# age的QQ图
qqnorm(heightweight$ageYear)
qqline(heightweight$ageYear)
# ggplot2有一个stat_qq()函数,但是没有提供画QQ线的简单方法
# 13.14绘制经验累积分布函数图
# 使用stat_ecdf()
library(gcookbook)
# heightIn的ecdf
ggplot(heightweight,aes(x=heightIn))+stat_ecdf()
# ageYear的ecdf
ggplot(heightweight,aes(x=ageYear))+stat_ecdf()
# ECDF表明了在观察数据中,小于或等于给定x值得观测所占的比例。因为是经验分布,所以累积分布线在每个有一个或者更多观测值得x值处产生一个阶梯。
# 13.15 创建马赛克图
# 使用vcd包里的mosaic()函数。
UCBAdmissions
# 显示“平铺”后的列联表
ftable(UCBAdmissions)
dimnames(UCBAdmissions)
# 使用mosaic()函数,输入的公式要包含在分割数据中使用的变量
install.packages("vcd")
library(vcd)
# 按照先Admit然后Gender再Dept的顺序分割数据
mosaic(~Admit+Gender+Dept,data = UCBAdmissions)
mosaic(~Dept+Gender+Admit,data=UCBAdmissions,highlighting = "Admit",highlighting_fill=c("lightblue","pink"),direction=c("v","h","v"))
# 另一种可能的分割方向
mosaic(~Dept+Gender+Admit,data = UCBAdmissions,highlighting = "Admit",highlighting_fill=c("lightblue","pink"),direction=c("v","v","h"))
# 这个顺序比较男和女不是很容易
mosaic(~Dept+Gender+Admit,data = UCBAdmissions,highlighting = "Admit",highlighting_fill=c("lightblue","pink"),direction=c("v","h","h"))
# mosaicplot是另外一个画马赛克图的函数
# 13.16 绘制饼图
# 使用pie()函数
library(MASS)
# 得到fold变量每个水平的频数
fold <- table(survey$Fold)
fold
# 画饼图
pie(fold)
# 提供一个命名的向量,或者一个只有数值的向量和一个标签向量
pie(c(99,18,120),labels = c("L on R","Neither","R on L"))
# 13.17 创建地图
# 从maps包里面获取地图数,用geom_polygon()(可以用颜色填充)或者geom_path()(不能填充)绘制
# 经度和纬度默认是画在直角坐标系中的,可以用coord_map()指定一个投影。
# 默认的投影是“mercator"(墨卡托投影),和直角坐标系不一样,墨卡托投影中纬度线之间的距离会逐渐发生变化
library(maps)
# 美国地图数据
states_map <- map_data("state")
ggplot(states_map,aes(x=long,y=lat,group=group))+geom_polygon(fill="white",colour="black")
# geom_path(没有填充)和墨卡托投影
install.packages("mapproj")
ggplot(states_map,aes(x=long,y=lat,group=group))+geom_path()+coord_map("mercator")
map_data("state")
# 世界地图数据
world_map <- map_data("world")
world_map
sort(unique(world_map$region))
euro <- map_data("world",region = c("UK","France","Netherlands","Belgium"))
# Map region to fill color
ggplot(euro,aes(x=long,y=lat,group=group,fill=region))+geom_polygon(colour="black")+scale_fill_brewer(palette = "Set2")+scale_y_continuous(limits = c(40,60))+scale_x_continuous(limits = c(-25,25))
# 从世界地图中得到新西兰地图数据
nzl <- map_data("world",region = "New Zealand")
nzl <- subset(nzl,long>0&lat>-48) # 剔除岛屿
ggplot(nzl,aes(x=long,y=lat,group=group))+geom_path()
# 从新西兰(nz)地图中得到新西兰地图数据
nz2 <- map_data("nz")
ggplot(nz2,aes(x=long,y=lat,group=group))+geom_path()
# 查看mapdata包获得更多地图数据,查看map()函数,快速产生地图,查看mapproject获得地图的投影方法
# 13.18绘制等值区域图
# 把变量值和地图数据合并在一起,然后把一个变量映射到fill上
# 把USArrests数据集转换成正确的格式
crimes <- data.frame(state=tolower(rownames(USArrests)),USArrests)
crimes
library(maps)
states_map <- map_data("state")
# 合并数据集
crime_map <- merge(states_map,crimes,by.x = "region",by.y = "state")
# 合并之后,顺序发生了变化,可能会导致多边形位置不对,所以要对数据排序
head(crime_map)
library(plyr) # 为了使用arrange()函数
# 按group,order排序
crime_map <- arrange(crime_map,group,order)
head(crime_map)
# 画图,把一列数值映射到fill上
ggplot(crime_map,aes(x=long,y=lat,group=group,fill=Assault))+geom_polygon(colour="black")+coord_map("polyconic")
# 展示变量值如何从某个中点值向外发散的,可以用scale_fill_gradient2()
ggplot(crimes,aes(map_id = state,fill=Assault))+geom_map(map=states_map,colour="black")+scale_fill_gradient2(low = "#559999",mid = "grey90",high = "#BB650B",midpoint = median(crimes$Assault))+expand_limits(x=states_map$long,y=states_map$lat)+coord_map("polyconic")
# 找到分位数的边界
qa <- quantile(crimes$Assault,c(0,0.2,0.4,0.6,0.8,1.0))
qa
# 加入一个分位数类别的列
crimes$Assault_q <- cut(crimes$Assault,qa,labels = c("0-20%","20-40%","40-60%","60-80%","80-100%"),include.lowest = TRUE)
crimes
# 产生一个5个离散取值的调色板
pal <- colorRampPalette(c("#559999","grey80","#BB650B"))(5)
pal
ggplot(crimes,aes(map_id=state,fill=Assault_q))+geom_map(map = states_map,colour="black")+scale_fill_manual(values = pal)+expand_limits(x=states_map$long,y=states_map$lat)+coord_map("polyconic")+labs(fill="Assault Rate\nPercentile")
# 另一个画等值区域图(Choropleth Map)的方法是使用geom_map(),它不需要把变量取值和地图数据结合起来,因此可以比之前的方法更快地生成地图
# crimes中‘state'列要和state_map中的’region‘列匹配
ggplot(crimes,aes(map_id = state,fill=Assault))+geom_map(map=states_map)+expand_limits(x=states_map$long,y=states_map$lat)+coord_map("polyconic")
# 13.19创建空白背景的地图
# 首先保存下面的主题
# 创建一个去掉了很多背景元素的主题
theme_clean <- function(base_size=12){
require(grid) # unit()函数需要
theme_grey(base_size)%+replace%
theme(
axis.title = element_blank(),
axis.text = element_blank(),
panel.background = element_blank(),
panel.grid = element_blank(),
axis.ticks.length = unit(0,"cm"),
axis.ticks.margin = unit(0,"cm"),
panel.margin = unit(0,"lines"),
plot.margin = unit(c(0,0,0,0),"lines"),
complete=TRUE
)
}
# 然后把它加在地图上。
ggplot(crimes,aes(map_id=state,fill=Assault_q))+geom_map(map = states_map,colour="black")+scale_fill_manual(values = pal)+expand_limits(x=states_map$long,y=states_map$lat)+coord_map("polyconic")+labs(fill="Assault Rate\nPercentile")+theme_clean()
# 13.20 基于空间数据格式(shapefile)创建地图
# maptools包中的readShapePoly()载入空间数据文件,用fortify()把数据转化为数据框的格式,然后画图
install.packages("maptools")
library(maptools)
# 载入空间数据并转化为数据框
uk_shp <- readShapePoly("GBR_adm/GBR_adm2.shp")
uk_map <- fortify(uk_shp)
ggplot(uk_map,aes(x=long,y=lat,group=group))+geom_path()
# Esri shapefile是一种很常用的地图数据,readShapePoly()函数读入空间数据文件,返回一个SpatialPolygonsDataFrame对象
uk_shp <- readShapePoly("GBR_adm/GBR_adm2.shp")
# 查看该对象的格式
str(uk_shp)
# 把它转为常规的数据框
uk_map <- fortify(uk_shp)
uk_map
# 实际上,也可以直接在ggplot()中输入SpatialPolygonsDataFrame对象,这里自动使用了fortify():
ggplot(uk_shp,aes(x=long,y=lat,group=group))+geom_path()
# 数据集和其他空间数据集在http://www.gadm.org/网站上下载。
相关推荐
R语言ggplot2教程 十张图带你入门ggplot2
ggplot2入门教程,散点图、折线图、直方图柱状图
瓷片图绘制教程,R语言ggplot2绘图笔记
瓷片图像地板砖一样,由许多个小格子组成,不用的颜色深浅可以用来表示不同的值,横轴和纵轴可以用来展示不同的位置,二维码图、马赛克图、热图等都有异曲同工之妙。根据tile单词的翻译就能明白,这个函数的功能就是创建瓷片图,也就是色块,本质上是根据数据计算元素的位置和填充颜色,这也是一个非常基础的功能。增加一些主题美化代码,即可获得如下结果图,数据是随机生成的,没有实际含义,仅提供绘图思路和方法,请您根据实际需要进行修改。这种类型的图表非常适合展示二维数据的矩阵,其中每个瓷砖的颜色可以表示矩阵中对应元素的值。
R语言—可视化学习笔记(张杰著)
q'q'qqqq
R语言ggplot2 (一):ggplot2包安装和初始作图
ggplot2是一款强大的图形可视化R包,其作图方式易于理解,且生成的图形精美,定制化程度也很高,应该是R里面最流行的可视化工具。本文关注于ggplot2包的安装、ggplot2基本作图语法等。 一 ggplot2的安装 > .libPaths("~/R/lib") 如果不安装到默认路径,可以在此设置安装路径 > install.packages("ggplot2") #以上代...
R语言ggplot2数据可视化
R数据科学 - ggplot2数据可视化
玩转数据可视化之R语言ggplot2:(一)ggplot2实现箱线图、小提琴图、直方图等图形(快速入门)
玩转R语言ggplot2数据可视化 本系列主要介绍R语言ggplot2的使用 参考资料: ggplot2: Elegant Graphics for Data Analysis 文章目录玩转R语言ggplot2数据可视化1.使用案例数据 ggplot2是R语言数据可视化中的重要库之一。本章介绍如何使用ggplot()实现重要的基本图形。 1.使用案例数据 本章中,我们使用ggplot2中的自带数据集mpg, ...
R语言数据可视化教程(ggplot2)_控制图形的整体外观及增加图例
# 9.控制图形的整体外观# 9.1 设置图形标题# 使用ggtitle()设置标题library(ggplot2)library(gcookbook)p <- ggplot(heightweight,aes(x=ageYear,y=heightIn))+geom_point()p + ggtitle("Age and Height of Schoolchildren")# 使用\n来换行p...
玩转数据可视化之R语言ggplot2:(四)单一基础几何图形绘制
玩转数据可视化之R语言ggplot2 小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生。本系列主要介绍R语言ggplot2的使用 参考资料: ggplot2: Elegant Graphics for Data Analysis 文章目录玩转数据可视化之R语言ggplot24. 玩转数据可视化之ggplot2:单一几何图形绘制 4. 玩转数据可视化之ggplot2:单一几何图形绘制 这些几何图形是ggplot2的基本组成部分。可以用于构造更复杂的几何体。也是ggplot最基础的图形 这些几
R语言数据可视化教程(ggplot2)_输入图形以展示
# 第14章 输出图形用以展示# 一般而言,数据可视化为两个目标服务:发现和沟通。# 14.1 输出为PDF矢量文件# 有两种方法输出PDF文件。一种方法是,使用pdf()打开图形设备,绘制图形,然后使用dev.off()关闭图形设备。这种方法适用于R中的大多数图形,包括基础图形和基于网格的图形# width(宽度)和height(高度)的单位为英寸library(ggplot2)pdf("3dp...
使用ggplot2包在一张图中画出两条线实战
综上所述,通过使用ggplot2包,我们可以轻松地在一张图中画出两条线。图形还包含了适当的标题、轴标签和图例,以及经过调整的坐标轴范围和主题。接下来,我们可以使用ggplot函数创建一个基本的图形对象,并添加两条线。它可以帮助我们创建美观、清晰的图表,并且提供了许多功能和选项来自定义图形。在本文中,我们将使用ggplot2包来展示如何在一张图中画出两条线。现在,我们已经成功创建了一个包含两条线的基本图形对象。接下来,我们可以使用ggplot2的其他函数来自定义图形的外观。现在,我们已经完成了图形的绘制。
大数据审计常用的算法模型
数据预处理:用聚类算法(K-Means)对数据分组,缩小分析范围;异常初筛:用孤立森林/DBSCAN快速标记疑似异常样本;风险分级:用随机森林/XGBoost对疑似异常打分,确定核查优先级;关联深挖:用FP-Growth挖掘异常样本背后的人员/流程关联;文本佐证:用BERT分析相关合同/审批文本,获取舞弊证据。例如,某审计项目通过“K-Means分组→孤立森林标异常→FP-Growth找关联→BERT审合同”的流程,仅用1周就完成了过去3个月需10人团队的工作量,且挖出2起隐藏的串标舞弊案。
ggplot2
1R使用教程中的ggplot2作图方法 30 ggplot的各种图形 | R语言教程 (pku.edu.cn) 2ggplot2作图 R语言学习笔记——ggplot2作图 - 简书 (jianshu.com) 3ggplot2作图最全教程(上) - 知乎 (zhihu.com)
SpringBoot+Vue前后端分离项目实战:个人博客系统
MyBlog主要是基于 SpringBoot + Vue 前后端分离开发的一款动态个人博客系统,后台和前台均通过JSON数据做交互,主要功能有文章管理、分类管理、标签管理、附件管理、评论管理、友链管理、个人资料/博客信息管理等。
Data Visualization in R with ggplot2 R中的数据可视化与ggplot2 Lynda课程中文字幕
Data Visualization in R with ggplot2 中文字幕 ## R中的数据可视化与ggplot2 中文字幕Data Visualization in R with ggplot2 ...
从SolidWorks到Simulink:手把手教你用URDF文件搭建六轴机械臂仿真模型(含STL文件配置避坑)
本文详细介绍了从SolidWorks到Simulink的六轴机械臂URDF仿真全流程,包括URDF文件导出、Simscape模型生成与调试、动力学参数获取与验证等关键步骤。重点解决了STL文件配置、关节接口设置等工程化难题,帮助开发者高效构建可控制的数字孪生体。通过实战案例和优化技巧,提升机械臂仿真效率与准确性。
从工艺到器件:用Silvaco ATLAS仿真PIN二极管击穿电压的保姆级指南
本文详细介绍了使用Silvaco ATLAS仿真PIN二极管击穿电压的全流程指南,从工艺仿真基础搭建到器件结构构建,再到击穿特性仿真和结果分析。通过Silvaco工具链,工程师可以在设计阶段精准预测器件性能,优化击穿电压,提升研发效率。
r语言各形状编号_190+张图片!吐血整理!搞定R语言基础绘图全部知识点
转自:生信宝典|Bio_Data,不一样的生信学习平台原文链接:ggplot2高效实用指南 (可视化脚本、工具、套路、配色)作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源数据可视化是解析、理解和展示数据不可缺少的一部分。炫或不炫看个人喜好和功底,能否达意是最基本的要求---最合适的图示和配色表达最直观的含义。长文多图预警,这是关于ggplot2使用的极详细...
CANoe数据回放实战:如何用Replay Block精准复现实车故障(附ECU数据处理技巧)
本文深入探讨了利用CANoe的Replay Block功能进行数据回放,以精准复现实车偶发性故障的实战方法。文章重点解析了从原始OBD日志中移除目标ECU数据、转换报文方向等核心数据处理技巧,旨在帮助工程师重构真实的网络测试环境,从而高效定位并解决复杂的ECU问题。
ggplot2教程开源项目推荐
ggplot2教程开源项目推荐 ggplot2是一种基于R语言的强大数据可视化包,它以其优雅的图形语法和高度可定制的特性深受数据科学家的喜爱。本项目链接为:ggplot2-tutorial(请忽略链接,以下内容不含链接),该项目是由jennybc维护的一个开源项目,主要使用R语言进行开发。 项目基础介绍 本项目是一个为R语言的ggplot2包提供教学材料的开源项目。它包含了丰富的教学资源和示例代码...
YOLO11实战 第001期-基于yolo11的CrowdHuman密集行人目标检测实战文档(yolo格式数据免费获取)
1.数据阶段在拥挤/遮挡场景下,使用crowdhuman数据集重训练后的yolo11,效果表现较好。crowdhuman数据集标签如下,有Head BBox、Visible BBox、Full BBox。如下图显示:数据集介绍CrowdHuman数据集是旷世发布的用于行人检测的数据集,图片数据大多来自于google搜索。CrowdHuman数据集数据量比较大,15000张,5000张,验证集4370张。训练集和验证集中共有470K个实例,约每张图片包含23个人,同时存在各种各样的遮挡。
TMC2209的UART模式详解:如何用串口调试助手配置细分和电流(避坑指南)
本文深入解析TMC2209步进电机驱动器的UART模式,详细讲解如何通过串口调试助手配置细分和电流,包括硬件连接、通信协议、关键寄存器设置及高级功能应用。提供实战避坑指南,帮助开发者优化步进电机控制性能,适用于精密仪器、3D打印等场景。
ModernDive数据可视化教程:使用ggplot2创建专业统计图表的完整指南
在数据科学的世界中,数据可视化是理解数据、发现模式和传达见解的关键技能。ModernDive项目通过其《Statistical Inference via Data Science: A ModernDive into R and the Tidyverse》一书,为初学者提供了系统的ggplot2数据可视化教程。ggplot2作为R语言中最强大的可视化包,基于图形语法理论,让创建专业统计图表变得
STC单片机 普通 I/O 口中断功能介绍和使用
STC32单片机 普通 I/O 口中断功能介绍和使用
3步搞定ggplot2:R语言数据可视化的入门捷径
想要快速掌握R语言中最强大的数据可视化工具吗?ggplot2就是你的最佳选择!这个基于图形语法的绘图系统,让复杂的图表制作变得简单直观。无论你是数据分析新手还是经验丰富的R用户,ggplot2都能大幅提升你的绘图效率和图表质量。 ## 🚀 一键安装的3种高效方法 ### 方法一:CRAN官方渠道(推荐新手) 直接从R的官方软件仓库安装,稳定性最高: ```R install.package
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
R语言入门 | 使用 ggplot2 进行数据可视化
geom_bar(mapping = aes(x = cut, fill = cut)) //fill明显更常用。#在geom_smooth平滑曲线图中,可以按照不同的线型绘制出不同的曲线,每条曲线对应映射到线型的。#在geom_smooth平滑曲线图中,可以按照不同的线型绘制出不同的曲线,每条曲线对应映射到线型的。x=<变量名>,y=<变量名>,color=<变量名>,shape,size,alpha(透明度)可以将点的颜色映射为变量class ^^^^^^^^^^^^^
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
R语言绘图ggplot-基本参数
R语言绘图ggplot-基本参数
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
1万+



被折叠的 条评论
为什么被折叠?



