R 可视乎 | 绘制卡通圣诞树

简介: 先和大家说一句圣诞快乐呀,最近 DIY 涂鸦圣诞树非常受欢迎,小编琢磨着能否用 R 语言来绘制一颗圣诞树呢,最后终于让小编找到了教程[1],这不赶紧在今天分享出来给大家,一起动手试一试吧~

简介


先和大家说一句圣诞快乐呀,最近 DIY 涂鸦圣诞树非常受欢迎,小编琢磨着能否用 R 语言来绘制一颗圣诞树呢,最后终于让小编找到了教程[1],这不赶紧在今天分享出来给大家,一起动手试一试吧~


画图步骤

Step 1:绘制一颗基础的树

这里选择一棵圣诞树的图片,对其进行网格划分,并将结果存在表格中。

数据集可在公众号后台回复 [圣诞快乐] 获取

ChristmasTree <- read.csv("C:\\Users\\Desktop\\Christmas_tree.csv")
library(ggplot2)
tree <- ggplot() + 
  geom_tile(data = ChristmasTree, aes(x = Tree.X, y = Tree.Y, fill = Tree.Colour)) +       
  scale_fill_identity() + 
  theme_bw() +
  scale_x_continuous(breaks = NULL) + 
  scale_y_continuous(breaks = NULL) +
  labs(x = "", y = "")
tree

geom_tile() 将每个数据点绘制成一个实心正方形。theme_bw()将背景颜色更改为白色。scale_x_continuous(breaks = NULL)(和 y 轴对应) 去掉标记和网格线。labs(x = "", y = "")去掉坐标轴。

image.gifSK0$VT[Q]6QZ{O]S41}`JZ6.png


Step 2:添加灯饰

现在,可以在树上添加一些灯光,通过在基础树图上叠加一些散点来完成。这些散点的坐标是基于均匀分布随机产生的。给灯设置的数量是 50 ,底部分布的数量为 35% ,顶部为 5% ,参数值可以根据自己喜好更改。最后一个变量的值从1到4,使用这个来控制每个点的透明度。

##创建灯饰
Desired.Lights <- 50
Total.Lights <- sum(round(Desired.Lights * 0.35) + round(Desired.Lights * 0.20) + 
                      round(Desired.Lights * 0.17) + round(Desired.Lights * 0.13) +
                      round(Desired.Lights * 0.10) + round(Desired.Lights * 0.05))
Lights <- data.frame(Lights.X = c(round(runif(round(Desired.Lights * 0.35), 4, 18), 0),
                                       round(runif(round(Desired.Lights * 0.20), 5, 17), 0),
                                       round(runif(round(Desired.Lights * 0.17), 6, 16), 0),
                                       round(runif(round(Desired.Lights * 0.13), 7, 15), 0),
                                       round(runif(round(Desired.Lights * 0.10), 8, 14), 0),
                                       round(runif(round(Desired.Lights * 0.05), 10, 12), 0)))
Lights$Lights.Y <- c(round(runif(round(Desired.Lights * 0.35), 4, 6), 0),
                          round(runif(round(Desired.Lights * 0.20), 7, 8), 0),
                          round(runif(round(Desired.Lights * 0.17), 9, 10), 0),
                          round(runif(round(Desired.Lights * 0.13), 11, 12), 0),
                          round(runif(round(Desired.Lights * 0.10), 13, 14), 0),
                          round(runif(round(Desired.Lights * 0.05), 15, 17), 0))
Lights$Lights.Colour <- c(round(runif(Total.Lights, 1, 4), 0))
##将灯添加到树上
tree <- tree +
          geom_point(data = Lights, aes(x = Lights.X, y = Lights.Y, alpha = Lights.Colour),
                     colour = "lightgoldenrodyellow", shape = 16) +
          theme(legend.position = "none")
tree

NKGZ}JF79BA722IDMQN[~`D.png


Step 3:添加装饰物

在第二步的图上添加了另一种散点(这一次是加权散点)。手动绘制了每个点的坐标,并手动分配每个点的颜色和大小。也可以任意修改这些位置和大小。

##创建装饰物
Baubles <- data.frame(Bauble.X = c(6, 9, 15, 17, 5, 13, 16, 7, 10, 14, 7, 9, 11, 
                                   14, 8, 14, 9, 12, 11, 12, 14, 11, 17, 10))
Baubles$Bauble.Y <- c(4, 5, 4, 4, 5, 5, 5, 6, 6, 6, 8, 8, 8, 8, 10,
                      10, 11, 11, 12, 13, 10, 16, 7, 14)
Baubles$Bauble.Colour <- factor(c(1, 2, 2, 3, 2, 3, 1, 3, 1, 1, 1, 2, 1, 2,
                                  3, 3, 2, 1, 3, 2, 1, 3, 3, 1))
Baubles$Bauble.Size <- c(1, 3, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 3, 3, 3,
                         2, 3, 1, 1, 2, 2, 3, 3, 2)
##将装饰物添加到树上
tree <- tree + 
          geom_point(data = Baubles, aes(x = Bauble.X, y = Bauble.Y, 
                                         colour = Bauble.Colour, size = Bauble.Size),
                     shape = 16) +
          scale_colour_manual(values = c("firebrick2", "gold", "dodgerblue3")) +
          scale_size_area(max_size = 12)
tree

image.gifHWK@QTQXX%VV8~I`M6XBXKR.png


Step 4:装饰礼物

树下的礼物看起来太单调了,可以用缎带来装饰一下,使用 geom_segment() 函数来实现这一点。

tree <- tree +
          geom_segment(aes(x = 2.5, xend = 4.5, y = 1.5, yend = 1.5), colour = "blueviolet", size = 2) +
          geom_segment(aes(x = 5.5, xend = 8.5, y = 1.5, yend = 1.5), colour = "dodgerblue3", size = 2) +
          geom_segment(aes(x = 13.5, xend = 16.5, y = 1.5, yend = 1.5), colour = "blueviolet", size = 2) +
          geom_segment(aes(x = 17.5, xend = 19.5, y = 1.5, yend = 1.5), colour = "dodgerblue3", size = 2) +
          geom_segment(aes(x = 3.5, xend = 3.5, y = 0.5, yend = 2.5), colour = "blueviolet", size = 2) +
          geom_segment(aes(x = 7.0, xend = 7.0, y = 0.5, yend = 2.5), colour = "dodgerblue3", size = 2) +
          geom_segment(aes(x = 15.0, xend = 15.0, y = 0.5, yend = 2.5), colour = "blueviolet", size = 2) +
          geom_segment(aes(x = 18.5, xend = 18.5, y = 0.5, yend = 2.5), colour = "dodgerblue3", size = 2)
tree

可以看到,对于水平色带,设置了一个 x坐标范围,但为了得到一条直线,设置了两个y坐标的相同值,而对于垂直线,则设置了相反的值。还可以使用颜色和大小参数分别改变彩带的颜色和厚度。

2@EI(CMGF$7~9SKFRDU`9L7.png


Step 5:添加祝福语

这里用到 extrafont包导入一些额外的字体。

library(extrafont)
font_import()
loadfonts()
tree <- tree +
          annotate("text", x = 11, y = 20, label = "Merry Christmas!", 
                   family = "Luminari", size = 12)
tree

这里使用了带有 “text”参数的注释选项来插入“Merry Christmas!” ,位置选在坐标(11,20)处。字体选择的是大小为 12 的 Luminari,如需要修改字体,可以通过 familysize 参数来设置。

JPL@2K2YXEY}Z570U9VD0@Y.png

目录
相关文章
Threejs实现下雨,下雪,阴天,晴天,火焰
Threejs实现下雨,下雪,阴天,晴天,火焰
1342 0
Threejs实现下雨,下雪,阴天,晴天,火焰
|
1月前
超简单的html+css魔幻霓虹灯文字特效
超简单的html+css魔幻霓虹灯文字特效
13 3
超简单的html+css魔幻霓虹灯文字特效
|
6月前
|
数据可视化
好玩的DEM制图:等高线地形图入门与进阶
好玩的DEM制图:等高线地形图入门与进阶
54 0
|
9月前
|
编解码 图形学 Python
ArcMap:如何渲染一幅精美的地形图
ArcMap:如何渲染一幅精美的地形图
160 1
|
11月前
|
小程序
如何做一个俄罗斯方块6:形状停靠
在处理形状停靠之前,有一点儿东西需要了解,就是已经停靠的方块和正在下落的方块不是一种方块,如图,红色的表示的是已经停靠的方块,绿色的表示下落的绿色方块的作用是展示当前下落的形状,红色方块的作用是标识出哪些位置已经摆放了方块。
86 0
|
前端开发 容器
「CSS畅想」七夕寄情,我绘制了一副双色莲花图
用技术实现梦想,用梦想打开创意之门。七夕寄情,我用CSS绘制了一副双色莲花图。
146 1
「CSS畅想」七夕寄情,我绘制了一副双色莲花图
|
Python
海龟绘图简单科普
著名人物爱因斯坦曾说过,兴趣是最好的老师,句话在编程方面也同样适用。大部分人如果没有所谓的情节、入门、回报的话。相对于python,很多人对这一方面都是不感冒的,更不要谈一开始就要去背某些命令、函数之类的。
96 0
|
存储 程序员
七夕快到了,用SwiftUI做一个表达爱意的心形动画
传统的七夕快到了,作为一个程序猿,最浪漫的礼物当然是自己写的啦! 思来想去也不知道写什么好,在某天在某音上学习时看到点赞的动画效果还不错,那不如就做一个表达爱意的动画吧。
294 0
七夕快到了,用SwiftUI做一个表达爱意的心形动画
程序人生 - 猫咪瞳孔的颜色
程序人生 - 猫咪瞳孔的颜色
90 0