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

目录
相关文章
|
数据可视化
绘制热图时看不出颜色差异?四种方式转换处理使结果显而“易”见
绘制热图时看不出颜色差异?四种方式转换处理使结果显而“易”见
21037 2
|
6月前
|
Linux 虚拟化 iOS开发
Debian 13 x86_64 OVF (sysin) - VMware 虚拟机模板
Debian 13 x86_64 OVF (sysin) - VMware 虚拟机模板
487 0
Debian 13 x86_64 OVF (sysin) - VMware 虚拟机模板
|
9月前
|
存储 数据可视化 Python
单细胞RNA速率分析: scVelo入门教程
单细胞RNA速率分析: scVelo入门教程
单细胞RNA速率分析: scVelo入门教程
|
数据可视化 数据挖掘 Go
GOplot|宝藏R包,拯救你的GO富集结果,杜绝平庸的条形图
`GOplot`是R中的一个宝藏包,用于GO富集分析的创新可视化。它提供多种图表类型,如GOBar、GOBubble、GOCircle、GOChord、GOHeat和GOCluster,以及GOVenn。通过调整参数,用户可自定义颜色、大小和排序。例如,GOBar和GOBubble展示富集条形和气泡,GOCircle以环形图表示,GOChord描绘基因和过程间关系,而GOHeat和GOCluster提供热图和聚类视图。此外,还有GOVenn用于绘制Venn图。包简化了数据准备和绘图过程,适合快速高效地展示复杂分析结果。别忘了引用创始人Walter等人的工作。
1766 1
|
存储 编解码 数据可视化
Visium HD空间数据分析、可视化以及整合 (1)
【8月更文挑战第1天】Visium HD空间数据分析、可视化以及整合 (1)
Visium HD空间数据分析、可视化以及整合 (1)
|
数据可视化 数据挖掘 Python
"揭秘Visium HD黑科技:空间数据分析大揭秘,可视化与整合的艺术之旅!"
【8月更文挑战第20天】近年来,空间转录组技术,特别是Visium HD技术,因其高分辨率与高通量特性,在单细胞生物学领域受到广泛关注。本文通过Python演示了Visium HD数据的全流程分析:从数据准备(读取表达矩阵和空间坐标)、空间数据分析(计算基因表达统计量)、数据可视化(绘制基因表达热图和空间点分布图),到多样本数据整合,为读者提供了实用的分析指南,助力深入探索空间转录组学的奥秘。
426 4
|
定位技术
Word论文引用参考文献时et al.与等的快速替换方法
Word论文引用参考文献时et al.与等的快速替换方法
720 2
|
Web App开发 网络协议 Unix
客户端请求的端口号是什么?
TCP 协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)。
客户端请求的端口号是什么?
|
机器学习/深度学习 数据采集 数据可视化
【Python 机器学习专栏】数据缺失值处理与插补方法
【4月更文挑战第30天】本文探讨了Python中处理数据缺失值的方法。缺失值影响数据分析和模型训练,可能导致模型偏差、准确性降低和干扰分析。检测缺失值可使用Pandas的`isnull()`和`notnull()`,或通过可视化。处理方法包括删除含缺失值的行/列及填充:固定值、均值/中位数、众数或最近邻。Scikit-learn提供了SimpleImputer和IterativeImputer类进行插补。选择方法要考虑数据特点、缺失值比例和模型需求。注意过度插补和验证评估。处理缺失值是提升数据质量和模型准确性关键步骤。
1421 0