将垂直线添加到 ggplotly 图
Add vertical line to ggplotly plot
我正在尝试构建一个结合 ggplot2
和 plotly
的情节。两条垂直线出现在纯 ggplot2 上,但一旦我在其上调用 plotly::ggplotly
,它们就会消失。如何让数据也出现在 ggplotly
版本上?如果您有仅使用 plot_ly
的解决方案,那也很好。
数据:
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))
在这里你可以看到两条竖线:
p
但这里没有:
ggplotly(p)
无法直接在 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)
我们使用 for 循环遍历 facts_timeline
中的所有行并创建一个新行。这条线没有 ggplot 中的无穷长。在我的示例中,该线是 y 轴的最大值。您可以根据自己的需要进行更改。
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"))
只需将 xintercept
设置为数字,一切都会起作用。
p <- df %>%
ggplot(aes(date, n, group = act, color = act)) +
geom_line() +
geom_vline(data = facts_timeline, aes(xintercept = as.numeric(Date)))
p
ggplotly(p)
我正在尝试构建一个结合 ggplot2
和 plotly
的情节。两条垂直线出现在纯 ggplot2 上,但一旦我在其上调用 plotly::ggplotly
,它们就会消失。如何让数据也出现在 ggplotly
版本上?如果您有仅使用 plot_ly
的解决方案,那也很好。
数据:
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))
在这里你可以看到两条竖线:
p
但这里没有:
ggplotly(p)
无法直接在 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)
我们使用 for 循环遍历 facts_timeline
中的所有行并创建一个新行。这条线没有 ggplot 中的无穷长。在我的示例中,该线是 y 轴的最大值。您可以根据自己的需要进行更改。
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"))
只需将 xintercept
设置为数字,一切都会起作用。
p <- df %>%
ggplot(aes(date, n, group = act, color = act)) +
geom_line() +
geom_vline(data = facts_timeline, aes(xintercept = as.numeric(Date)))
p
ggplotly(p)