教程来自一墩难求?教你用R语言绘制出自己的冰墩墩!(R语言绘制椭圆、圆角矩形、贴图等) - 知乎 (zhihu.com)
安装并加载所需的包
安装包
需要ggplot2、ggfore和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),然后将图片复制到这个文件夹里去,比如我们搜索到这个图:
logoBeijing 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
网友评论