美文网首页
教你用R语言绘制出自己的冰墩墩

教你用R语言绘制出自己的冰墩墩

作者: 欧阳松 | 来源:发表于2022-08-29 18:06 被阅读0次

    教程来自一墩难求?教你用R语言绘制出自己的冰墩墩!(R语言绘制椭圆、圆角矩形、贴图等) - 知乎 (zhihu.com)

    安装并加载所需的包

    安装包

    需要ggplot2ggfore和ggimg三个包,都是可以直接安装的

    install.packages('ggplot2')
    install.packages('ggforce')
    install.packages('ggimg')
    

    加载包

    library(ggplot2) 
    library(ggforce) #用于绘制椭圆、三角形、多边形等。
    library(ggimg) #用于叠加外部图片,类似于贴图,我这里将冬奥会的logo贴上去了
    

    ggforce包主要用到其中的两个函数:geom_ellipse()geom_shape() 函数,前者用于绘制椭圆形,后者用于绘制三角形、矩形、多边形等。

    整个冰墩墩的各要素也基本都是用这两个函数绘制出的椭圆形、三角形、多边形等结合而成。因为ggplot2绘图的原理是一层层叠加图层,所以注意好前后顺序即可。

    创建数据框

    提前创建几个数据框,用于geom_shape()函数绘制三角形、圆角矩形

    data1 <- data.frame(label=c('A','A','A','B','B','B','C','C','C','C','C','D','D','D','D','D'),
                          x=c(-9,-6,-4,  9,6,4,  -4.6,-1.4,-1.5,-1.2,-4.5,  4.6,1.4,1.5,1.2,4.5),
                          y=c(-0.17,-3,3,  1.8,4,-1,  -5,-5,-8.5,-10,-10,  -5,-5,-8.5,-10,-10))
    data2 <- data.frame(label=c('A','A','A'),
                        x=c(-1,0,1),
                        y=c(3.6,2.6,3.6))
    data3 <- data.frame(label=c('A','A','A'),
                        x=c(6.9,7.95,9),
                        y=c(3.1,2.1,3.1))
    

    这几个数据框分别用于绘制不同图层的几个要素:手、脚、鼻子等。

    而使用geom_ellipse()函数绘制椭圆时比较简单,所以不用先创建数据集,直接在绘图函数内设定。

    logo贴图

    冰墩墩的肚子上有一个北京2022和奥运五环的logo,这个需要自行去下载,并且设置好存放logo的文件夹,比如我们在桌面新建一个叫logo的文件夹(/Users/mac/Desktop/logo),然后将图片复制到这个文件夹里去,比如我们搜索到这个图:

    logo

    Beijing 2022

    使用ggimg包读取并设置好参数,如x轴和y轴位置

    logo <-
         data.frame(x=0,y=-2.5,
                    img=list.files(path = "/Users/mac/Desktop/logo",
                    full.names = T)
                    )
    

    绘图

    完整绘图代码如下,结果见Figure 1所示。

    p<-ggplot() +
      coord_fixed()+ #固定x、y轴刻度比例
      scale_x_continuous(limits = c(-10,10))+
      scale_y_continuous(limits = c(-12,10))+
      theme_test()+
      geom_ellipse(aes(x0 = 0, y0 = 0, a = 7.4, b = 8.9, angle = 0),cex=1.2,color='grey30',fill='white')+
      geom_ellipse(aes(x0 = -4, y0 = 7, a = 1.3, b = 1.5, angle = 0),fill='black')+
      geom_ellipse(aes(x0 = 4, y0 = 7, a = 1.3, b = 1.5, angle = 0),fill='black')+
      geom_ellipse(aes(x0 = 8, y0 = 3.1, a = 1.6, b = 1.8, angle =40),fill='black')+
      geom_ellipse(aes(x0 = -8, y0 = -1.5, a = 1.6, b = 1.8, angle =40),fill='black')+
      geom_shape(data = data1,aes(x,y,group=label),radius = unit(3,'mm'),fill='black')+ #绘制有圆角的多边形
      geom_ellipse(aes(x0 = 0, y0 = 0, a = 7, b = 8.5, angle = 0),cex=2,fill='white')+
      geom_ellipse(aes(x0 = 0, y0 = 2.5, a = 5.5, b = 4.5, angle = 0),cex=1.5,fill='white',color='#73C8F7')+
      geom_ellipse(aes(x0 = 0, y0 = 2.5, a = 5.35, b = 4.35, angle = 0),cex=1.5,fill='white',color='#EABF64')+
      geom_ellipse(aes(x0 = 0, y0 = 2.5, a = 5.2, b = 4.2, angle = 0),cex=1.5,fill='white',color='#7E5C8A')+
      geom_ellipse(aes(x0 = 0, y0 = 2.5, a = 5.05, b = 4.05, angle = 0),cex=1.5,fill='white',color='#89BF7B')+
      geom_ellipse(aes(x0 = 0, y0 = 2.5, a = 1.6, b = 1.2, angle = 0),cex=1,color='#AD2B28',fill='#AD2B28')+
      geom_ellipse(aes(x0 = 0, y0 = 2.7, a = 2, b = 1, angle = 0),cex=1,color='white',fill='white')+
      geom_shape(data = data2,aes(x,y,group=label),radius = unit(1.5,'mm'),fill='black')+
      geom_ellipse(aes(x0 = -2.5, y0 = 4, a = 1.3, b = 2.2, angle = 40),cex=2,fill='black')+
      geom_ellipse(aes(x0 = 2.5, y0 = 4, a = 2.2, b = 1.3, angle = 40),cex=2,fill='black')+
      geom_ellipse(aes(x0 = -1.8, y0 = 4.5, a = 0.7, b = 0.7, angle = 0),cex=1,color='white',fill='black')+
      geom_ellipse(aes(x0 = 1.8, y0 = 4.5, a = 0.7, b = 0.7, angle = 0),cex=1,color='white',fill='black')+
      geom_ellipse(aes(x0 = -1.8, y0 = 4.9, a = 0.1, b = 0.1, angle = 0),cex=1.1,color='white',fill='white')+
      geom_ellipse(aes(x0 = 1.8, y0 = 4.9, a = 0.1, b = 0.1, angle = 0),cex=1.1,color='white',fill='white')+
      geom_ellipse(aes(x0 = 8.5, y0 = 3.5, a = 0.6, b = 0.6, angle = 0),cex=1,fill='#AD2B28',color='#AD2B28')+
      geom_ellipse(aes(x0 = 7.4, y0 = 3.5, a = 0.6, b = 0.6, angle = 0),cex=1,fill='#AD2B28',color='#AD2B28')+
      geom_shape(data = data3,aes(x,y,group=label),fill='#AD2B28',color='#AD2B28')+
      geom_point_img(data=logo,aes(x,y,img=img),size=3.5,vjust = 1)
    
    p
    
    Figure 1: Bing Dwen Dwen

    再次修改

    有了基本函数以后,基于ggplot2语句,我们可以再次修改参数,比如隐藏x轴和y轴,修改主题和添加标题等,见Figure 2所示。

    p+
      theme_no_axes()+
      labs(x=NULL,
           y=NULL,
           title = "Bing Dwen Dwen",
           caption="swcyo,2022-8-20")
    
    Figure 2: bingdundun

    相关文章

      网友评论

          本文标题:教你用R语言绘制出自己的冰墩墩

          本文链接:https://www.haomeiwen.com/subject/yhkknrtx.html