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

2022-08-29  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读