数据可视化 - Data Frame - qplot 、ggplot

本文详细介绍了R语言中DataFrame的获取与操作,包括读取CSV、创建DataFrame、查看统计信息、取值、操作列以及删除DataFrame。同时,深入探讨了qplot()和ggplot()的绘图功能,如散点图、箱线图、折线图、曲线图、条形图的绘制,以及如何进行多笔绘图、分割画板、修改画板属性等高级技巧。此外,还展示了如何进行数据的等值连接和保存到CSV文件。
摘要由CSDN通过智能技术生成

文章目录


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),2sd(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=2sd(carXresidual),颜色分别是red、blue、blue
    结果如下:
    在这里插入图片描述
    此外还有:
    在这里插入图片描述
    详情可见:https://www.cnblogs.com/wkslearner/p/5697471.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值