文章目录
- R语言可视化
- 一、Data Frame
- 二、绘图:qplot( )
- 三、绘图:ggplot( )
R语言可视化
主要涉及矩阵、Data Frame、matplot( )、qplot( )、ggplot( )
提示:以下是本篇文章正文内容,下面案例可供参考
一、Data Frame
Data Frame是与Matrix矩阵类似的存储结构,都是矩阵的形式;但是Matrix存储的数据都是相同类型,Data Frame存储的是不同类型,如下图,Data Frame存储既有字符类型的列,也有浮点型的列,当然也可以有整型。可以说Data Frame是对矩阵的一种扩展和延申,更具有使用性。
1.Data Frame的获取
Data Frame一般从 .csv文件中读取,也存储在 .csv文件中。也可以使用data.frame( )创建,前提是有对应的列数据。
1.1 读取 .csv文件获取 Data Frame
1.1.1 读取路径方式
需要读取的文件:Demographic-Data.csv
文件所在路径:C:\Program Files\R\R_language\class_file\C2
Windows系统读取路径应修改为:C:\Program Files\R\R_language\class_file\C2
mydata=read.csv("C:\\Program Files\\R\\R_language\\class_file\\C2\\Demographic-Data.csv")
1.1.2 选择文件方式
mydata=read.csv(file.choose())
运行该语句后,会弹出选择文件的框,选择要读入的文件即可
1.2 data.frame( )创建 Data Frame
分别以Countries_2021_Dataset、Codes_2021_Dataset、Regions_2021_Dataset为三列创建Data Frame格式的newdata
newdata=data.frame(Countries_2021_Dataset,Codes_2021_Dataset,Regions_2021_Dataset)
也可以在创建时修改列名
newdata=data.frame(Country = Countries_2021_Dataset,
CCode = Codes_2021_Dataset,
Regions = Regions_2021_Dataset)
2.Data Frame的操作
2.1 查看-Data Frame
2.1.1 统计行列数
返回一个两位的数组,第一位是行总数,第二位是列总数
dim(mydata)
2.1.2 查看结构
str(mydata)
返回结果:包括mydata的格式、列名、每列中的内容
2.1.3 查看数据统计(最大值、最小值、平均值、中位数、总个数)
summary(mydata)
2.2 取值-Data Frame
2.2.1 普通取值
drop=F:不改变原格式
drop=T:或者不写drop,即默认drop=T,则会改变原格式
例如:
mydata[ , 4 ]、mydata[ , 1 ]、mydata[ 1:10 , 1 ]、mydata[ 1 , ] :返回的都是向量格式的数据,不是Data Frame格式
mydata[ , 1 , drop=F ] :返回的是原格式Data Frame格式的数据
# 返回第四列的所有数据
mydata[,4]
# 返回第一列的所有数据
mydata[,1]
# 返回第一列的1~10行数据
mydata[1:10,1]
# 返回第一行的数据
mydata[1,]
# 返回第一列的所有数据
mydata[,1,drop=F]
2.2.2 取值前六行、末尾六行
# 返回前六行数据
head(mydata)
# 返回末尾六行数据
tail(mydata)
2.2.3 取某一列
返回 mydata 中 Country.Name 列的所有数据,并且不再是原格式 Data Frame,是向量格式数据(向量类型即数组)
mydata$Country.Name
返回mydata中Birth.rate列的第5个数据
mydata$Birth.rate[5]
2.2.4 多条件取值
返回 mydata 中 Internet.users 列里数据小于2的所有行的数据
myfilter=(mydata$Internet.users<2)
weneed=mydata[myfilter,]
myfilter=(mydata$Internet.users<2):返回的 myfilter 是一个由TRUE和FALSE构成的数组,其中每一TRUE或者FALSE都对应 Internet.users 列里每一行数据的判断结果,小于2的为TRUE,反之为FALSE,如下图,该列一共有多少行,就是多大的数组
weneed=mydata[myfilter,]:weneed即返回myfilter中为TRUE的行,对应在mydata中的行数据,如下图:这些都是Internet.users 列里数据小于2的所有行的数据,weneed是一个Data Frame格式的数据(因为它不是单纯某一列数据)
此外,我们还可以统计一下满足 Internet.users 列里数据小于2的所有行有多少个
# 返回数组第一个数据,即行数(第二个数据为列数)
dim(weneed)[1]
推广、延申:
寻找行中Birth.rate>40并且Internet.users<5的数据,及行数统计
mydata[ mydata$Birth.rate>40 & mydata$Internet.users<5 , ]
dim(mydata[mydata$Birth.rate>40 & mydata$Internet.users<5,])[1]
寻找并统计所有high income的行
mydata[mydata$Income.Group=="High income",]
dim(mydata[mydata$Income.Group=="High income",])[1]
2.3 操作-Data Frame
2.3.1 两列相加
只有两列都是整型、浮点型等类型才可相加
mydata$Birth.rate+mydata$Internet.users
2.3.2 增加一列、删除一列
增加一列,名为xyz
mydata$xyz=c(1:5)
增加列的规则:增加的列的数据个数,必须可以让计算机进行自动分配。
举个例子:mydata一共195行,我们增加的xyz列是一个5行数据的列{ 1 ; 2 ; 3 ; 4 ; 5 },195可以整除5,则计算机可以让所有行都按:第1-5行对应的xyz的数据为1、2、3、4、5,第6-10行对应xyz的数据为1、2、3、4、5…类推让所有行都可以按这个规则得到xyz列的值。若xyz是6行的列,则无法增加该列,计算机无法进行自动分配。
简言之,即增加的列的行数,可以被原Data Frame的总行数整除,才行。
删除一列
mydata$xyz=NULL
2.3.3 修改列名
colnames(newdata)=c("Country","CCode","Regions")
2.3.4 将 字符数据列 的 所有数据 按 字母顺序 排序
按字母顺序把列 Income.Group 和 Country.Code 的字符数据进行排序(只可用于字符类型数据的列),并以向量格式返回该字符数据
levels(mydata$Income.Group)
levels(mydata$Country.Code)
读取调整后的第一个数据
levels(mydata$Income.Group)[1]
2.3.5 自己设计某字符数据列的数据顺序
将mydata中Income.Goup列内数据的先后顺序改为 “Low income” “Lower middle income” “Upper middle icome” “High icome”
mydata$Income.Group=ordered(mydata$Income.Group,levels=c("Low income",
"Lower middle income",
"Upper middle icome",
"High icome"))
2.3.6 删除Data Frame
remove/delete the data frame
rm(newdata)
2.3.7 判断是否为 Data Frame
is.data.frame(mydata)
2.3.8 两个Data Frame进行等值连接
mydata和newdata连接,mydata里的Country.Code和newdata里的CCode进行等值连接
mergdata=merge(x=mydata,y=newdata,by.x = "Country.Code",by.y = "CCode")
2.3.9 Data Frame 写入 .csv 文件中
保留第一列索引编号
write.csv(mergdata,"merged.csv")
取出第一列的索引编号
write.csv(mergdata,"merged1.csv",row.names = F)
二、绘图:qplot( )
quick plot,即快速绘图工具,是一个比较简单、快速的绘图工具。
需要先导入一个包
library("ggplot2")
1.散点图
qplot(data=mydata,
x=Internet.users,y=Birth.rate,
colour=Income.Group,
size=I(5),
alpha=I(0.05))
- data=mydata:数据取自mydata
- x轴Income.Group,y轴是Birth.rate
- colour=Income.Group:以Income.Group的数据,做图例;若用colour=I(“red”)则所有点都是红色
- size=I(5):决定画的点的大小
- alpha=I(0.05):每个点的颜色透明度
2.箱线图
qplot(data=mydata,
x=Income.Group,y=Birth.rate,
geom="boxplot")
箱线图介绍:https://blog.csdn.net/uinglin/article/details/79895993
三、绘图:ggplot( )
需要先导入一个包
library("ggplot2")
我对ggplot( )的理解:画板ggplot( )+画笔geom_xxx( );画笔不仅是在画板的基础上进行绘图,也可以随意修改画板的原本内容。
1.画笔绘图
1.1.1 geom_point( ):绘制散点图
1.1.1.1 设置画板
p=ggplot(data = mymov,
aes(x=CRating,y=ARating,
colour=Genre,
size=BudMils,
alpha=I(0.5)))
- p=ggplot( ):一个绘图语句ggplot( )可以赋值给变量p,然后使用变量p即可
- data = mymov:数据来自mymov数据
- aes(
x=CRating,y=ARating:CRating做x轴,ARating做y轴
colour=Genre:设置每个点的颜色,依据Genre做图例
size=BudMils:设置画在画板上点的大小,依据每个点对应BudMils的数值(也是 一个图例)
alpha=I(0.5):设置画在画板上颜色的透明度
) - 注意:凡是设置绘图的属性时,用到的数据是来自data=mymov的,都要写在aes( )里,例如制作图例例如size、colour等等,
画板如下:由于没有绘制散点,所以暂时看不出颜色、大小等等效果,只能看到一个画板
1.1.1.2 使用绘制散点图的笔 geom_point( )
p=ggplot(data = mymov,
aes(x=CRating,y=ARating,
colour=Genre,
size=BudMils,
alpha=I(0.5)))
p+geom_point()
- p+geom_point():在画板上绘点
- xlab(“Budget in Millions”):增加x轴的标签为
运行效果如下:有两个图例,一个是Genre的颜色图例,一个是BudMils的点尺寸图例
geom_point与geom_jitter的区别?
1.1.2 geom_line( ):绘制折线图
1.1.2.1 设置画板
p=ggplot(data = mymov,
aes(x=CRating,y=ARating,
colour=Genre,
size=BudMils,
alpha=I(0.5)))
- p=ggplot( ):一个绘图语句ggplot( )可以赋值给变量p,然后使用变量p即可
- data = mymov:数据来自mymov数据
- aes(
x=CRating,y=ARating:CRating做x轴,ARating做y轴
colour=Genre:设置每个点的颜色,依据Genre做图例
size=BudMils:设置画在画板上点的大小,依据每个点对应BudMils的数值(也是 一个图例)
alpha=I(0.5):设置画在画板上颜色的透明度
) - 注意:凡是设置绘图的属性时,用到的数据是来自data=mymov的,都要写在aes( )里,例如制作图例例如size、colour等等,
画板如下:由于没有绘制散点,所以暂时看不出颜色、大小等等效果,只能看到一个画板
1.1.2.2 使用绘制折线图的画笔 geom_line( )
p+geom_line()
1.1.3 geom_density( ):绘制曲线图
1.1.3.1 设置画板
画板设置为x轴为BudMils,y的数据为BudMils的各个数据统计,例如y轴数据为BudMils为1时的总个数,BudMils为2的总个数…
s=ggplot(mymov,aes(x=BudMils))
画板如下:
1.1.3.2 使用绘制曲线的画笔 geom_density( )
s+geom_density(
aes(fill=Genre),
position = "stack",
alpha=0.5
- aes(fill=Genre):曲线与坐标轴部分的图像颜色填充依据Genre,即制作图例
- position = “stack”:将叠加在一起的图像,显示为一层层往上叠加的效果,即可以通过图例得知,图像由哪些部分叠加在一起
- alpha=0.5:设置透明度
效果如下:
为了更好理解position=stack,给出没有position=stack的绘图结果:即图像全部重叠在一起
1.1.4 geom_histogram( ):绘制条状图
1.1.4.1 设置画板
画板设置为x轴为BudMils,y的数据为BudMils的各个数据统计,例如y轴数据为BudMils为1时的总个数,BudMils为2的总个数…
s=ggplot(mymov,aes(x=BudMils))
画板如下:
1.1.4.2 使用绘制条形图的画笔 geom_histogram()
s+geom_histogram(binwidth = 10,
aes(fill=Genre),
colour="black")
- binwidth = 10:条状图的条宽为10
- aes(fill=Genre):条形里填充的颜色依据Genre,是一个图例
- colour=“black”:条形框用黑边
效果如下:
1.1.5 geom_boxplot( ):绘制箱线图
u=ggplot(mymov,aes(x=Genre,y=ARating,colour=Genre))
u+geom_boxplot(size=3)
- size=3:设置箱边宽度
效果如下:
1.1.6 geom_smooth( ):绘制回归直线
一般与散点图一起画效果更好
u=ggplot(mymov,aes(x=Genre,y=ARating,colour=Genre))
u+geom_smooth()
效果如下:
也可以取消灰色部分,灰色部分称为置信区间:
u+geom_smooth(fill=NA)
图:
2.绘图拓展
2.1 多笔绘图
2.1.1 绘制散点图+折线图
# 设置画板
p=ggplot(data = mymov,
aes(x=CRating,y=ARating,
colour=Genre,
size=BudMils,
alpha=I(0.5)))
#绘制散点+连线图
p+geom_point()+geom_line()
2.1.2 绘制散点图+回归直线
# 设置画板
u=ggplot(mymov,aes(x=CRating,y=ARating,colour=Genre))
# 绘制散点图,以及回归直线
u+geom_point()+geom_smooth()
效果如下:
2.1.2 绘制散点图+箱线图
# 设置画板
u=ggplot(mymov,aes(x=Genre,y=ARating,colour=Genre))
# 绘制散点图+箱线图
u+geom_jitter()+geom_boxplot(size=0.5,alpha=0.3)
2.2 分割画板
2.2.1 facet分割画板
2.2.1.1 绘制原图
我们想根据某一列属性,将整个条形图拆分成多个小条形图,并展示在一个画板上,这样更有助于我们分析数据、作比较,先绘制原图
# 设置画板
v=ggplot(mymov,aes(x=BudMils,fill=Genre))
# 绘制条形图
v+geom_histogram(binwidth = 10,colour="Black")
图:
2.2.1.2 按行分割画板,并展示多个图像 facet_grid(xxx~.)
xxx~. 即按xxx拆分图像,并按行分割画板并展示各个图像
v+geom_histogram(binwidth = 10,colour="Black")+
facet_grid(Genre~.)
- 按Genre拆分图像,并按行分割画板
图:
解放各个小图形的纵坐标轴,不用统一的刻度 scales = “free”
v+geom_histogram(binwidth = 10,colour="Black")+
facet_grid(Genre~.,scales = "free")
图:
2.2.1.2 按行分割画板,并展示多个图像 facet_grid(.~xxx)
.~xxx 即按xxx拆分图像,按列分割画板并展示各个图像
v+geom_histogram(binwidth = 10,colour="Black")+
facet_grid(.~Genre)
图:
2.2.2 取画板某部分图像
# 设置画板
m=ggplot(mymov,aes(x=CRating,
y=ARating,
colour=Genre,
size=BudMils))
m+geom_point(alpha=0.5)+
xlim(50,100)+
ylim(50,100)
- xlim(50,100):x limit 50-100:把x轴限制在50-100区间
- ylim(50,100):y limit 50-100:把y轴限制在50-100区间
即只取画板 x 在50-100,y 在50-100之间的图像
原图:
取出部分图:
2.2.3 使用画笔改写画板
2.2.3.1 修改散点的颜色
# 若单纯的设置绘点的颜色则不用写在aes( )里,没有用到data=mymov里的数据
p+geom_point(colour="blue")
# 还可以使用颜色编号改变绘点颜色
p+geom_point(colour="#DC41Df")
2.2.3.2 修改散点的大小
p+geom_point(size=20)
2.2.3.3 修改原画板的绘图数据
p+geom_point(aes(x=BudMils)
- geom_point(aes(x=BudMils):将原来x=CRating,y=ARating,修改成x=BudMils,y=ARating(y没改,则y不变)
效果如下:
2.2.3.4 修改数据后,修改x轴标签
p+geom_point(aes(x=BudMils))+xlab("Budget in Millions")
- xlab(“Budget in Millions”):将原标签CRating,改为Budget in Millions
效果如下:
2.2.3.5 指定参数区域放大显示 coord_cartesian( )
# 绘制画板
n=ggplot(mymov,aes(x=BudMils))
# 使用画笔
n+geom_histogram(binwidth = 10,aes(fill=Genre),colour="blue")
+coord_cartesian(ylim=c(0,50))
- coord_cartesian(ylim=c(0,50)):指定在y轴0~50范围内的图像,放大显示
原图:
放大显示:
此外还有其他类型的操作:
详情参考知乎:https://zhuanlan.zhihu.com/p/29553382
2.2.3.6 修改主题属性 theme( )
# 设置画板
n=ggplot(mymov,aes(x=BudMils))
# 使用画笔
n+geom_histogram(binwidth = 10,aes(fill=Genre),colour="blue")+
xlab("Budget of the Movies")+ # 修改了x轴标签
ylab("Number of the Movies")+ # 修改了y轴标签
theme(
axis.title.x = element_text(colour = "Blue",size = 30),
axis.title.y = element_text(colour = "Red",size = 20),
axis.text.x = element_text(colour="Blue",size = 20),
axis.text.y = element_text(colour="red",size = 15),
legend.title = element_text(size=30),#设置图例标题属性即Genre
legend.text = element_text(size = 25),#设置每个小图标的名字属性
legend.position = c(1,1),legend.justification = c(1,1),#设置图例所在位置;#即将图例画板的右上角位置设置为图像画板的右上角
)
- axis.title.x = element_text(colour = “Blue”,size = 30):设置 x 轴标签属性
- axis.title.y = element_text(colour = “Red”,size = 20):设置 y 轴标签属性
- axis.text.x = element_text(colour=“Blue”,size = 20):设置 x 轴刻度值的属性
- axis.text.y = element_text(colour=“red”,size = 15):设置 y 轴刻度值的属性
- legend.title = element_text(size=30):设置图例标题属性
- legend.text = element_text(size = 25):设置每个小图标的名字属性
- legend.position = c(1,1),legend.justification = c(1,1):设置图例在图像中的位置;原理:将图像和图例分开看成两个画板,每个画板的左下、右下、左上、右上四个角分别对应 c(0,0)、c(1,0)、c(0,1)、c(1,1) 四个坐标,而此段代码表示含义:把图例的右上角即 legend.justification = c(1,1),放在图像的右上角即 legend.position = c(1,1)
原图:
修改主题后的图:
2.2.3.6 已有图像上增加线条
ggplot(carX,aes(x=price,y=residual))+
geom_point()+
geom_hline(yintercept = c(0,2*sd(carX$residual),-2*sd(carX$residual)),colour=c("red","blue","blue"))
说明
- carX 是 data frame
- 以 x=price(标准差),y=residual(残差)绘图
- sd(carX$residual):即carX中residual列的标准差
- geom_hline(yintercept = c( 0 , 2sd(carX
r
e
s
i
d
u
a
l
)
,
−
2
∗
s
d
(
c
a
r
X
residual) , -2*sd(carX
residual),−2∗sd(carXresidual) ),colour=c(“red”,“blue”,“blue”)):绘制三条水平直线分别在y=0,y=2sd(carX
r
e
s
i
d
u
a
l
)
,
y
=
−
2
∗
s
d
(
c
a
r
X
residual),y=-2*sd(carX
residual),y=−2∗sd(carXresidual),颜色分别是red、blue、blue
结果如下:
此外还有:
详情可见:https://www.cnblogs.com/wkslearner/p/5697471.html