当前位置:   article > 正文

R语言--(9)--数据可视化_使用r 里 library(mas8)中的案例数据--geyser老忠实温泉数据,对间隔时间作核密度

使用r 里 library(mas8)中的案例数据--geyser老忠实温泉数据,对间隔时间作核密度

数据分布可视化

直方图 hist()

用矩形的宽度和高度(即面积)来表示频数分布

hist(x, breaks = "Sturges", freq=NULL, probability = !freq,
	include.lowest = TRUE, right = TRUE,
	density=NULL, angle = 45, col=NULL, border = NULL,
	main = paste("Histogram of", xname),
	xlim = range(breaks), ylim = NULL,
	xlab = xname, ylab,
	axes = TRUE, plot = TRUE, labels = FALSE,
	nclass = NULL, ...)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
参数描述
x样本构成的向量
breaks规定直方图的组距离
1. 向量:给出直方图的起点、终点与组距
2. 数:定义直方图的组距
3. 字符串
4. 函数:计算组距的宽度
freq是逻辑变量
1. TRUE: 绘出频率直方图
2. counts 绘出频率直方图
3. FALSE:绘出密度直方图
probability是逻辑变量与freq相反,是与 S-PLUS 相兼容的参数
TRUE:绘出密度直方图
FALSE 绘出频率直方图
col表示直方图填充的颜色
plot是逻辑变量
TRUE: 表示给出直方图
FALSE表示列出直方图的各种结果

频率直方图

w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0)
hist(w, freq = FALSE)
  • 1
  • 2

在这里插入图片描述

w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0)
hist(w, freq=FALSE)
lines(density(w), col="blue")
x<- 44:76
lines(x, dnorm(x, mean(w), sd(w)), col="red")
  • 1
  • 2
  • 3
  • 4
  • 5
核密度估计函数 density()

已知样本,估计其密度,数据的分布提供了一种平滑的描述,从中看出分布的大致形状

density(x, bw="nrd0", adjust = 1,
		kernel = c("gaussian","epanechnikov","rectangular","triangular","biweight", "cosine", "optcosine"),
		window = kernel, width,
		give.Rkern = FALSE,
		n=512, from, to, cut=3, na.rm=FALSE)
  • 1
  • 2
  • 3
  • 4
  • 5
参数描述
x是由样本构成的向量
bw是带宽,可选择
当bw省略时,R软件会画出光滑的曲线

在这里插入图片描述

密度直方图

案例1

120个数据的销售额
在这里插入图片描述

example2_2 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_2.csv",encoding="UTF-8",stringsAsFactors = TRUE)
example2_2
d <- example2_2$销售额
par(mfrow=c(2,2),mai=c(0.6,0.6,0.4,0.1), cex=0.7)

hist(d, xlab="销售额", ylab="频数",main="(a)普通")
hist(d, breaks=20, col="lightblue", xlab="销售额", ylab="频数",main="(b)分成20组")

hist(d, prob=TRUE, breaks=20, col="lightblue", xlab="销售额", ylab="密度",main="(c)增加轴须线和核密度线")
rug(d)   #增加轴须线
lines(density(d),col="red")

hist(d, prob=TRUE, breaks=20, col="lightblue", xlab="销售额", ylab="密度",main="(d)增加正态密度线")
curve(dnorm(x,mean(d),sd(d)), add=T, col="red")
rug(jitter(d))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

轴须线 rug()

轴须线再现了原始数据在x轴上的位置
rug(x) 重现数据x(作图时将数据点在x轴上再现出来)

扰动点(noise) jitter()

观察实际的数据在x轴上的位置
jitter(x) 计算出现数据x个各扰动点

案例2

R语言自带数据集(美国黄石国家公园老忠实间歇喷泉数据集)
在这里插入图片描述
给出了272次观察的喷发持续时间(eruptions)和下此喷发的等待间隔时间(waiting) 两个变量(单位:分钟)

hist(faithful$eruptions, breaks=20, prob=T, xlab="喷发持续时间", col="lightblue", main="")
rug(faithful$eruptions)
lines(density(faithful$eruptions, bw=0.1), type="l", lwd=2, col="red")
curve(dnorm(x, mean=mean(faithful$eruptions), sd=sd(faithful$eruptions)),add=T, col="blue", lwd=2, lty=6)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

经验分布 ecdf()

w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0)
plot(ecdf(w), verticals=TRUE, do.p=FALSE)
x <- 44:78
lines(x, pnorm(x, mean(w), sd(w)))
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

QQ图 qqnorm()qqline()

w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0)
qqnorm(w);
qqline(w);
  • 1
  • 2
  • 3

在这里插入图片描述

茎叶图 stem()

茎叶图(stem-and-leaf plot)不仅反映数据的分布特征,而且保留原始数据的信息

stem(x, scale = 1, width = 80, atom=1e-8)
  • 1
参数描述
x数据向量
scale控制茎叶图的长度
width绘图的宽度
atom容差

: 纵轴测定数据
: 数据频数

x <- c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75, 78, 79, 81, 83, 84, 84, 84, 85, 86, 86, 86, 87, 89, 89, 89, 90, 91, 92, 100);
stem(x);
  • 1
  • 2

在这里插入图片描述
scale = 2 将10个个位数分成两段,0~4为一段,5~9为另一段

stem(x, scale = 2)
  • 1

在这里插入图片描述
scale = 1/2 将10个个位数分成1/2段,即20个数为一段

stem(x, scale = 0.5)
  • 1

在这里插入图片描述

多茎图 aplpack包 stem.leaf()

数据较多时使用多茎图,将茎重复列出2次或5次

install.packages("aplpack")
  • 1
茎次数描述
2次* 表示茎的叶子上的数为 0~4
. 表示茎的叶子上的数为 5~9
5次* 表示茎的叶子上的数为0和1
t 表示茎的叶子上的数为2和3
s 表示茎的叶子上的数为4和5
t 表示茎的叶子上的数为6和7
. 表示茎的叶子上的数为8和9

数据深度
把数据从小到大排序(升序)或从大到小排序(降序),一个数据的深度是指该数据升序和降序中的最小值

茎叶图中每一行列出的是该行中的最大深度

茎列出两次
stem.leaf(data,unit,m,...)
  • 1
参数描述
data数据向量
unit叶子的单位
m茎的重复次数
example2_2 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_2.csv",encoding="UTF-8",stringsAsFactors = TRUE)
example2_2
library(aplpack)
stem.leaf(example2_2$销售额,1,2)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

茎列出五次
example2_2 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_2.csv",encoding="UTF-8",stringsAsFactors = TRUE)
example2_2
library(aplpack)
stem.leaf(example2_2$销售额,1,5)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

背靠背茎叶图 aplpack包 stem.leaf.backback()

当有两个样本且数据可比时

example2_2 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_2.csv",encoding="UTF-8",stringsAsFactors = TRUE)
example2_2
library(aplpack)
stem.leaf.backback(example2_2$销售额[1:60],example2_2$销售额[61:120])
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

箱线图 boxplot()

箱线图直观简洁地展现数据分布的主要特征.
IQR 四分位差(四分位距)【interquartile rangel】
  表示上四分位与下四分位差 Q 75 % − Q 25 % Q_{75\%}-Q_{25\%} Q75%Q25%
内围栏(inter fence)
  是与 Q 25 % Q_{25\%} Q25% Q 75 % Q_{75\%} Q75% 的距离等于1.5倍四分位差的两个点
下内围栏
Q 25 % − 1.5 × I Q R Q_{25\%}-1.5\times IQR Q25%1.5×IQR
上内围栏
Q 75 % + 1.5 × I Q R Q_{75\%}+1.5\times IQR Q75%+1.5×IQR
相邻值
  相邻值(adjacent value):找出上下内围栏之间的最大值和最小值(即非离群点的最大值和最小值)
下相邻值
m i n ( 大 于 ( Q 25 % − 1.5 × I Q R ) ) min(大于(Q_{25\%}-1.5\times IQR)) min((Q25%1.5×IQR))
上相邻值
m a x ( 小 于 ( Q 75 % + 1.5 × I Q R ) ) max(小于(Q_{75\%}+1.5\times IQR)) max((Q75%+1.5×IQR))
触须
  表示数据的散布范围, 用直线将上下相邻值分别与箱子连接
离群点(outlier)
   是大于上内围栏值或小于下内围栏值得数值,也称外部点(outside value)

x <- c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75, 78, 79, 81, 83, 84, 84, 84, 85, 86, 86, 86, 87, 89, 89, 89, 90, 91, 92, 100);
boxplot(x);
  • 1
  • 2

在这里插入图片描述

三种使用形式:

boxplot(x,...)
  • 1
参数描述
x由数据构成的数值型向量、或者列表、或者数据框
boxplot(x, ..., range = 1.5, width=NULL, varwidth=FALSE,
		notch = FALSE, outline = TRUE, names, plot = TRUE,
		border=par("fg"), col=NULL, log="",
		pars=list(boxwex=0.8, staplewex=0.5, outwex=0.5),
		horizontal=FALSE, add=FALSE, at=NULL)
  • 1
  • 2
  • 3
  • 4
  • 5
参数描述
x由数据构成的数值型向量、或者列表、或者数据框
range是“触须”的范围(缺省值为1.5)
range=0:将极值与箱子连接
notch是逻辑变量
notch=TRUE,画出的箱线图带有切口
notch=FALSE(默认),画出的箱线图不带有切口
outline是逻辑变量
outline = FALSE,不标明异常值点
outline=TRUE(默认),标明异常值点
col是颜色变量
赋给不同值,将绘出不同颜色的箱线图
horizontal是逻辑变量
horizontal=TRUE,把箱线图绘成水平状
horizontal=FALSE(默认),把箱线图绘成垂直状
add是逻辑变量
add=TRUE,在原图上画图
add=FALSE(默认),替换上一张图
width自定义箱子宽度
varwidth=FALSE 所有箱子宽度都一样
varwidth=TRUE 箱子的宽度与样本量的平方根成比例
A <- c(79.98, 80.04, 80.02, 80.04, 80.03, 80.03, 80.04, 79.97, 80.05, 80.03, 80.02, 80.00, 80.02)
B <- c(80.02, 79.94, 79.98, 79.97, 79.97, 80.03, 79.95, 79.97)
boxplot(A, B, notch=T, names=c('A','B'), col=c(2,3))
  • 1
  • 2
  • 3

在这里插入图片描述

boxplot(formula, data = NULL, ..., subset, na.action=NULL)
  • 1
参数描述
formula是公式,如 y ~ grp
y是由数据构成的数值型向量
grp 是数据的分组,通常是因子
data数据结构

案例1

par(mfrow=c(3,1),mai=c(0.4,0.2,0.3,0.2))
x <- rnorm(1000,50,5);x       # 随机1000个服从正态分布并且均值为50,标准差为5 
boxplot(x, range=1.5, col="red", horizontal=TRUE, main="相邻值与箱子连接得箱线图(range=1.5)",cex=0.8)
boxplot(x, range=3, col="green", horizontal=TRUE, main="相邻值与箱子连接得箱线图(range=3)",cex=0.8)
boxplot(x, range=0, col="pink", horizontal=TRUE, varwidth=T,main="相邻值与箱子连接得箱线图(range=0, varwidth=T)",cex=0.8)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

案例2

120个数据的销售额
在这里插入图片描述

example2_2 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_2.csv",encoding="UTF-8",stringsAsFactors = TRUE)
example2_2
x <- example2_2$销售额
layout(matrix(c(1,2), nc=1), heights=c(2,1))
par(mai=c(0.15, 0.4, 0.2, 0.2), cex=0.8)
hist(x, freq=FALSE, col="lightblue", breaks=15, xlab="", ylab="", main="")
rug(x, col="blue4")
abline(v=quantile(x), col="blue4", lwd=2, lty=6)
points(quantile(x), c(0,0,0,0,0), lwd=5, col="red2")
lines(density(x), col="red", lwd=2)
par(mai=c(0.35,0.42,0.2,0.43), cex=0.8)
boxplot(x, col="pink", lwd=2, horizontal=T)
rug(x, ticksize=0.1, col="blue4")
abline(v=quantile(x), col="blue4", lwd=2, lty=6)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

案例3

射击选手的射击环数
在这里插入图片描述

example2_3 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_3.csv",encoding="UTF-8",stringsAsFactors = TRUE);
example2_3 <- example2_3[,2:7]
boxplot(example2_3, col="lightblue", xlab="运动员", ylab="射击环数", cel.lab=0.8,cex.axis=0.6)
  • 1
  • 2
  • 3

在这里插入图片描述

五数总括 fivenum()

重要特征的五个数:
中位数、下四分位数、上四分位数、最小值、最大值

fivenum(x, na.rm=TRUE)
  • 1
参数描述
x样本数据
na.rm是逻辑变量
na.rm=TRUE(默认), 函数可以处理带有缺失数据的向量
na.rm=FALSE, 函数不能处理带有缺失数据的向量
x <- c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75, 78, 79, 81, 83, 84, 84, 84, 85, 86, 86, 86, 87, 89, 89, 89, 90, 91, 92, 100);
fivenum(x)
  • 1
  • 2

在这里插入图片描述

小提琴图 vioplot包 vioplot()

小提琴图(violin plot) 将分布的核密度估计曲线与箱线图结合在一起,它在箱线图上以镜像方式叠加一条核密度估计曲线。
核密度估计曲线可以看出数据分布的大致形状

vioplot(x, range=1.5, names, horizontal=FALSE,...)
  • 1
参数描述
range默认 range=1.5
确定1.5倍的四分位差为上下内围栏
names数据的标签或标签向量
install.packages("vioplot")
  • 1

:射击选手的射击环数
在这里插入图片描述

example2_3 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_3.csv",encoding="UTF-8",stringsAsFactors = TRUE);
library(vioplot)
x1 <- example2_3$亚历山大.彼得里夫利
x2 <- example2_3[,3]
x3 <- example2_3[,4]
x4 <- example2_3[,5]
x5 <- example2_3[,6]
x6 <- example2_3[,7]
vioplot(x1,x2,x3,x4,x5,x6,col="lightblue",names=names(example2_3)[2:7])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

点图(Cleveland 克利夫兰点图)

点图(dot plot) 也称 Cleveland 克利夫兰点图
将数据用点绘制在图中,是检测数据离散点的有效工具

在这里插入图片描述
将如上数据重新进行组装

example2_3 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_3.csv",encoding="UTF-8",stringsAsFactors = TRUE);
example2_3 <- cbind(example2_3, id=factor(1:20)); example2_3
library(reshape)
example2_3_1 <- melt(example2_3[,2:8], id.vars=c("id"), variable_name="运动员");example2_3_1
example2_3_1 <- rename(example2_3_1, c(value="射击环数"));example2_3_1
write.csv(example2_3_1, file="D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_3_1.csv",fileEncoding="UTF-8")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

点图 dotchart()

example2_3_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_3_1.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_3_1
dotchart(example2_3_1$射击环数,groups=example2_3_1$运动员, xlab="射击环数", pch=20)
  • 1
  • 2

在这里插入图片描述

案例1:

1970年美国各类型车每加仑汽油行驶里程
在这里插入图片描述

dotchart(mtcars$mpg,labels = row.names(mtcars),cex = .7,
         main="Gas Mileage for Car Models",
         xlab = "Miles Per Gallon")
  • 1
  • 2
  • 3

在这里插入图片描述

案例2:

1970年美国各类型车每加仑汽油行驶里程
在这里插入图片描述

x <- mtcars[order(mtcars$mpg),]
x$cyl <- factor(x$cyl)
x$color[x$cyl==4] <- "red"
x$color[x$cyl==6] <- "blue"
x$color[x$cyl==8] <- "darkgreen"
dotchart(x$mpg,labels= row.names(x),
         cex=.7,groups=x$cyl,gcolor = "black",
         color = x$color,main="Gas Mileage for Car Models",
         xlab = "Miles Per Gallon")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

lattice包 dotplot()

install.packages("lattice")
  • 1

在这里插入图片描述

library(lattice)
example2_3_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_3_1.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_3_1
dotplot(射击环数~运动员, data=example2_3_1, col="blue",pch=19)
  • 1
  • 2
  • 3

在这里插入图片描述

核密度图

核密度估计(density estimation) 是根据一定的核(kernel)函数和适当的带宽(bandwidth)对数据的分布密度做出估计
核密度图(kernel density plot) 是对核密度估计的一种描述,利用该图可看出数据的实际分布状况

plot() 绘制

example2_2 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_2.csv",encoding="UTF-8",stringsAsFactors = TRUE)
example2_2
d <- example2_2$销售额
par(mfrow=c(1,2),mai=c(0.7,0.7,0.6,0.1),cex=0.7,cex.main=0.8)
plot(density(d),col=1,xlab="销售额",ylab="密度",main="")
rug(d,col="blue")
plot(density(d),col=1,xlab="销售额",ylab="密度",main="")
polygon(density(d),col="gold",border="black")
rug(d,col="brown")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

lattice包 densityplot() 绘制

library(lattice)
example2_3_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_3_1.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_3_1
dp1 <- densityplot(~射击环数|运动员, data=example2_3_1, col="blue", cex=0.5, par.strip.text=list(cex=0.6), sub="(a)栅格图")
dp2 <- densityplot(~射击环数, group=运动员, data=example2_3_1, auto.key=list(columns=1,x=0.01,y=0.95,cex=0.6),cex=0.5,sub="(b)比较图")
plot(dp1,split=c(1,1,2,1))
plot(dp2,split=c(2,1,2,1),newpage=F)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

sm包 sm.density.compare() 绘制

library(sm)
example2_3_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_3_1.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_3_1
attach(example2_3_1)
sm.density.compare(射击环数,运动员,lty=1:6,col=1:6)
legend("topleft",legend=levels(运动员),lty=1:6,col=1:6)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

类别数据可视化

条形图 barplot()

用宽度相同的条形来表示各类别频数多少的图形

barplot(height, width = 1, space = NULL,
        names.arg = NULL, legend.text = NULL, beside = FALSE,
        horiz = FALSE, density = NULL, angle = 45,
        col = NULL, border = par("fg"),
        main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
        xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
        axes = TRUE, axisnames = TRUE,
        cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
        inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
        add = FALSE, ann = !add && par("ann"), args.legend = NULL, ...)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
参数描述
height向量、矩阵、数据框、表格
xlab=" "设置x轴标签
ylab=" "设置y轴标签
horiz=TRUE绘制水平条形图
col设置图形颜色
main为图形增加主标题
sub为图形增加副标题
ylim=c()设置坐标轴的取值范围
legend设置图例
args.legend设置图例的位置参数

简单条形图

简单条形图(simple bar plot) 是用一个坐标轴表示各类别,另一个坐标轴表示类别频数绘制的条形图
在这里插入图片描述

example2_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_1.csv",encoding="UTF-8")
example2_1
count1 <- table(example2_1$社区)
count2 <- table(example2_1$性别)
count3 <- table(example2_1$态度)
par(mfrow=c(1,3),mai=c(0.7,0.7,0.6,0.1),cex=0.7,cex.main=0.8)
barplot(count1,xlab="频数",ylab="社区",horiz=TRUE,main="(a)水平条形图",col=2:5)
barplot(count2,xlab="性别",ylab="频数",main="(b)垂直条形图")
barplot(count3,xlab="态度",ylab="频数",main="(c)垂直条形图",col=2:3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

帕累托图

帕累托图(Pareto plot)是按各类的频数多少排序绘制的条形图

example2_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_1.csv",encoding="UTF-8")
example2_1
count1 <- table(example2_1$社区)
par(mai=c(0.7,0.7,0.1,0.8),cex=0.8)
x <- sort(count1, decreasing=T);x
bar <- barplot(x,xlab="社区",ylab="频数",ylim=c(0,1.2*max(count1)),col=2:5)
text(bar,x,labels=x,pos=3)
y <- cumsum(x)/sum(x)
par(new=T)
plot(y,type="b",lwd=1.5,pch=15,axes=FALSE, xlab='', ylab='', main='')
axis(4)
mtext("累积频率",side=4,line=3)
mtext("累积分布曲线",line=-2.5, cex=0.8, adj=0.75)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

复式条形图(并列条形图/堆叠条形图)

  1. 使用二维列联表数据
    在这里插入图片描述

  2. 通过 beside 参数控制是并列条形图(beside=TRUE)还是堆叠条形图

example2_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_1.csv",encoding="UTF-8")
example2_1
mytable1 <- table(example2_1$态度,example2_1$社区);mytable1
par(mfrow=c(2,2), cex=0.6)

barplot(mytable1, xlab="社区", ylab="频数", ylim=c(0,16), col=c("green","blue"),legend=rownames(mytable1), args.legend=list(x=12), beside=TRUE, main="(a)社区并列条形图")

barplot(mytable1, xlab="社区", ylab="频数", ylim=c(0,30), col=c("green","blue"),legend=rownames(mytable1), args.legend=list(x=4.8), main="(b)社区堆叠条形图")

mytable2 <- table(example2_1$态度, example2_1$性别); mytable2

barplot(mytable2, xlab="性别", ylab="频数", ylim=c(0,30), col=c("green","blue"),legend=rownames(mytable2), args.legend=list(x=4.5), beside=TRUE, main="(c)性别并列条形图")

barplot(mytable2, xlab="性别", ylab="频数", ylim=c(0,60), col=c("green","blue"),legend=rownames(mytable2), args.legend=list(x=1), main="(d)性别堆叠条形图")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

脊形图 vcd包 spine()

install.packages("vcd")
  • 1

脊形图(spine plot)是根据各类别的比例绘制的一种条形图
在这里插入图片描述
数据框中的变量是 Factor 类型, formula(~)才有效
读文件时,添加参数 stringsAsFactors = TRUE

library(vcd)
example2_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_1.csv",encoding="UTF-8",stringsAsFactors = TRUE)
spine(社区~性别,data=example2_1,xlab="性别",ylab="社区",margins=c(4,3.5,1,2.5))
  • 1
  • 2
  • 3

在这里插入图片描述

spine(态度~社区,data=example2_1,xlab="社区",ylab="态度",margins=c(4,3.5,1,2.5))
  • 1

在这里插入图片描述

马赛克图 mosaicplot()

mosaicplot(x,~)
  • 1
参数描述
x列联表
~右侧为类别变量,多个类别变量之间用 “+” 连接

马赛克图(mosaic plot)图中嵌套矩形的面积正比于单元格的频数

example2_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_1.csv",encoding="UTF-8",stringsAsFactors = TRUE)
mosaicplot(~性别+社区+态度, data=example2_1,color=2:3,main=" ")
  • 1
  • 2

在这里插入图片描述

饼图 pie()

pie(x, labels = names(x), edges = 200, radius = 0.8,
    clockwise = FALSE, init.angle = if(clockwise) 90 else 0,
    density = NULL, angle = 45, col = NULL, border = NULL,
    lty = NULL, main = NULL, ...)
  • 1
  • 2
  • 3
  • 4
参数描述
x非负的数值向量
labels设置饼图各分区的名称
radius设定半径(默认为0.8)
init.angle=90设定从12点位置开始逆时针方向绘制

饼图(pie chart)是用圆形及园内扇形的角度来表示数值大小的图形
在这里插入图片描述

example2_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_1.csv",encoding="UTF-8",stringsAsFactors = TRUE)
count1 <- table(example2_1$社区);count1
name <- names(count1)
percent <- prop.table(count1)*100;percent
label1 <- paste(name," ",percent,"%",sep="")
par(pin=c(3,3),mai=c(0.1,0.4,0.1,0.4),cex=0.8)
pie(count1,labels=label1,init.angle=90)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

三维饼图 plotrix包 pie3D()

install.packages("plotrix")
  • 1
library(plotrix)
example2_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_1.csv",encoding="UTF-8",stringsAsFactors = TRUE)
count1 <- table(example2_1$社区);count1
name <- names(count1)
percent <- prop.table(count1)*100;percent
labs <- paste(name," ",percent,"%",sep="")
pie3D(count1, labels=labs, explode=0.1, labelcex=0.8)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

扇形图 plotrix包 fan.plot()

install.packages("plotrix")
  • 1

扇形图(fan plot),是将构成中百分比最大的一类绘制成一个扇形区域,而其他各类百分比按大小采用不同的半径绘制出扇形,并叠加在这个最大的扇形上,
从而有利于比较各构成百分比的相对数量和差异

library(plotrix)
example2_1 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_1.csv",encoding="UTF-8",stringsAsFactors = TRUE)
count1 <- table(example2_1$社区);count1
name <- names(count1)
percent <- prop.table(count1)*100;percent
labs <- paste(name," ",percent,"%",sep="")
fan.plot(count1, labels=labs, ticks=200, col=c("gray30","gray70","gray50","gray90"))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

变量间关系可视化

散点图 plot()

散点图(scatter plot) 是将两个变量的各对观测点画在坐标中,并通过各观测点的分布来展示两个变量间的关系

案例1

x <- seq(0,25,length=100)
y <- 4+0.5*x+rnorm(100,0,2)
d <- data.frame(x,y);d
plot(d)
polygon(d[chull(d),], col="pink", lty=3, lwd=2)
points(d)
abline(lm(y~x),lwd,col=4)
abline(v=mean(x), h=mean(y), lty=2, col="gray70")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

案例2

20家企业销售收入、销售网点数、销售人员、广告费用
在这里插入图片描述

example2_4 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_4.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
attach(example2_4)
par(mfcol=c(1,2), mai=c(0.7,0.7,0.3,0.1), cex=0.8, cex.main=0.8)
plot(广告费用,销售收入,main="(a)普通带网格线", type="n")
grid()  # 为图形增加网格线
points(广告费用,销售收入,main="(a)普通带网络线")
rug(广告费用,side=1,col=4)
rug(销售收入,side=2,col=4)

plot(广告费用,销售收入,main="(b)带有拟合直线")
abline(lm(销售收入~广告费用,data=example2_4),col="red")
rug(广告费用,side=1,col=4)
rug(销售收入,side=2,col=4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

案例3

案例2的示例,在观察两个变量间的关系的同时对每个变量的分布状况进行描述

example2_4 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_4.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
attach(example2_4)
par(fig=c(0,0.8,0,0.8), mai=c(0.9,0.9,0.1,0.9))
plot(广告费用,销售收入,xlab="广告费用",ylab="销售费用",cex.lab=0.7,cex.axis=0.7)
abline(lm(销售收入~广告费用,data=example2_4),col="blue")
par(fig=c(0,0.8,0.5,1),new=TRUE)
boxplot(广告费用,horizontal=TRUE,axes=FALSE)
par(fig=c(0.52,1,0,0.9),new=TRUE)
boxplot(销售收入,axes=FALSE)
detach()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

重叠散点图

重叠散点图(overlay scatter),比较一个变量与其他几个变量之间的关系

example2_4 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_4.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
attach(example2_4)
plot(广告费用,销售收入, xlab="", ylab="销售收入")
abline(lm(销售收入~广告费用, data=example2_4))
points(销售网点数,销售收入,pch=2,col="blue")
abline(lm(销售收入~销售网点数,data=example2_4),col="blue")
points(销售人员数,销售收入,pch=3,col="red")
abline(lm(销售收入~销售人员数,data=example2_4),col="red")
legend("bottomright",legend=c("广告费用","销售网点数","销售人员数"),pch=1:3,col=c("black","blue","red"))
detach()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

销售收入作为纵轴、把销售网点数、销售人员数及广告费用之间的关系
在这里插入图片描述

三维散点图 scatterplot3d包 scatterplot3d()

install.packages("scatterplot3d")
  • 1

绘制带有二元回归的三维散点图

example2_4 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_4.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
attach(example2_4)
library(scatterplot3d)
s3d <- scatterplot3d(销售人员数,销售网点数,销售收入,pch=16,highlight.3d=TRUE,type="h",cex.lab=0.7)
fit <- lm(销售收入~销售人员数+销售网点数)  #二元回归平面
s3d$plane3d(fit,col="blue")
detach()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

矩形散点图

同时比较多个变量两两之间的关系,绘制矩阵散点图(matrix scatter)

普通矩阵散点图 plot()
example2_4 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_4.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
example2_4 <- example2_4[,2:5];example2_4
plot(example2_4,cex=0.6,gap=0.5)
  • 1
  • 2
  • 3

在这里插入图片描述

带有拟合直线、最佳拟合曲线和直方图的矩阵散点图 car包 scatterplotMatrix()
install.packages("car")
  • 1
scatterplotMatrix(x, smooth = TRUE,
    id = FALSE, legend = TRUE, regLine = TRUE,
    ellipse = FALSE, var.labels = colnames(x), diagonal = TRUE,
    plot.points = TRUE, groups = NULL, by.groups = TRUE,
    use = c("complete.obs", "pairwise.complete.obs"), col =
    carPalette()[-1], pch = 1:n.groups, cex = par("cex"),
    cex.axis = par("cex.axis"), cex.labels = NULL,
    cex.main = par("cex.main"), row1attop = TRUE, ...)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
参数描述
x矩阵或数据框
diagonal表示在矩阵对角线上绘制某种图
gap调整各图之间的间距
example2_4 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_4.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
attach(example2_4)
library(car)
scatterplotMatrix(~销售收入+销售网点数+销售人员数+广告费用,diagonal = list(method="histogram"),gap=0.5)
detach()
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

气泡图

气泡图(bubble plot)3个变量之间的关系

案例1

x和y是来自标准正态分布的两个随机变量,气泡大小由第3个变量z的数值决定
在这里插入图片描述

n <- 30;
x <- rnorm(n);x
y <- rnorm(n);y
z <- abs(rnorm(n))+5:1;z
plot(x,y,cex=z,col="pink",pch=19)
points(x,y,cex=z)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

案例2 symbols()

symbols(x,y=NULL,circles,inches=TRUE,...)
  • 1
参数描述
x,yx轴和y轴变量
circles第三个变量表示的圆的半径向量
inches半径英寸
fg圆的颜色
bg圆的填充颜色
text气泡增加样本标签或编号
example2_4 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_4.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
attach(example2_4)
r <- sqrt(销售收入/pi)
symbols(广告费用,销售网点数,circles=r,inches=0.3,fg="white",bg="lightblue",ylab="销售网点数",xlab="广告费用")
text(广告费用,销售网点数,rownames(example2_4),cex=0.6)
mtext("气泡大小=销售收入",line=-2.5,adj=0.1)
detach(example2_4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

销售收入、广告费用、销售网点数3个变量关系
在这里插入图片描述

比较多样本相似性图形

轮廓图 matplot()

轮廓图(outline plot)也称平行坐标图或多线图,横轴表示各样本,纵轴表示每个样本的多个变量的数值


  • 1

在这里插入图片描述
在这里插入图片描述

example2_5 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_5.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
example2_5
par(mai=c(0.7,0.7,0.1,0.1),cex=0.8)
matplot(t(example2_5[,3:10]),type='b',lty=1:7,col=1:7,xlab="消费项目",ylab="支出金额",pch=1,xaxt="n")
axis(side=1,at=1:8,labels=c("食品","衣着","居住","家庭设备用品及服务","医疗保健","交通和通信","教育文化娱乐服务","其他商品和服务"),cex.axis=0.6)
legend(x="topright",legend=example2_5[,2],lty=1:7,col=1:7,text.width=1,cex=0.7)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

雷达图 fmsb包 radarchart()

install.packages("fmsb")
  • 1
radarchart(df,axistype,seg,maxmin,vlabels,...)
  • 1
参数描述
df绘图数据,通常是数据框,
数据框的行表示各样本,列为绘图变量
axistype指定坐标轴类型,取值在0~5之间
默认为0,表示不标出坐标轴刻度
seg设定坐标轴刻度线数
默认为4条
maxminmaxmin=TRUE, 设定各坐标轴的最小值为所有变量的最小值,最大值为所有变量的最大值
maxmin=FALSE, 表示各坐标轴的最小值为该轴所对应变量的最小值,最大值为该轴所对应变量的最大值
vlabels用于设定各坐标轴的标题
example2_5 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_5.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
example2_5
library(fmsb)
radarchart(example2_5[,3:10],axistype=0,seg=4,maxmin=FALSE,vlabels=names(example2_5[,3:10]),pcol=1:7,plwd=1.5)
legend(x="topleft",legend=example2_5[,2],lty=1:7,col=1:7,lwd=1,text.width=0.5,cex=0.7)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

星图 stars()

stars(x,full=TRUE,scale=TRUE,key.loc=NULL,draw.segments=FALSE,...)
  • 1
参数描述
x矩阵或数据框
fullfull=FALSE指定绘制上半圆
full=TRUE默认
scalescale=TRUE,对每个变量单独标准化后绘制星图
key.loc数值用于指定标准星图的位置
draw.segmentsdraw.segments=TRUE,指定绘制出弧形
example2_5 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_5.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
example2_5
matrix2_5 <- as.matrix(example2_5[,3:10])
rownames(matrix2_5) <- example2_5[,2]
matrix2_5
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
绘制不同收入等级的星图

stars(matrix2_5,key.loc=c(7,2,5),cex=0.8)
  • 1

在这里插入图片描述
绘制不同消费项目的星图

stars(t(matrix2_5),full=FALSE,draw.segments=TRUE,key.loc=c(6,2.2,5),cex=0.8)
  • 1

在这里插入图片描述

脸谱图 aplpack包 faces()

install.packages("aplpack")
  • 1
faces(xy,face.type=1,...)
  • 1
参数描述
xy为数据矩阵,绘制脸谱图时按矩阵的行变量绘制脸谱,若要对矩阵列变量绘制脸谱图,将矩阵转置
face.typeface.type=1 和 face.type=2 可绘制不同形态的彩色脸谱图
变量面部特征
height of face脸的高度
width of face脸的宽度
shape of face脸的形状
height of mouth嘴的高度
width of mouth嘴的宽度
curve of smile笑容曲线
height of eyes眼睛高度
width of eyes眼睛宽度
heigth of hair头发高度
width of hair头发宽度
styling of hair发型
height of nose鼻子高度
width of nose鼻子宽度
width of ears耳朵宽度
height of ears耳朵高度
example2_5 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_5.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_4
example2_5
matrix2_5 <- as.matrix(example2_5[,3:10])
rownames(matrix2_5) <- example2_5[,2]
matrix2_5
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

library(aplpack)
faces(matrix2_5,nrow.plot=4,ncol.plot=2,face.type=1)
  • 1
  • 2

在这里插入图片描述

在这里插入图片描述

library(aplpack)
faces(t(matrix2_5),nrow.plot=4,ncol.plot=2,face.type=2)
  • 1
  • 2

在这里插入图片描述

在这里插入图片描述

时间序列图 ts()

创建时间序列对象

ts(data,start,...)
  • 1
参数描述
data向量、矩阵、数据框
start设定时间序列的起始时间

在这里插入图片描述

example2_9 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_9.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_9
example2_9
example2_9 <- ts(example2_9,start=2000)
par(mai=c(0.7,0.7,0.1,0.1),cex=0.8)
plot(example2_9[,3],ylim=c(2000,30000),xlab="年份",ylab="居民消费水平",type="n")
grid(col="gray60")
points(example2_9[,3],ylim=c(2000,30000),xlab="年份",ylab="居民消费水平",type="o")
lines(example2_9[,4],type='b',lty=2,col="blue")
legend(x="topleft",legend=c("农村居民消费水平","城镇居民消费水平"),lty=1:2,col=c(1,4),cex=0.8)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

洛伦茨曲线 DescTools包 Lc()

在有序类别变量的频数分布中,如果将各类别的频数逐级累加,即可得到累积频数分布表. 根据累积频数分布表可以绘制累积频数分布曲线.

洛伦茨曲线(Lorenz curve) 是一种特殊的累积频数分布曲线,是20世纪初由美国统计学家洛伦茨(M.O. Lorenz)根据意大利经济学家帕累托提出的收入分配公式绘制的描述收入或财富分配不平等程度的曲线.
在这里插入图片描述

基尼系数(Gini coefficient) 20世纪意大利经济学家基尼(C. Gini)根据洛伦茨曲线给出了衡量收入分配平等程度的指标
基 尼 系 数 = A A + B 基尼系数=\frac{A}{A+B} =A+BA
A:表示实际收入洛伦茨曲线与绝对平均线之间的面积
B:表示实际收入洛伦茨曲线与绝对不平均线之间的面积

基尼系数=0:表示收入绝对平均
基尼系数=1:表示收入绝对不平均
基尼系数越小,表示收入分配越平均
基尼系数越大,表示收入分配越不平均

Lc(x,n,...) # 计算绘制洛伦茨曲线所需的百分比数值
  • 1
参数描述
x非负的数值向量
n相对应的频数向量

例:某企业年收入分组数据
在这里插入图片描述

library(DescTools)
example2_10 <- read.csv("D:/WorkSpace/R/Statistic_R/utf_8/example/ch2/example2_10.csv",encoding="UTF-8",stringsAsFactors = TRUE);example2_9
example2_10
Lc(example2_10$组中值,example2_10$人数)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

plot(Lc(example2_10$组中值,example2_10$人数),xlab="人数比例",ylab="收入比例",col=4,panel.first=grid(10,10,col="gray70"))
  • 1

在这里插入图片描述

ggplot2 绘图示例

创建示例

set.seed(12345)
n=100
x <- round(rnorm(n,80,6));x
y <- round(2+0.4*x+rnorm(n,50,3)); y
a <- sample(c("管理","会计","金融"),20,replace=T); a 
b <- sample(c("男","女"),20,replace=T); b
d <- data.frame(专业=a,性别=b,数学=x,统计学=y); d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

library(ggplot2)
g <- ggplot(d)
theme <- theme(plot.title=element_text(size="10"), axis.title=element_text(size=9), axis.text=element_text(size=8),legend.position="none")
p1 <- g+aes(x=专业,fill=性别)+theme+geom_bar()+ggtitle("条形图")
p2 <- g+aes(x=数学)+geom_histogram(fill=3,bins=20)+geom_rug(color=2)+facet_grid(.~性别)+theme+ggtitle("直方图+rug")
p3 <- g+aes(x=专业,y=统计学,fill=专业,color=专业)+geom_violin()+geom_point(color=1)+geom_boxplot(width=0.2,col=1)+theme+ggtitle("小提琴图+箱线图+点图")
p4 <- g+aes(x=数学,y=统计学,fill=性别,color=性别)+geom_point(size=1)+geom_rug()+stat_smooth(method=loess)+theme+ggtitle("散点图+拟合线+rug")
p5 <- g+aes(x=数学)+ geom_density(aes(group=专业,color=专业,fill=专业),adjust=1,alpha=0.5)+theme_bw()+theme(panel.grid=element_blank())+theme+ggtitle("核密度图")
p6 <- g+aes(x=数学,y=统计学)+geom_line(aes(group=性别,color=性别))+theme_bw()+theme(plot.title=element_text(size="10"),axis.title=element_text(size=9),axis.text=element_text(size=8),legend.position=c(0.2,0.7))+ggtitle("线图")
library(gridExtra)
grid.arrange(p1,p2,p3,p4,p5,p6,nrow=2,ncol=3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

ggplot2 绘制由多个部分组成,每部分由特定的函数控制,各个部分之间用 + 连接
ggplot() 用于指定要绘图的数据并初始化图形
aes() 用于指定绘图的坐标轴代表的变量
geom 用于指定要绘制的图形

geom_histogram绘制直方图
geom_point绘制点图

theme() 用于对图形的控制

theme(plot.title=element_text(size=" ")设定图标题的字体大小
theme(axis.title=element_text(size=" ")设定坐标轴标题字体大小
theme(axis.text=element_text(size=" ")设定坐标轴刻度字体的大小
theme(legend.position)设定图例的位置

在这里插入图片描述

text()
axis()
mtext()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/131961
推荐阅读
  

闽ICP备14008679号