2017-12-11 20 views
1

ggplot2plotlyを組み合わせたプロットを作成しようとしています。 2つの垂直線は純粋なggplot2上に表示されますが、一度plotly::ggplotlyと呼ぶと、それらは消えます。データをggplotlyバージョンにも表示させるにはどうすればよいですか? plot_lyだけを使用しているソリューションをお持ちの場合は、これも問題ありません。ggplotlyプロットに垂直線を追加

データ:プロットを作るために

df <- structure(list(date = structure(c(17226, 17257, 17287, 17318, 
17348, 17379, 17410, 17440, 17471, 17501, 17226, 17257, 17287, 
17318, 17348, 17379, 17410, 17440, 17471, 17501, 17226, 17257, 
17287, 17318, 17348, 17379, 17410, 17440, 17471, 17501), class = "Date"), 
    n = c(253L, 217L, 257L, 166L, 121L, 56L, 68L, 62L, 142L, 
    20L, 174L, 228L, 180L, 158L, 80L, 39L, 47L, 54L, 107L, 12L, 
    93L, 74L, 47L, 49L, 55L, 16L, 52L, 53L, 32L, 3L), act = c("a", 
    "a", "a", "a", "a", "a", "a", "a", "a", "a", "b", "b", "b", 
    "b", "b", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c", 
    "c", "c", "c", "c", "c")), class = "data.frame", row.names = c(NA, 
-30L), .Names = c("date", "n", "act")) 

facts_timeline <- structure(list(Date = structure(c(17507, 17293), class = "Date"), 
    ShortDescription = c("Marketing Campaign", "Relevant Fact 1" 
    )), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame" 
), spec = structure(list(cols = structure(list(Date = structure(list(
    format = ""), .Names = "format", class = c("collector_date", 
"collector")), Tenant = structure(list(), class = c("collector_character", 
"collector")), ShortDescription = structure(list(), class = c("collector_character", 
"collector")), LongDescription = structure(list(), class = c("collector_character", 
"collector"))), .Names = c("Date", "Tenant", "ShortDescription", 
"LongDescription")), default = structure(list(), class = c("collector_guess", 
"collector"))), .Names = c("cols", "default"), class = "col_spec"), .Names = c("Date", 
"ShortDescription")) 

コード:

ここ
p <- df %>% 
    ggplot(aes(date, n, group = act, color = act)) + 
    geom_line() + 
    geom_vline(data = facts_timeline, aes(xintercept = Date)) 

あなたは2本の垂直線を参照することができます

p 

しかし、ここにいない:

ggplotly(p) 

答えて

2

plotlyに垂直線をプロットする直接ことはできませんが、ここで私の回避策です:

vline_list <- list() 
for(i in 1:nrow(facts_timeline)){ 
    vline_list[[i]] <- 
    list(type  = "line", 
     fillcolor = line_color, 
     line  = list("black"), 
     opacity = 0.3, 
     x0  = facts_timeline$Date[i], 
     x1  = facts_timeline$Date[i], 
     xref  = "x", 
     y0  = 0, 
     y1  = max(df$n), 
     yref  = "y") 
} 

plot_ly(x = ~df$date, y = ~df$n,color = df$act, mode = 'lines') %>% 
    layout(shapes = vline_list) 

ループのために、我々はfacts_timeline内のすべての行を反復処理し、新しい行を作成して。 Tisラインは `ggplot 'のように無限長を持たない。私の例では、線はy軸の最大値です。これを独自のニーズに変更することができます。

1
plot_ly(df, 
     x = ~ date, 
     y = ~ n, 
     color = ~act, 
     text = ~act, 
     mode = "lines", 
     type = "scatter", 
     hoverinfo = "x+y+text") %>% 
    layout(hovermode = "closest", 
     xaxis=list(range=c("2017-03-01", "2018-01-01"))) %>% 
    add_lines(x=rep(facts_timeline[["Date"]][[1]], 2), 
     y=c(0, 300), 
     name=facts_timeline[["ShortDescription"]][[1]], 
     inherit=FALSE, 
     hoverinfo = "name", 
     line = list(color="#000000")) %>% 
    add_lines(x=rep(facts_timeline[["Date"]][[2]], 2), 
     y=c(0, 300), 
     name=facts_timeline[["ShortDescription"]][[1]], 
     inherit=FALSE, 
     hoverinfo = "name", 
     line = list(color="#000000")) 
関連する問題