先和大家说一句圣诞快乐呀,最近 DIY 涂鸦圣诞树非常受欢迎,小编琢磨着能否用 R 语言来绘制一颗圣诞树呢,最后终于让小编找到了教程[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 = "")
去掉坐标轴。
现在,可以在树上添加一些灯光,通过在基础树图上叠加一些散点来完成。这些散点的坐标是基于均匀分布随机产生的。给灯设置的数量是 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
在第二步的图上添加了另一种散点(这一次是加权散点)。手动绘制了每个点的坐标,并手动分配每个点的颜色和大小。也可以任意修改这些位置和大小。
##创建装饰物
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
树下的礼物看起来太单调了,可以用缎带来装饰一下,使用 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坐标的相同值,而对于垂直线,则设置了相反的值。还可以使用颜色和大小参数分别改变彩带的颜色和厚度。
这里用到 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,如需要修改字体,可以通过 family
和size
参数来设置。
[1]教程: https://t-redactyl.io/blog/2016/12/a-very-ggplot2-christmas.html