R基础绘图

图形分布

有时候我们需要把不同的图形放到一张图里面,做一个组合图进行比较分析,那么在作图之前就需要把画布进行区域划分,R语言划分函数有两个:par()函数和layout()函数。这两个函数都可以将画布进行绘图区域划分;par()函数将图形均匀地划分成几个区域,layout()函数则可以调整划分的比例。

par()函数

par()函数的参数,把不同的图放到一起,预先设定图形分割成几块。

par(mfcol = c(2,3), #mfcol按列排列,mfrow按行排列,c(2,3)两行三列 
    mar = c(2,2,2,2), #margin c(botton, left, top, right) 设置边距
    bg = 'gray')  #backgroud,设置背景颜色

layout()函数

layout()函数可以调整划分的比例,有的子图包含更多的信息,所占空间更大,通过layout()函数就可以实现画布比例的调整。

lay <- layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE), 
              # 2, 2划分为两行两列,byrow = TRUE按行顺数,
              # (1,1,2,3)第一行第一、二列为第一幅图,第二行第一列为第二幅图,第二行第二列为第三幅图
              widths = c(3,2), heights = c(2,3)) #widths = c(3,2)设置第一列比第二列比例为3:2
layout.show(lay) #展示划分结果

泛型函数:plot()

R中最普通的作图函数就是plot()函数,它是一个泛型函数,可以接受很多不同类的对象作为它的作图对象参数;我们这里要解释的是其中的图形参数,而非作图对象参数。可以绘制散点图,折线图。

par(mfcol = c(1,2),
    mar = c(2,2,2,2),
    bg = 'gray')
plot(1:4,5:8) #散点图
plot(c(4,5),c(15,20),type='l') #折线图

我们先来看看plot()的参数有哪些,先通过一张图有一个大概了解。我们用R自带的数据包mtcars来绘图展示一下:

mtcars #R自带的数据集,32辆汽车的样本信息,包括它们的重量,燃油效率,速度等
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
plot(mtcars[,1:2],
     type = 'o', #线的类型
     pch = 16, #点的图形
     col = 'purple', #颜色
     lty = 3, #线的属性
     asp = 1, #图形纵横比y/x
     main = 'mtcars plot', #主标题
     sub = 'test plot', #副标题
     cex = 2, #点的大小
     xlim = c(10,35), #x范围
     ylim = c(4,8), #y范围
     frame = F) #边框的有无

对plot()的参数type、pch进一步解释:

type 图形样式类型,有九种可能的取值,分别代表不同的样式。:’p’⇒画点;’l’⇒画线5;’b’⇒同时画点和线,但点线不相交;’c’⇒ 将type=’b’中的点去掉,只剩下相应的线条部分;’o’⇒同时画点和线,且相互重叠,这是它与type = ’b’的区别;’h’⇒画铅垂线;’s’⇒画阶梯线,从一点到下一点时,先画水平线,再画垂直线;’S’⇒也是画阶梯线,但从一点到下一点是先画垂直线,再画水平线;’n’⇒作一幅空图,没有任何内容,但坐标轴、标题等其它元素都照样显示 (除非用别的设置特意隐藏了)。

par(mfrow = c(3, 3), mar = c(2, 2.5, 3, 2))
for (i in c("p", "l", "b", "c", "o", "h", "s", "S","n")) {
  plot(c(1:4, 5:8), type = i, main = paste("Plot type: \"",
                                           i, "\"", sep = ""), xlab = "")} 

点、线、点线(不相接)、擦掉点的线、点线(相接)、垂线、阶梯(水平起步)、阶梯(垂直起步)、无

pch标记点的类型一共有25种,绘图中可以用不同的点来区分标记的数据类型不同:

plot(0:25, pch = 0:25)

作图常用元素

任何一幅统计图形都是由最基础的图形元素构成的,这些元素我们并不陌生,无非就是颜色、点、线(直线、曲线、线段甚至箭头)、矩形、任意多边形、文本以及图例。R提供了相应的一系列函数,用以向已有的图形中添加图形元素。事实上,R的所有作图函数分为两类,一类是高层函数(high-level),用以生成新的图形,另一类就是低层函数(low-level),这 一类指的正是绘制图形元素的这些基础函数。

波动线lines()

在添加元素之前,先画一个框架,指定坐标轴范围 ,再向图中添加元素

plot(1:10, type = "n", xlim = c(0, 10), ylim = c(0,10))

向图中添加10个正态随机数绝对值的波动线

plot(1:10, type = "n", xlim = c(0, 10), ylim = c(0,10))
lines(1:10, abs(rnorm(10)))

直线abline()

向图中添加不同的直线,y=b*x+a,x=2,y=2

plot(1:10, type = "n", xlim = c(0, 10), ylim = c(0,10))
abline(a = 2, b = 1, col = "gray") #y=b*x+a
abline(v = 2, lty = 2) #x=2,vertical
abline(h = 2, lty = 2) #y=2,horizontal

点point()

添加固定位置的点,可以根据泛型函数中点的特性参数来调节点的类型,R语言中这类参数是通用的。

plot(1:10, type = "n", xlim = c(0, 10), ylim = c(0,10))
points(7.5,6)
points(8,8,pch =15)

文本text()

在图形(7,7)的位置添加文本“abline(a = 0, b=1)”,text()可以用来对图中特殊位置或者有指定含义的线条、点、数字进行解释说明

plot(1:10, type = "n", xlim = c(0, 10), ylim = c(0,10))
abline(a = 2, b = 1, col = "gray") #y=b*x+a
text(7, 7, "abline(a = 2, b = 1)") #文本位置在8,3

箭头arrows()

在图形中添加箭头,指定箭头的起点为(8,3.5),终点为(6,5.7),箭头半角为45度,即箭头全角为90度。

plot(1:10, type = "n", xlim = c(0, 10), ylim = c(0,10))
arrows(8, 3.5, 6, 5.7, angle =45 ) 

平行线段segments()

先在图形中添加一段线:起点为(1,2),终点为(3,4); 再在图形中添加平行线段四段:起点分别为(3,6)(3,7)(3,8)(3,9),对应终点分别为(5,6)(6,6)(7,6)(8,6),线段颜色用渐变灰色,再标注线段“segments”

plot(1:10, type = "n", xlim = c(0, 10), ylim = c(0,10))
segments(1,2,3,4)
segments(rep(3, 4), 6:9, rep(5, 4), 6:9, col = gray(seq(0.2,0.8, length = 4))) 
text(4, 9.8, "segments")

网格grid()

在图形中添加网格线,nx,ny分别表示垂直于x轴和y轴的网格,NULL表示保留,NA表示删掉。

plot(1:10, type = "n", xlim = c(0, 10), ylim = c(0,10))
grid(nx = NULL,ny = NA) 

基本图形

散点图

两个变量之间的关系,这种关系可能是线性或非线性的,画一个人造数据的散点图:我们设计了2万个样本,其中有1万个样本点来自于两个独立的标准正态分布,另1万个样本点的坐标落在半径为0.5的圆上,最后将这2万个样本拼起来并打乱顺序。

# install.packages('MSG') 需要先下载R的数据包MSG
library(MSG)
## Warning: 程辑包'MSG'是用R版本4.1.2 来建造的
data(BinormCircle)
plot(BinormCircle)

直方图hist()

直方图,展示连续数据分布最常用的工具,它本质上是对密度函数的一种估计。 geyser是R自带数据,表示喷泉的间隔、持续时间。 (1)默认参数值作频数图;(2)概率密度直方图; (3)调整hist()参数试着减小区间段数,直方图看起来更平滑; (4)用density填充线条的密度,增大区间段数,这样直方图更突兀,作图如下:

library(MASS)
data(geyser) 
par(mfrow = c(2,2), mar = c(3,3,2,0.5), mgp = c(2, 0.5, 0))
hist(geyser$waiting, main = "(1) freq = TRUE", xlab = "waiting")
hist(geyser$waiting, freq = FALSE, main = "(2) freq = FALSE", xlab = "waiting")
hist(geyser$waiting, breaks = 5, density = 20, xlab = "waiting", main = "(3) breaks = 5") #
hist(geyser$waiting, breaks = 40, col = "red", xlab = "waiting", main = "(4) breaks = 40")

箱线图boxplot()

箱线图,从四分位数的角度 出发描述数据的分布,它通过最大值(Q4)、上四分位数(Q3)、中位数 (Q2)、下四分位数(Q1)和最小值(Q0)五处位置来获取一维数据的分布概况。以datasets包 中的杀虫剂数据InsectSprays为例;该数据有两列,第一列为昆虫数目,第二列为杀虫剂种类(ABCDEF),这里是随机抽取的10列数据:

InsectSprays[sample(nrow(InsectSprays), 10), ]
##    count spray
## 17    16     B
## 40     6     D
## 65    15     F
## 31     2     C
## 1     10     A
## 69    26     F
## 64    22     F
## 11    14     A
## 66    16     F
## 6     12     A
InsectSprays
##    count spray
## 1     10     A
## 2      7     A
## 3     20     A
## 4     14     A
## 5     14     A
## 6     12     A
## 7     10     A
## 8     23     A
## 9     17     A
## 10    20     A
## 11    14     A
## 12    13     A
## 13    11     B
## 14    17     B
## 15    21     B
## 16    11     B
## 17    16     B
## 18    14     B
## 19    17     B
## 20    17     B
## 21    19     B
## 22    21     B
## 23     7     B
## 24    13     B
## 25     0     C
## 26     1     C
## 27     7     C
## 28     2     C
## 29     3     C
## 30     1     C
## 31     2     C
## 32     1     C
## 33     3     C
## 34     0     C
## 35     1     C
## 36     4     C
## 37     3     D
## 38     5     D
## 39    12     D
## 40     6     D
## 41     4     D
## 42     3     D
## 43     5     D
## 44     5     D
## 45     5     D
## 46     5     D
## 47     2     D
## 48     4     D
## 49     3     E
## 50     5     E
## 51     3     E
## 52     5     E
## 53     3     E
## 54     6     E
## 55     1     E
## 56     1     E
## 57     3     E
## 58     2     E
## 59     6     E
## 60     4     E
## 61    11     F
## 62     9     F
## 63    15     F
## 64    22     F
## 65    15     F
## 66    16     F
## 67    13     F
## 68    10     F
## 69    26     F
## 70    26     F
## 71    24     F
## 72    13     F
x <- InsectSprays[,1]

将所有的昆虫数目作为样本,进行绘图如下:

boxplot(x)

par(mar = c(2, 2.5, 0.2, 0.1))
boxplot(count ~ spray, data = InsectSprays, col = "lightgray", 
        horizontal = T, pch = 4) #horizontal = T横向

条形图barplot()

条形图,能以矩形条的长度展示 原始数值,对数据没有任何概括或推断。VADeaths是R自带的一个数据包,里面包含了1940年弗吉尼亚州分年龄组、分地区和分性别死亡率数据。

data(VADeaths)
#install.packages('RColorBrewer')
library(RColorBrewer) #调用调色板
par(mfrow = c(2, 1), mar = c(3, 2.5, 0.5, 0.1))
death = t(VADeaths)[, 5:1] #转置、重新排列年龄段
death
##              70-74 65-69 60-64 55-59 50-54
## Rural Male    66.0  41.0  26.9  18.1  11.7
## Rural Female  54.3  30.9  20.3  11.7   8.7
## Urban Male    71.1  54.6  37.0  24.3  15.4
## Urban Female  50.0  35.1  19.3  13.6   8.4
barplot(death, col = brewer.pal(4, "Set1"))
barplot(death, col = brewer.pal(4, "Set1"), 
        beside = TRUE, #beside相邻,不堆叠
        legend = TRUE,#length图例
        horiz = T) #length图例

### 饼图pie() ### 饼图的原理很简单,每一个扇形的角度与相应数据的数值大小成比例。下面我们随意取数来绘制一个饼图:

par(mfcol = c(1,2))
x <- c(95,26,36,78,25,65)
labels <- c("a", "b", "c","d", "e", "f")
pie(x,labels,main = 'Simple Pie Chart')
pct <- round(x/sum(x)*100) #转化百分比
labels2 <- paste(labels,' ',pct,'%',sep = '') #paste连接函数,seperate
labels2
## [1] "a 29%" "b 8%"  "c 11%" "d 24%" "e 8%"  "f 20%"
pie(pct,labels2,col = rainbow(length(labels2)),main = 'Pie Chart with Percentages')

以上绘制的是二维的饼图,R也可以绘制三维的饼图,但是我认为三维饼图与二维饼图相比较,除了视觉效果不同,不能包含更多的数据信息,所以这里没有深入讨论三维饼图。如果有人感兴趣,可以自己研究一下。三维饼图会用到plotrix这个包,需要下载,函数是pie3D(x,labels,explode = 0.1,main = ‘3D Pie Chart’)。

函数图curve()

函数图在金融里面的应用还是非常多的,这里只画了sin(x),cos(x)这两个基础函数,以及一些基本参数的设置:

par(mfcol = c(1,3),mar = c(4,4,0.5,0.5))
curve(sin(x), from = -2*pi, to = 2*pi, n = 100)
curve(sin(x), from = 0, to = 10, n = 100, add = F,
      type = 'l', xlab = 'x', ylab = 'sin(x)',xlim = c(-2,12), ylim = c(-1.5,1.5))
curve(cos(x), from = -2*pi, to = 2*pi, n = 100)

地图map()地图

先来看看map()函数的世界地图和美国地图,地图数据包含在maps这个包里:

# install.packages('maps')
library('maps')
map('world')

map('state',boundary = T,col = 'red',fill = T)

将数据进行可视化,在地图中呈现出来的效果,先调整地图的大小范围:

#install.packages('geosphere') #绘图的包,用到里面的弧线连线函数
library('geosphere') 
## Warning: 程辑包'geosphere'是用R版本4.1.2 来建造的
#设置坐标范围使焦点集中在美国周边,并且设置一些有关颜色
xlim <- c(-171.738, -56.602)#经度
ylim <- c(12.039,71.856)#纬度
map('world', col = '#f2f2f2', fill = T, bg = 'white', xlim = xlim, ylim = ylim)

#给定点的位置,在地图中标注出来,比如芝加哥坐标北纬41°39′、西经87°34′,加拿大多伦多北纬43度39分,西经79度23分
points(-87.34,41.39,pch = 12)
points(-79.23,43.39,pch = 15)

因为图片中表示的范围太大,难以找到对应的点,调小显示图的范围,再把这两点用弧线连接起来:

#调整经纬度范围
xlim <- c(-100,-50)#经度
ylim <- c(20,50)#纬度
map('world', col = '#f2f2f2', fill = T, bg = 'white', xlim = xlim, ylim = ylim)

#画一条弧线连线,表示社交关系
lon_ca <- -87.34 #longitude 经度
lat_ca <- 41.39 #latitudu 纬度
lon_me <- -79.23
lat_me <- 43.39
lines(c(-87.34,-79.23),c(41.39,43.39),col='red')
inter<- gcIntermediate(c(lon_ca, lat_ca), c(lon_me, lat_me), addStartEnd=TRUE) #addStartEnd=TRUE 连接起始点
lines(inter, col='green')

这种在地图上用弧线连接两点,经常用来表示飞机的航线,我们用网上的一些航线数据来作图:

#装载数据
airports <- read.csv("http://datasets.flowingdata.com/tuts/maparcs/airports.csv", header=TRUE)
flights <- read.csv("http://datasets.flowingdata.com/tuts/maparcs/flights.csv", header=TRUE, as.is=TRUE)
map("world", col="#f2f2f2", fill=TRUE, bg="white", lwd=0.05, xlim=xlim, ylim=ylim)

fsub <- flights[flights$airline == "AA",]
for (j in 1:length(fsub$airline)) {
  air1 <- airports[airports$iata == fsub[j,]$airport1,]   
  air2 <- airports[airports$iata == fsub[j,]$airport2,]
  inter <- gcIntermediate(c(air1[1,]$long, air1[1,]$lat), c(air2[1,]$long, air2[1,]$lat), n=100, addStartEnd=TRUE)
  lines(inter, col="black", lwd=0.8)
}

#R语言地图绘制,底图+数据,会用到ggplot2,暂时跳过
#install.packages('rgdal')
library('rgdal')
## Warning: 程辑包'rgdal'是用R版本4.1.2 来建造的
## 载入需要的程辑包:sp
## Warning: 程辑包'sp'是用R版本4.1.2 来建造的
## Please note that rgdal will be retired by the end of 2023,
## plan transition to sf/stars/terra functions using GDAL and PROJ
## at your earliest convenience.
## 
## rgdal: version: 1.5-27, (SVN revision 1148)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.2.1, released 2020/12/29
## Path to GDAL shared files: C:/Users/wenkuangyu/Documents/R/win-library/4.1/rgdal/gdal
## GDAL binary built with GEOS: TRUE 
## Loaded PROJ runtime: Rel. 7.2.1, January 1st, 2021, [PJ_VERSION: 721]
## Path to PROJ shared files: C:/Users/wenkuangyu/Documents/R/win-library/4.1/rgdal/proj
## PROJ CDN enabled: FALSE
## Linking to sp version:1.4-6
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading sp or rgdal.
## Overwritten PROJ_LIB was C:/Users/wenkuangyu/Documents/R/win-library/4.1/rgdal/proj
#install.packages('mapdata')
library('mapdata')
## Warning: 程辑包'mapdata'是用R版本4.1.2 来建造的
#install.packages('maptools')
library('maptools')
## Warning: 程辑包'maptools'是用R版本4.1.2 来建造的
## Checking rgeos availability: FALSE
## Please note that 'maptools' will be retired by the end of 2023,
## plan transition at your earliest convenience;
## some functionality will be moved to 'sp'.
##      Note: when rgeos is not available, polygon geometry     computations in maptools depend on gpclib,
##      which has a restricted licence. It is disabled by default;
##      to enable gpclib, type gpclibPermit()
#install.packages('ggplot2')
library('ggplot2')
#设置路径工作路径
x<-readOGR('./data/bou2_4p.shp',stringsAsFactors=F) 
## OGR data source with driver: ESRI Shapefile 
## Source: "C:\Users\wenkuangyu\Desktop\about_rbase_plot\data\bou2_4p.shp", layer: "bou2_4p"
## with 925 features
## It has 7 fields
## Integer64 fields read as strings:  BOU2_4M_ BOU2_4M_ID
# head(x) # x
plot(x)

#设置颜色
getColor = function(x, provname, provcol){
  f = function(x, y) ifelse(x %in% y, which(y == x), 0);
  colIndex = sapply(x@data$NAME, f, provname);
  col = c(provcol)[colIndex + 1];
  return(col);
}
provname =c ("北京市", "天津市", "河北省", "山西省", "内蒙古自治区","辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省","浙江省", "安徽省", "福建省", "江西省", "山东省","河南省", "湖北省", "湖南省", "广东省","广西壮族自治区", "海南省", "重庆市", "四川省", "贵州省","云南省", "西藏自治区", "陕西省", "甘肃省", "青海省","宁夏回族自治区", "新疆维吾尔自治区", "台湾省","香港特别行政区")
pop=c(111,28,65,35,18,39,14,43,101,129,428,200,101,162,145,278,4586,277,311,78,46,165,142,12,70,1,63,26,6,12,14,8,10)
provcol = rgb(blue = 1 - pop/max(pop)/2, green = 1-pop/max(pop)/2, red = 0.5)
#最关键的上色
plot(x, col= getColor(x, provname, provcol), xlab = "", ylab = "")

三维图hist3D()

三维地形图persp() ,contour()等高线,我们用不上;image3D()在一个3维绘图对象中添加一个平面图

# install.packages('plot3D')
library(plot3D)
par(bg = "#ffffb3")  #设置背景颜色为淡黄色
# 同时绘制3个平面,1个平面平行于y-z平面,1个平行于x-z平面,1个平行于x-y平面;1.绘制x=0.5平面,平行于y-z平面:
image3D(y = seq(0, 1, 0.1), z = seq(0, 1, 0.1), x = 0.5, 
        col = "cyan", xlim = c(0,1), alpha = 0.5,# xlim设定坐标轴范围,col指定平面颜色。alpha透明度
        colkey = list(plot = FALSE), # 使用colkey = list(plot=FALSE)留出图例区域。
        bty = "u", col.axis = "blue", col.panel = NA) # 手动设置背景格式,col.panel=NA表示透明panels
# 2.绘制 y = 0.5平面,平行于x-z平面
image3D(x = seq(0, 1, 0.1), z = seq(0, 1, 0.1), y = 0.4, 
        add = TRUE, col = "purple", alpha = 0.8) #add = T,在上一幅图的基础上添加,不用单独画
# 3.绘制 z= 0.5平面,其平行于x-y平面
image3D(x = seq(0, 1, 0.1), y = seq(0, 1, 0.1), z = 0.3, 
        add = TRUE, col = "magenta", alpha = 0.5) # alpha指定透明度
# 增加图例
colkey(col = c("magenta", "purple", "cyan"), clim = c(0.5, 3.5), #刻度范围从0.5到3.5
       at = 1:3, labels = c("z", "y", "x"), add = TRUE,clab='图例',
       dist = -0.1, length = 0.5, col.axis = "blue")

# 直方图,条形图、散点图、箱线图、地图三维的比二位平面的可以包含更多的信息;但是对于三维的饼图和二维饼图包含的信息一样,只是视觉效果更好一点
VADeaths# 一个城市与农村不同年龄,不同性别人口数量数据集, 
##       Rural Male Rural Female Urban Male Urban Female
## 50-54       11.7          8.7       15.4          8.4
## 55-59       18.1         11.7       24.3         13.6
## 60-64       26.9         20.3       37.0         19.3
## 65-69       41.0         30.9       54.6         35.1
## 70-74       66.0         54.3       71.1         50.0
hist3D(z = VADeaths)

hist3D(z = VADeaths,
       scale = FALSE, expand = 0.01, bty = "g", theta = 290, phi = 20, # expand = 0.01,z轴方向压缩 
       col = "green", border = "magenta", shade = 0.2, ltheta = -290,
       space = 0.3, ticktype = "detailed", d = 2) # 设定柱子间隙为0.3, d=2>1降低透视强度

hist3D (x = 1:5, y = 1:4, z = VADeaths,
        bty = "g", phi = 20, theta = -60,
        xlab = NA, ylab = NA, zlab = "", main = "VADeaths", # main增加主标题
        col = "green", border = "magenta", shade = 0.8,
        ticktype = "detailed", space = 0.15, d = 2)

# 添加3维文字,给x轴增加刻度标签
text3D(x = 1:5, y = rep(-0.3, 5), z = rep(3, 5), # y相同,在x轴上增加刻度标签
       labels = rownames(VADeaths),
       add = TRUE, adj = 0)

# 添加3维文字,给y轴增加刻度标签
text3D(x = rep(0.5, 4), y = 1:4, z = rep(0, 4), # x相同
       labels  = colnames(VADeaths),
       add = TRUE, adj = 1)