• R 椭圆随机点产生并画图


    产生数据集

    首先我想到的怎么在R中产生数据集,我知道python中有make_blob函数,那么R中是否有对应的函数呢,虽然我可以在python产生数据再导入到R会很麻烦,因为我不是产生一次数据就完了,我得模拟很多次,最终找到一个比价满意的,
    https://github.com/elbamos/clusteringdatasets
    这个R包里面提供了和sklearn里面的make_blob一样的函数
    安装方式如下
    首先下载github的源文件

    install.packages("/Volumes/MACPAN/Chrome下载/clusteringdatasets-master/",type="source",repos=NULL)
    library(clusteringdatasets)
    
    
    • 1
    • 2
    • 3

    安装后就可以使用了
    使用案例如下

    rm(list=ls())
    library(ggplot2)
    library(clusteringdatasets)
    set.seed(1)
    n_sample=20000
    center_metrix=matrix(c(0,3,-2,0,2,0),nrow=3,byrow = T) # 设置cluster中心
    ##
    blobs <- make_blobs(n_samples = n_sample,centers=center_metrix,cluster_std = 0.2)
    xx=sample(c(1,2,3),n_sample,replace=T)
    blobs$labels=xx
    
    # 因为我的结果最终就是非常圆润的,所以我想把一些点给删掉
    # radis=0.3
    # r1=center_metrix[1,]
    # r2=center_metrix[2,]
    # r3=center_metrix[3,]
    
    df=as.data.frame(blobs)
    colnames(df)=c("x","y","cluster")
    df$cluster=as.factor(df$cluster)
    
    #plot(blobs$samples, col=rainbow(3)[blobs$labels])
    p=ggplot(data=df,aes(x=x,y=y,colour=cluster))+geom_point()
    print(p)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    结果如下
    在这里插入图片描述
    但是我画出这个后,为了更好看一点,我想进一步画椭圆的图,这个怎么实现呢
    https://stackoverflow.com/questions/41820683/how-to-plot-ellipse-given-a-general-equation-in-r
    这个问题里有提到怎么画椭圆
    在这里插入图片描述其实这个椭圆是我想要的,但是这个只是画图,不提供表达式,因为我本质上要再要在一个椭圆内产生随机分布的点
    pass

    然后我又找到了一个类似的问题
    https://stackoverflow.com/questions/64847597/how-do-i-generate-data-where-points-are-repelled-if-they-land-within-a-certain
    这个里面阐述了怎么在一个圆内产生随机分布的点,但我需要的是椭圆,倒是可以借鉴,

    然后我还找到一个更有意思的画图方案,直接画椭圆的置信区间
    https://blog.csdn.net/maryyu8873/article/details/78491869

    library(car)
    dataEllipse(Duncan$income, Duncan$education, levels=0.95,xlim=c(-30,120),ylim=c(-30,160))
    
    • 1
    • 2

    在这里插入图片描述这个其实也是可以拿来参考的,不过我后面发现了一个完美的解决方式
    就是使用runifdisc函数
    我实现的代码如下

    #################################    plot cluster1 #########################
    ############################################################################
    ############################################################################
    ############################################################################
    n_sample=2000
    center=c(0,3)
    X <- runifdisc(n_sample)
    Y <- affine(X, mat=diag(c(1.5,0.8)))
    Z = Y
    #Z = rotate(Y,45)
    df = as.data.frame(matrix(nrow=n_sample,ncol=3)) #创建一个3列的空对象
    colnames(df)=c("x","y","cluster")
    df$x=Z$x
    df$y=Z$y
    df$x=df$x+center[1]
    df$y=df$y+center[2]
    df$cluster=sample(c("Batch1","Batch2","Batch3"),n_sample,replace=T)
    df$cluster=as.factor(df$cluster)
    df1=df
    
    ###########################  plot cluster 2 ################################
    ############################################################################
    ############################################################################
    ############################################################################
    
    center=c(-4,0)
    X <- runifdisc(n_sample)
    Y <- affine(X, mat=diag(c(1,1.5)))
    #Z=Y
    Z = rotate(Y,90)
    #Z = rotate(Z,45)
    
    df = as.data.frame(matrix(nrow=n_sample,ncol=3)) #创建一个3列的空对象
    colnames(df)=c("x","y","cluster")
    df$x=Z$x
    df$y=Z$y
    df$x=df$x+center[1]
    df$y=df$y+center[2]
    df$cluster=sample(c("Batch1","Batch2","Batch3"),n_sample,replace=T)
    df$cluster=as.factor(df$cluster)
    df2=df
    
    ###########################  plot cluster 3 ################################
    ############################################################################
    ############################################################################
    ############################################################################
    
    center=c(4,0)
    X <- runifdisc(n_sample)
    Y <- affine(X, mat=diag(c(2,1)))
    Z = rotate(Y,135)
    df = as.data.frame(matrix(nrow=n_sample,ncol=3)) #创建一个3列的空对象
    colnames(df)=c("x","y","cluster")
    df$x=Z$x
    df$y=Z$y
    df$x=df$x+center[1]
    df$y=df$y+center[2]
    df$cluster=sample(c("Batch1","Batch2","Batch3"),n_sample,replace=T)
    df$cluster=as.factor(df$cluster)
    df3=df
    
    
    df=rbind(df1,df2,df3)
    colnames(df)=c("x","y","BATCH")
    
    p=ggplot(data=df,aes(x=x,y=y,colour=BATCH))+geom_point(size=1)+
      theme(aspect.ratio=1)+theme_void()+
      guides(colour = guide_legend(override.aes = list(size = 20,alpha=1,shape=16)))+
      theme(legend.position = c(0.8, 0.7),legend.title=element_text(size=20))+
      theme(legend.text=element_text(size=20))+
      scale_color_manual(values=RColorBrewer::brewer.pal(3,"Set1"))
    print(p)
    
    ggsave("./simulation_plot.png",plot=p)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    最终的结果如下
    在这里插入图片描述左边那个椭圆的角度我怎么调都调不好,感觉旋转的角度不对,不过看起来是还是蛮漂亮的,达到了我的需求,嘿嘿

  • 相关阅读:
    什么是Redis?
    Overleaf中使用 LaTex制作PPT
    信息学奥赛一本通:1148:连续出现的字符
    非关系型数据库Redis的安装【Linux】及常用命令
    购物车案例的实现
    栈和队列的基本使用
    c++视觉处理---霍夫变换
    FastDFS的安装及上传下载(二)
    Node.js的安装
    Selenium环境+元素定位大法
  • 原文地址:https://blog.csdn.net/qq_45759229/article/details/125418787