首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >私人定制日历代码改进

私人定制日历代码改进

作者头像
庄闪闪
发布2021-04-09 11:09:11
9850
发布2021-04-09 11:09:11
举报

简介

2021年即将到来,小编学习了calendR这个包,并写了两篇推送。分别为:

R可视乎|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版本,该结果已经完成,这里先给出动画结果。

当然该版本还是非常差的,还需要进一步优化,例如:

  1. 参数设置选项太少,只有年度日历。以后需要加入更多参数选项,颜色自定义版本;
  2. 可以考虑加个按钮,一键导出pdf或者图片;
  3. 添加节假日和重要日期信息,自动化加入定制日历中;
  4. 部署到网页上,重要日期自动发邮件提醒,可以使用travis;

小编争取在年底开源项目(有机会的话部署到网页上)。期间会实时给出项目进展情况,也欢迎各位大佬们给出建设性建议。我的联系方式可通过公众号菜单的[资源分享]中找到。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 1.导出图片中文文字问题
  • 2.输出pdf文件名重复
  • 完整代码优化
  • 3.小编有话说
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档