私人定制日历代码改进
简介
2021年即将到来,小编学习了calendR这个包,并写了两篇推送。分别为:
并开源了自己的代码在github上,但是细心的读者发现代码还存在可以优化的地方。
这里十分感谢楚新元师兄,对我给出的代码进行了优化,并分享了修改后的代码和私人日历。
以下给出优化的几个方面:
1.导出图片中文文字问题
大家知道Rstudio导出带中文图会出现乱码的形式(或者说是省略号的情况),如下所示:
对于下这个问题,我在前段时间转载过R语言统计与绘图公众号的一篇推文中有介绍过:加载Windows系统字体到图上,解决PDF导出字体无法显示的问题。这里我们采用的是其中的一种方法:使用showtext
包,将中文字体(楷书kaishu等)进行导入,并在calendR()
中加入font.family = "kaishu"
。这样最后导出的结果就不会存在乱码的情况。结果如下:
2.输出pdf文件名重复
原来代码重复运行时,pdf输出会存在报错情况,如下所示:
当时为了方便直接改文件名了。现在对代码进行优化,在输出日历前加入以下代码来判断文件是否存在,如果存在先删除。这样就不会存在文件名重复的情况,如果你想保留原来的文件,可以自己写代码把这段代码换了。
if (file.exists("My_calendar2021.pdf") == T) {
file.remove("My_calendar2021.pdf")
}
完整代码优化
对calendR()
函数内部的各个参数调节给出了细致的中文解释,这样读者可以进行轻松的修改。生成年度日历图优化后代码如下:
library(calendR)
library(showtext)
setwd("C:\\Users\\ZLL\\Desktop\\wechat\\庄闪闪原创\\R\\R可视乎\\2020.11.13日历\\wechat\\calendar\\读者(楚新元)")
font_add("kaishu", "simkai.ttf")
showtext_auto()
# 判断文件是否存在,如果存在先删除
if (file.exists("calendar2021.pdf") == T) {
file.remove("calendar2021.pdf")
}
calendR(
# 定义标题
# title, # 如果缺失,则以年或年月替代
year = 2021,
title.size = 40,
title.col = "white", # 年份字体颜色
# 定义副标题
subtitle = "每天好心情",
subtitle.size = 10,
subtitle.col = "gray30",
# 定义月份
mbg.col = "#274652", # 月份背景颜色
months.col = "white", # 月份字体颜色
months.size = 10, # 定义月份字体大小
months.pos = 0.5, # 定义月份水平居中
# 定义周
weeknames = c(
"Mo", "Tu", "We", "Th", "Fr",
"Sa", "Su"
), # 定义周名称
weeknames.col = "white", # 周字体颜色
weeknames.size = 4.5, # 定义周字体大小
start = "M", # 设置从周一开始
# 定义日期
days.col = "gray30", # 定义日期的颜色
day.size = 3, # 定义日期的字体大小
special.days = "weekend", # 定义周末为特殊日期
special.col = "lightblue", # 特殊日期背景颜色
low.col = "white", # 非特殊日期背景颜色
lty = 0, # 去掉边框线
col = "white",
# 定义背景、放置方向、生成文件
font.family = "kaishu", # 设置字体
orientation = "landscape", # 垂直放置
papersize = "A4", # 设置纸张大小
bg.img = "./img.jpg", # 设置背景图片
pdf = TRUE, # 生成pdf文件
doc_name = "calendar2021" # 给pdf文件命名
)
showtext_auto(FALSE)
3.小编有话说
最近有个想法把这个“无用”的例子做成一个shiny界面,用户只需点击调节参数即可,不需要写代码,并且最终可以导出pdf版本,该结果已经完成,这里先给出动画结果。
当然该版本还是非常差的,还需要进一步优化,例如:
参数设置选项太少,只有年度日历。以后需要加入更多参数选项,颜色自定义版本;
可以考虑加个按钮,一键导出pdf或者图片;
添加节假日和重要日期信息,自动化加入定制日历中;
部署到网页上,重要日期自动发邮件提醒,可以使用travis;
小编争取在年底开源项目(有机会的话部署到网页上)。期间会实时给出项目进展情况,也欢迎各位大佬们给出建设性建议。我的联系方式可通过公众号菜单的[资源分享]中找到。