2025-01-12 04:36:52 +08:00

82 lines
2.0 KiB
R

generate_random_walk <- function(num_steps = 90) {
start_date <- as.POSIXct(as.integer(Sys.time()) * runif(1), origin = "1970-01-01")
increments <- rnorm(num_steps)
cumulative_sum <- cumsum(increments)
time_series <- c(0, cumulative_sum) + rnorm(1, 0, 50) + 25
dates <- seq(start_date, length.out = num_steps + 1, by = "day")
data.frame(date = dates, value = time_series)
}
as_plotly_sparkline <- function(plot, color = "white") {
plot |>
layout(
xaxis = list(visible = FALSE, showgrid = FALSE, title = ""),
yaxis = list(visible = FALSE, showgrid = FALSE, title = ""),
hovermode = "x",
margin = list(t = 0, r = 0, l = 0, b = 0),
font = list(color = color),
paper_bgcolor = "transparent",
plot_bgcolor = "transparent"
) |>
config(displayModeBar = FALSE) |>
htmlwidgets::onRender(
"function(el) {
var ro = new ResizeObserver(function() {
var visible = el.offsetHeight > 200;
Plotly.relayout(el, {'xaxis.visible': visible});
});
ro.observe(el);
}"
)
}
random_plotly_plot <- function(type = NULL, color = "white") {
if (is.null(type)) {
type <- sample(c("bar", "box", "line"), 1)
}
plot <- switch(
type,
bar = random_plotly_bar(color, 50),
box = random_plotly_box(color, 50),
line = random_plotly_line(color, 50),
stop("Not a valid random plot type: ", type)
)
as_plotly_sparkline(plot, color)
}
random_plotly_bar <- function(color, n = 50) {
plot_ly(
x = ~ runif(n),
type = "histogram",
histnorm = "probability",
nbinsx = 10,
color = I(color),
stroke = I(color),
alpha_stroke = 1,
alpha = 0.6
)
}
random_plotly_box <- function(color, n = 50) {
plot_ly(x = ~rnorm(n), type = "box", color = I(color))
}
random_plotly_line <- function(color, n) {
add_lines(
plot_ly(generate_random_walk(n)),
x = ~ date,
y = ~ value,
color = I(color),
fill = "tozeroy",
span = I(1),
alpha = 0.2
)
}