前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R 可视乎 | 绘制卡通圣诞树

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

作者头像
庄闪闪
发布2021-12-28 08:38:21
6530
发布2021-12-28 08:38:21
举报
文章被收录于专栏:庄闪闪的R语言手册

简介

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

画图步骤

Step 1:绘制一颗基础的树

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

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

代码语言:javascript
复制
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 = "")去掉坐标轴。

Step 2:添加灯饰

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

代码语言:javascript
复制
##创建灯饰
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

Step 3:添加装饰物

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

代码语言:javascript
复制
##创建装饰物
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

Step 4:装饰礼物

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

代码语言:javascript
复制
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坐标的相同值,而对于垂直线,则设置了相反的值。还可以使用颜色和大小参数分别改变彩带的颜色和厚度。

Step 5:添加祝福语

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

代码语言:javascript
复制
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 参数来设置。

参考资料

[1]教程: https://t-redactyl.io/blog/2016/12/a-very-ggplot2-christmas.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 庄闪闪的R语言手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 画图步骤
    • Step 1:绘制一颗基础的树
      • Step 2:添加灯饰
        • Step 3:添加装饰物
          • Step 4:装饰礼物
            • Step 5:添加祝福语
              • 参考资料
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档