R-ggplot2-绘图时x轴一种是numeric,一种是date?分面时老报错?怎么搞??

目录

  • 0.问题导入
  • 1.示例数据
  • 2.导入数据
  • 3.解决R起初报错(图1)
  • 4.设置日期及x轴breaks的位置与标注
  • 5.将右侧两列子图x轴时间转化为年份(图2)
  • 6.自定义各子图轴名(图3)
  • 7.总结
  • 8.本文所用软件包(没有需要通过install.packages('')进行安装)
  • 9.致谢

0. 问题导入

日常绘图中,我们可能想着把相关性分析图与两种指标的时间演进图通过facet_wrap绘制到一块。然后,R就开始报错了(如下...R的内心OS其实是:x轴你到底是想要字符类型还是日期类型啊?搞么子啊?要上天吗?)不不不,我只是不想后期进AI。那么应该怎么办呢?今天这篇给出解决方案~

Error in as.Date.numeric(value) : 'origin'一定得给值

1. 示例数据(点击下载示例数据)

相关性分析所需数据
时间序列数据

2. 导入数据

setwd('L:\\JianShu\\20191223')
pl_df_cor = read.csv('pl_df_cor.csv',header = T)
pl_df_line = read.csv('pl_df_line.csv',header = T)

pl_df_cor = pl_df_cor[,-1]
pl_df_line = pl_df_line[,-1]
pl_df_cor = as.data.frame(pl_df_cor)
pl_df_line = as.data.frame(pl_df_line)

pl_df_line$Date = as.Date(pl_df_line$Date)

3. 解决R起初报错(图1)

R起初报错的原因呢就是在于左侧两列与右侧两列x轴的label类型不同。我们在第一步通过将Date 转换为 as.numeric(Date),即numeric类型后,x轴的label类型得以统一,故Bug排除,R不再报错。

但是,图1 是不是看着很别扭。。。好好的时间怎么变成了11800,这是什么鬼?

还有就是,各个子图的横轴,纵轴并都是分别表示的Index与日期,而图1 中只是给出了图统一的横/纵轴名称,这样显然是不妥的!

那么如何解决呢?本篇第4-6节逐一解答

p1 = ggplot()+
  geom_point(data = pl_df_cor,
             aes(x = IndexA, y = value),shape = 1, color = 'blue')+
  geom_line(data = pl_df_line,
            aes(x = as.numeric(Date), y = value, color = variable),size = 1)+
  #scale_x_continuous(breaks = c(seq(-1,1,0.25),as.numeric(date)[date_breaks]),
  #                   labels = c(as.character(seq(-1,1,0.25)),date_labels[date_breaks]))+
  scale_color_manual(values = c('blue','green'))+
  theme_bw()+
  theme(
    axis.text = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    axis.title = element_text(face = 'bold',color = 'black',size = 14,hjust = 0.5),
    legend.text = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    legend.title = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    legend.position = 'bottom',
    legend.direction = 'horizontal',
    strip.background = element_blank(),
    strip.placement = 'outside',
    strip.text = element_blank()
  )+
  ylab("Index")+
  xlab("Date")+
  facet_wrap(~type,scales = 'free',nrow = 2)


png('plot1.png',
    height = 20,
    width = 20,
    units = 'cm',
    res = 800)
print(p1)
dev.off()
图1 解决报错后的初始图

4. 设置日期及x轴breaks的位置与标注

date = seq(as.Date('2002-01-01'),as.Date('2003-12-01'),'1 month')
date_breaks = c(seq(1,24,10))
date_labels = as.character(date)

5. 将右侧两列子图x轴时间转化为年份(图2)

p2 = ggplot()+
  geom_point(data = pl_df_cor,
             aes(x = IndexA, y = value),shape = 1, color = 'blue')+
  geom_line(data = pl_df_line,
            aes(x = as.numeric(Date), y = value, color = variable),size = 1)+
  scale_x_continuous(breaks = c(seq(-1,1,0.25),as.numeric(date)[date_breaks]),
                     labels = c(as.character(seq(-1,1,0.25)),date_labels[date_breaks]))+
  scale_color_manual(values = c('blue','green'))+
  theme_bw()+
  theme(
    axis.text = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    axis.title = element_text(face = 'bold',color = 'black',size = 14,hjust = 0.5),
    legend.text = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    legend.title = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    legend.position = 'bottom',
    legend.direction = 'horizontal',
    strip.background = element_blank(),
    strip.placement = 'outside',
    strip.text = element_blank()
  )+
  ylab("Index")+
  xlab("Date")+
  facet_wrap(~type,scales = 'free',nrow = 2)


png('plot2.png',
    height = 20,
    width = 20,
    units = 'cm',
    res = 800)
print(p2)
dev.off()
图2 将右侧两列子图x轴时间转化为年份

6. 自定义各子图轴名(图3)

p3 = ggplot()+
  geom_point(data = pl_df_cor,
             aes(x = IndexA, y = value),shape = 1, color = 'blue')+
  geom_line(data = pl_df_line,
            aes(x = as.numeric(Date), y = value, color = variable),size = 1)+
  scale_x_continuous(breaks = c(seq(-1,1,0.25),as.numeric(date)[date_breaks]),
                     labels = c(as.character(seq(-1,1,0.25)),date_labels[date_breaks]))+
  scale_color_manual(values = c('blue','green'))+
  theme_bw()+
  theme(
    axis.text = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    axis.title = element_text(face = 'bold',color = 'black',size = 14,hjust = 0.5),
    legend.text = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    legend.title = element_text(face = 'bold',color = 'black',size = 12,hjust = 0.5),
    legend.position = 'bottom',
    legend.direction = 'horizontal',
    strip.background = element_blank(),
    strip.placement = 'outside',
    strip.text = element_text(face = 'bold',color = 'black',size = 14,hjust = 0.5)
  )+
  ylab('')+
  xlab('IndexA                                                                      Date')+
  facet_wrap(~type,scales = 'free',nrow = 2,
             strip.position = 'left',
             labeller = as_labeller(
               c("1"="IndexB", "2" = "Indices", "3" = "IndexB", "4"= "Indices")))

png('plot3.png',
    height = 20,
    width = 20,
    units = 'cm',
    res = 800)
print(p3)
dev.off()

图3 自定义各子图轴名

7. 总结

本篇主要解决了以下3个问题:
1. 如何将具有不同类型x/y轴名的子图通过geom_facet 绘制在一起?如连续数字与时间?
2. 如何将转化为numeric类型后的日期以正确形式表示?
3. 如何自定义各子图x/y轴轴名?

8. 本文所用软件包(没有需要通过install.packages('')进行安装)

library('ggplot2')

9. 致谢

首先,感谢大家的持续关注,小编会继续努力,持续更新下去的!

大家如果觉得有用,还麻烦大家转发点赞加关注哈,也可以扩散到朋友圈,多谢大家啦~

大家如果在使用本文代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~


小编联系方式

你可能感兴趣的:(R-ggplot2-绘图时x轴一种是numeric,一种是date?分面时老报错?怎么搞??)