相关文章推荐

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

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

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

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

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

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

  1. 趋势显示的二维散点图

  2. 分布显示的二维散点图

  3. 气泡图

  4. 三维散点图

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

2.本文框架

3.单数据系列

3.1数据格式

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

其中breaks表示边界点,counts表示每个区间内的个数,density表示密度函数值。mids表示区间的中间点,并利用这些参数来构建后续绘图所需要的数据。通过循环语句,计算出x,y坐标数据。前6项数据如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LSIa8DvO-1606045657300)(https://imgkr2.cn-bj.ufileos.com/70c9236d-2840-43bc-a322-128ea2c89185.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=z3N304V2ZESlWvJ1XgViodLY5aA%253D&Expires=1603888243)]

完整代码如下:

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包也可以绘制,当然改包还有其他好用的功能

下面对第三种方式进行实现:
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)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ckO1Uid8-1606045657324)(https://imgkr2.cn-bj.ufileos.com/956ac9d4-d6ce-4f9d-935d-6c059ff6d0f1.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=TOK1PGN2bOyBO4ECfNQXqQ8xaS4%253D&Expires=1603891614)]
欢迎关注【庄闪闪的成长手册】,包含R可视化,数据分析,数据科学等前沿信息。
在这里插入图片描述

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

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

1.前言散点图(scatter graph、point graph、X-Y plot、scatter chart )是科研绘图中最常见的图表类型之一,通常用于显示和比较数值。散点图是使用一系列的散点在直角坐标系中展示变量的数值分布。在二维散点图中,可以通过观察两个变量的数据变化,发现两者的关系与相关性。散点图可以提供三类关键信息:(1)变量之间是否存在数量关联趋势;(2)如果存在关联趋势,那么其是线性还是非线性的;(3)观察是否有存在离群值,从而分析这些离群值对建模分析的影响。本文可以看作是《
基于递归划分的散点图采样技术源码。当要展示的数据点非常多时,散点图往往会遇到过度绘制问题,也就是高密度区域点之间的相互重叠。这会使人们难以察觉真实的数据分布。采样能够解决过度绘制问题,但往往会丢失低密度区域的异常值,这同样扭曲了原始的数据分布。 我们提出了一种用于多类散点图的非均匀递归采样技术,其目标是忠实呈现相对数据和类密度并同时保留图中的主要离群值。我们的技术基于定制的二进制kd树,其通过递归细分数据对应的多类密度图来创建能够保持相对密度信息的叶节点。通过回溯,我们合并叶节点,直到它们涵盖了我们随后应用的异常值感知的多类采样策略的所有类的点。定量评估表明,与以前的方法相比,我们的方法可以更好地保存离群值,同时可以在多类散点图中保留相对密度。我们还用一些案例研究证明了该方法在探索复杂和真实数据中的有效性
微信公众号(年更选手):数据闲逛人 | Github开源项目:数分/数挖study路线 https://github.com/jc-dian/python_data_analysis 10-13 data2 = data2.groupby(['cat_1','cat_2','cat_3','cat_4'])['market'].apply(lambda x:x.str.cat(sep=',')).reset_index() 对’cat_1’,‘cat_2’,‘cat_3’,‘cat_4’ 这几列进行汇总成一行, 贼妙!!! from sklearn.cluster import KMeans X = [[0.0888, 0.5885], [0.1399, 0.8291], [0.0747, 0.4974], [0.0983, 0.5772], [0.1276, 0.5703], [0.1671, 0.5835], [0.1906, 0.5276], [0.1061, 0.5523], [0.2446, 0.4007], [0.167, 0.477], [0.2485, 0.4313], [0.1. 传达正确的信息、不扭曲事实。 简单而优雅。 凸显特征,而不是掩盖信息。 不会信息过载(元素过多)。 下面的列表根据其主要目的对可视化方法进行了分类。在你真正做图之前,试着想一想,你想通过可视化来传达或研究什么结论和关系。根据目的去选择不同的图表类型(很可能就是如下类型的一种或多种)
这里使用 C++ 计算轨迹,生成 Python 文件,使用 matplotlib 绘图。 1 // simulator.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 4 #include "pch.h" //预编译头,自行添加相关头文件 6 struct vec 8 double ...
from joblib import Parallel, delayed def processParallel(df,name): #处理数据,如果不加name,return的data没有group信息 return data def applyParallel(dfGrouped, func): retLst = Parallel(n_jobs=6)(delayed(func)(group,name) for name, group in dfGrouped) ret..
淘宝数据集是一个非常庞大的数据集,可用于各种类型的分析与可视化。以下是一些关于淘宝数据集的散点图分析示例: 1. 商品价格与销量的关系散点图:该图展示了商品价格与销量之间的关系,可以帮助卖家确定最佳的价格策略。 2. 用户年龄与购买力的关系散点图:该图展示了不同年龄段的用户的购买力,可以为卖家提供更加精准的营销策略。 3. 地域与商品销售量的关系散点图:该图展示了不同地域的商品销售量,可以帮助卖家确定最佳的销售区域。 以上是一些示例,淘宝数据集的可视化分析还有很多其他方面可以探索。不过需要注意的是,在使用淘宝数据集进行分析时,需要遵守相关法律法规,保护用户隐私。
 
推荐文章