专栏首页庄闪闪的R语言手册R可视乎 | 散点图系列(2)

R可视乎 | 散点图系列(2)

1.前言

散点图(scatter graph、point graph、X-Y plot、scatter chart )是科研绘图中最常见的图表类型之一,通常用于显示和比较数值。散点图是使用一系列的散点在直角坐标系中展示变量的数值分布。在二维散点图中,可以通过观察两个变量的数据变化,发现两者的关系与相关性。

散点图可以提供三类关键信息:

(1)变量之间是否存在数量关联趋势;

(2)如果存在关联趋势,那么其是线性还是非线性的;

(3)观察是否有存在离群值,从而分析这些离群值对建模分析的影响。


本文可以看作是《R语言数据可视化之美》[1]的学习笔记。该书第四章——数据关系型图表中展示的散点图系列包括以下四个方面:

  1. 趋势显示的二维散点图
  2. 分布显示的二维散点图
  3. 气泡图
  4. 三维散点图

本文主要对第二部分进行介绍,并加上小编自己的理解。下面几个部分也会在最近陆续推出,敬请关注。

2.本文框架

3.单数据系列

3.1数据格式

这里我们使用正态分布随机产生250个数据(这个就是实际我们采集的一维数据)。step是指按照多少的区间进行划分类别。我们通过hist()将直方图内部数据进行存储(我也是第一次见这种操作,以后学起来)。输出hg,内部包含参数如下所示:

其中breaks表示边界点,counts表示每个区间内的个数,density表示密度函数值。mids表示区间的中间点,并利用这些参数来构建后续绘图所需要的数据。通过循环语句,计算出x,y坐标数据。前6项数据如下所示:

完整代码如下:

#加载包
library(ggplot2)
library(RColorBrewer) #颜色
library(scales)

x <- rnorm(250 , mean=10 , sd=1) 
step<-0.2
breaks<- seq(min(x)-step,max(x)+step,step)

hg <- hist(x, breaks = breaks , plot = FALSE)#使用直方图数据,但不绘图

bins <- length(hg$counts) # bin类别数
yvals <- numeric(0)       
xvals <- numeric(0) 
for(i in 1:bins) {       
  yvals <- c(yvals, hg$counts[i]:0)  
  xvals <- c(xvals, rep(hg$mids[i], hg$counts[i]+1))  
}    
                                                   
dat <- data.frame(xvals, yvals)  # 变成dataframe格式
dat <- dat[yvals > 0, ]          # 去除小于0的数

colormap <- colorRampPalette(rev(brewer.pal(11,'Spectral')))(32) #颜色选择

3.2原始数据绘制

接下来我们使用该数据(单数据)进行绘制:

  • 柱状图(正态分布)
ggplot(dat, aes(x=xvals,y=yvals,fill=yvals))+
  geom_tile(colour="black")+
  scale_fill_gradientn(colours=colormap)+
  ylim (0, max(yvals)*1.3)+
  theme(
    text=element_text(size=15,color="black"),
    plot.title=element_text(size=15,family="myfont",
      face="bold.italic",hjust=.5,color="black"),
    legend.background = element_blank(),
    legend.position=c(0.9,0.75)
  )

geom_tile(colour="black")改为geom_point(colour="black",shape=21,size=4)会得到以下图片

ggplot(dat, aes(x=xvals,y=yvals,fill=yvals))+
  geom_point(colour="black",shape=21,size=4)+
  scale_fill_gradientn(colours=colormap)+
  ylim (0, max(yvals)*1.3)+
  theme(
    text=element_text(size=15,color="black"),
    plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
    legend.background = element_blank(),
    legend.position=c(0.9,0.75)
  )

3.3 Q-Q图的绘制

在R中可以使用CircStats包的pp.plot()函数绘制P-P图;ggplot2 包的geom_qq()函数和geom_qq_line()函数结合可以绘制Q-Q 图;另外,ggplot2包结合ggpubr包也可以绘制,当然改包还有其他好用的功能[2]

下面对第三种方式进行实现:ggpubr包中的ggqqplot相应参数如下,包括了非常多的参数,前两个参数分别表示:数据,要绘制的变量。当然其他数据包括设置主题(ggtheme);添加qqline(add = c("qqline"))等。

ggqqplot(
  data,  x,  combine = FALSE,  merge = FALSE,  color = "black",  palette = NULL,  size = NULL,  shape = NULL,  add = c("qqline", "none"),  add.params = list(linetype = "solid"),  conf.int = TRUE,  conf.int.level = 0.95,
  title = NULL,  xlab = NULL,  ylab = NULL,  facet.by = NULL,  panel.labs = NULL,  short.panel.labs = TRUE,  ggtheme = theme_pubr(),  ...
)

为了更好解释这个函数,我们重新模拟一个数据集。

library(ggpubr)
# 创建一个数据集
set.seed(1234)
wdata = data.frame(
   sex = factor(rep(c("F", "M"), each=200)),
   weight = c(rnorm(200, 55), rnorm(200, 58)))
head(wdata, 4)
# 基本的Q-Q图
ggqqplot(wdata, x = "weight")
# 按性别改变颜色和形状
ggqqplot(wdata, x = "weight",
   color = "sex",
  ggtheme = ggplot2::theme_grey())#更改主题(灰色)当然可以用其他主题

3.4 带透明度设置的散点图

  • 数据设定

这个数据是张杰老师书中的数据,是经过一定处理得到的,结果图可以看下面。

library(ggplot2)
library(RColorBrewer)  

mydata<-read.csv("HighDensity_Scatter_Data.csv",stringsAsFactors=FALSE)
head(mydata)

我们利用ggplot()简单绘制二维数据的散点图,之后在对该数据进行聚类。

ggplot(data = mydata, aes(x,y)) +
  geom_point( colour="black",alpha=0.1)+
  labs(x = "Axis X",y="Axis Y")+
  theme(
    text=element_text(size=15,color="black"),
    plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),
    legend.position="none"
  )

3.5 kmeans聚类的散点图

对上面数据进行kmeans聚类,这里使用base中的 kmeans()进行分类(两类),然后将分类情况(cluster)进行存储,并转化成因子类型。绘图时,cluster来设置颜色,这样就可以很明显看出分类结果。

kmeansResult<- kmeans(mydata, 2, nstart = 20)
mydata$cluster <- as.factor(kmeansResult$cluster)
ggplot(data = mydata, aes(x,y,color=cluster)) +
  geom_point( alpha=0.2)+
  scale_color_manual(values=c("#00AFBB",  "#FC4E07"))+
  labs(x = "Axis X",y="Axis Y")+
  theme(
    text=element_text(size=15,color="black"),
    plot.title=element_text(size=15,family="myfont",face="bold.italic",color="black"),
    legend.background=element_blank(),
    legend.position=c(0.85,0.15)
  )

3.6 带椭圆标定的聚类散点图

有时候我们想突出聚类结果会在结果上画上椭圆,那么可以使用stat_ellipse()

ggplot(data = mydata, aes(x,y,color=cluster)) +
  geom_point (alpha=0.2)+  # 绘制透明度为0.2 的散点图
  stat_ellipse(aes(x=x,y=y,fill= cluster), geom="polygon", level=0.95, alpha=0.2)+#绘制椭圆标定不同类别
  scale_color_manual(values=c("#00AFBB","#FC4E07"))+#使用不同颜色标定不同数据类别
  scale_fill_manual(values=c("#00AFBB","#FC4E07"))+#使用不同颜色标定不同椭类别
  labs(x = "Axis X",y="Axis Y")+
  theme(
    text=element_text(size=15,color="black"),
    plot.title=element_text(size=15,family="myfont",face="bold.italic",color="black"),
    legend.background=element_blank(),
    legend.position=c(0.85,0.15)
  )

3.7 多数据系列

多数据系列,其实在聚类散点图就已经涉及到。这里对较少数据进行绘制,这样看起来结果更加美观。

mydata<-mydata[round(runif(300,0,10000)),]
kmeansResult<- kmeans(mydata, 2, nstart = 20)
mydata$cluster <- as.factor(kmeansResult$cluster)
ggplot(data = mydata, aes(x,y,fill=cluster,shape=cluster)) +
  geom_point(size=4,colour="black",alpha=0.7)+
  scale_shape_manual(values=c(21,23))+
  scale_fill_manual(values=c("#00AFBB",  "#FC4E07"))+
  labs(x = "Axis X",y="Axis Y")+
  scale_y_continuous(limits = c(-5, 10))+
  scale_x_continuous(limits = c(-5, 10))+
  theme(
    text=element_text(size=15,color="black"),
    plot.title=element_text(size=15,family="myfont",face="bold.italic",color="black"),
    legend.background=element_blank(),
    legend.position=c(0.85,0.15)
  )

参考资料

[1]

《R语言数据可视化之美》: https://github.com/EasyChart/Beautiful-Visualization-with-R

[2]

ggpubr简介: https://rpkgs.datanovia.com/ggpubr/index.html

本文分享自微信公众号 - 庄闪闪的R语言手册(Zss_R4ds),作者:庄闪闪

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R可视乎 | 散点图系列(1)

    散点图(scatter graph、point graph、X-Y plot、scatter chart )是科研绘图中最常见的图表类型之一,通常用于显示和比较...

    庄闪闪
  • R可视乎|克利夫兰点图系列

    在可靠性实验中,不同产品的测试失效时间可以通过克利夫兰点图进行可视化,今天就对该系列的图进行系统的介绍。主要参考张杰博士的《R语言数据可视化之美》[1],并结合...

    庄闪闪
  • R可视乎|复合饼图系列

    散点复合饼图(compound scatter and pie chart)可以展示三个数据变量的信息:(x, y, P),其中x和y决定气泡在直角坐标系中的位...

    庄闪闪
  • 数据可视化(2)-Seaborn系列 | 散点图scatterplot()

    案例代码已上传:https://github.com/Vambooo/SeabornCN

    数据分析可视化
  • R语言之可视化⑦easyGgplot2散点图目录

    ggplot2.stripchart是一个易于使用的函数(来自easyGgplot2包),使用ggplot2绘图系统和R软件生成条带图。 条形图也被称为一维散点...

    用户1359560
  • 动态地理信息可视化——散点地图系列

    这是一篇拖了好久的稿子,因为过年玩high了,一直放着没写,今天得空,赶快得空,赶紧整理一下。 本篇主讲leaflet在线地图系列中的散点系列,包含颜色映射规则...

    数据小磨坊
  • 数据可视化(8)-Seaborn系列 | 分类散点图stripplot()

    stripplot()可以自己实现对数据分类的展现,也可以作为盒形图或小提琴图的一种补充,用来显示所有结果以及基本分布情况。

    数据分析可视化
  • 数据可视化(9)-Seaborn系列 | 分簇散点图swarmplot()

    该函数类似于stripplot(),但该函数可以对点进行一些调整,使得数据点不重叠。

    数据分析可视化
  • R语言之可视化⑧easyGgplot2散点图续目录

    用户1359560
  • R语言可视化——散点图及其美化技巧!

    今天开始跟大家分享散点图及其美化技巧! R语言中的散点图需要两个数值型变量分别作为X轴、Y轴映射对象,同时通过颜色、大小、形状进行分类变量映射。 由于散点图在数...

    数据小磨坊
  • R语言可视化——地图填充与散点图图层叠加

    今天跟大家分享关于如何在地图图层上添加散点图。 散点图需要精确的经纬度信息才能在叠加的图层上进行映射,因此我们选用中国省级轮廓地图以及各省省会城市的经纬度进行案...

    数据小磨坊
  • R语言之可视化①③散点图+拟合曲线目录

    gene2) Pearson's product-moment correlation data: data gene1 and data$gene2 ...

    用户1359560
  • Python数据可视化与basemap数据地图系列2——点线图

    前一篇介绍了如何使用mpl_toolkits包中的basemap模块制作填充地图,这一节继续分享线图+点图的应用。

    数据小磨坊
  • 数据可视化(13)-Seaborn系列 | 点图pointplot()

    注:点图只显示平均值(或其他估计值)。但在许多情况下,显示每个分类变量级别的值分布可能更具信息性。此时,其他方法如一个盒子或小提琴可能更合适。

    数据分析可视化
  • 【独家】手把手教线性回归分析(附R语言实例)

    本文长度为8619字,建议阅读15分钟 本文为你介绍线性回归分析。 通常在现实应用中,我们需要去理解一个变量是如何被一些其他变量所决定的。 回答这样的问题,需要...

    数据派THU
  • 手把手教线性回归分析(附R语言实例)

    本文为你介绍线性回归分析。 通常在现实应用中,我们需要去理解一个变量是如何被一些其他变量所决定的。 回答这样的问题,需要我们去建立一个模型。一个模型就是一个公式...

    数据派THU
  • 谁说偷窥一定要趴墙头?这个系统可用声波「看见」墙后物体

    我站在墙前,想看到拐角处我视线范围之外的事物,除了伸长脖子或者走过去,还有别的方法吗?

    机器之心
  • 数据新闻精选| R语言和网络图:数据叙事好帮手

    R语言能挖掘、整理数据,网络图可以呈现故事脉络,两者各显神通。深度君精选数据网站FiveThirtyEight的R语言应用心得,数据新闻网络图叙事的类型,还可参...

    小莹莹
  • 使用Seaborn和Pandas进行相关性分析和可视化

    数据集可以讲述很多故事。要想了解这些故事的展开,最好的方法就是从检查变量之间的相关性开始。在研究数据集时,我首先执行的任务之一是查看哪些变量具有相关性。这让我更...

    deephub

扫码关注云+社区

领取腾讯云代金券