在ggplot2

时间:2017-09-12 14:20:14

标签: r ggplot2

我想从ggplot2中的tis包中复制tisPlot的样式。我无法在ggplot2中创建限制左右y轴的线段。我附加了示例代码,显示了一个基本的tisPlot以及我在ggplot2中匹配该样式所做的工作。这里有没有人知道如何解决问题的最后一部分,即在y轴的顶部添加线段?谢谢。

library(tis)
library(tidyverse)
library(lubridate)

set.seed(5)

# make example time-series data
firstTis <- tis(cumsum(rnorm(120)), start = c(1996, 1), freq = 12)

tisPlot(firstTis)

# put example times-series data into a dataframe
df <- data_frame(
  date = firstTis %>% time() %>% date_decimal() %>% date(),  
  firstTis = firstTis %>% as.numeric()
  ) 

ggplot(df) +
  geom_line(aes(x = date, y = firstTis)) +
  theme_classic() + 
  theme(
    axis.ticks.length = unit(- 7, "pt"),                                               
    axis.text.x = element_text(margin = margin(t = 10, b = 0, unit = 
"pt")),
axis.text.y = element_text(margin = margin(r = 10, l = 0, unit = "pt"), 
color = "white"),     
axis.text.y.right = element_text(margin = margin(r = 0,  l = 10, unit = 
"pt"), color = "black")
) +   
scale_y_continuous(sec.axis = dup_axis(name = "")) +

1 个答案:

答案 0 :(得分:2)

更新了解决方案:

v3

您可以在coord_cartesian()中指定y轴限制,&amp;将y轴的乘法/加法展开常数设置为0.添加的段用于模拟顶部较长刻度的外观。可以使用基础包中的pretty()动态设置中断,如果默认设置返回太多/太少中断,则在n进行手动调整:

date.extension <- diff(range(df$date))*0.02
y.breaks <- pretty(df$firstTis, n = 4) # larger n will return more breaks
y.range <- range(y.breaks)

> date.extension
Time difference of 72.46 days
> y.breaks
[1] -10  -5   0   5  10
> y.range
[1] -10  10

简介:

p <- ggplot(df) +

  # add horizontal line segments aligned to y-axis upper limit
  annotate("segment", y = max(y.range), yend = max(y.range),
           x = min(df$date)-date.extension, 
           xend = min(df$date) + date.extension) +
  annotate("segment", y = max(y.range), yend = max(y.range),
           x = max(df$date)-date.extension, 
           xend = max(df$date) + date.extension) +

  geom_line(aes(x = date, y = firstTis)) +
  theme_classic() +
  theme(
    axis.ticks.length = unit(- 7, "pt"),
    axis.text.x = element_text(margin = margin(t = 10, b = 0, unit = "pt")),
    axis.text.y = element_text(margin = margin(r = 10, l = 0, unit = "pt"), color = "white"),     
    axis.text.y.right = element_text(margin = margin(r = 0,  l = 10, unit = "pt"), color = "black")
  ) +

  scale_x_date(expand = c(0, 0)) +
  scale_y_continuous(name = "", 
                     breaks = y.breaks,
                     expand = c(0, 0),             # no expansion beyond specified limits
                     sec.axis = dup_axis()) +
  coord_cartesian(xlim = c(min(df$date)-date.extension, 
                           max(df$date)+date.extension),
                  ylim = y.range)
p

(可选)防止顶部的线段被剪掉:

gt <- ggplotGrob(p)
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid::grid.draw(gt)

请注意,从min(df$date)&amp;成员的任意一个方向对线段进行编码,以延长总日期范围的2%(在此示例中为约72天)。 max(df$date)。因此,如果您的x轴范围发生剧烈变化(例如从20年到1年),它仍应有效。