2017-09-12 4 views
1

gisplot2のtisパッケージからtisPlotのスタイルを複製したいとします。私は、ggplot2の左右の両方のy軸をキャッピングする線分を作成するのに問題があります。私はggplot2でそのスタイルにマッチさせるために基本的なtisPlotを表示するサンプルコードを添付しました。だれかがこの問題の最後の部分を解決する方法を知っていますか?つまり、y軸の上端に線分を追加しますか?ありがとう。ggplot2でtisPlotのスタイルを複製する

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 = "")) + 

答えて

2

更新溶液:

v3

あなたはcoord_cartesian()のy軸の範囲を指定することができ、& 0はセグメントにy軸のための添加剤/乗法膨張定数を設定シミュレートするために添加上部に長いティックが現れる。

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 

(オプション)を防止ラインのデフォルト設定は、あまりにも多くの/少なすぎる休憩を返す場合ブレークはnで手動調整して、基本パッケージからpretty()を使用して動的に設定することができます切り取られてから上部のセグメント:ラインセグメントが総日付範囲の2%を拡張するために符号化されること

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

注THIに(〜72日例えば、いずれかの方向に、min(df$date) & max(df$date)からです。したがって、x軸の範囲が大幅に変更された場合(20年から1年など)、それでも機能するはずです。

+0

あなたのソリューションに感謝しますが、私は目立つものとは違って長くなるものを探しています。 – Niko

+0

@Nikoは私のソリューションを更新しました –

+0

これは本当に素晴らしいです、ありがとう。私が気づく一つのことは、上の注釈付き線が目盛りと軸線より細く見えるということです。注釈付き行の全幅が切り取られていますか? – Niko

関連する問題