DulieuKhihauToancau / utils /render_time_series_plot.R
alexdum's picture
improve title
0fd0bb5
render_time_series_plot <- function(data, station_id, month) {
# Check if station_id exists in tavg_meta
if (!station_id %in% tavg_meta$ID) {
stop("Station ID not found in metadata.")
}
# Fit a linear model to calculate the slope
linear_model <- lm(VALUE ~ YEAR, data = data)
slope <- coef(linear_model)["YEAR"]
# Create the title with slope
title_text <- paste(
month, min(data$YEAR), max(data$YEAR), "-", tavg_meta$NAME[tavg_meta$ID == station_id], station_id
)
# Main plot
plot <- plot_ly(data, x = ~YEAR, y = ~VALUE, type = 'scatter', mode = 'lines',
name = 'TAVG', # Set neutral color for points
line = list(color = 'red')) %>% # Set neutral color for the line
layout(
title = list(
text = title_text,
x = 0,
y = 0.99,
xanchor = 'left',
font = list(size = 12)
),
xaxis = list(
zeroline = FALSE,
gridcolor = 'lightgray',
title = "",
fixedrange = TRUE
),
yaxis = list(
title = list(text = paste(month, '(°C)'), font = list(size = 10)),
zeroline = FALSE,
gridcolor = 'lightgray',
fixedrange = TRUE
),
showlegend = FALSE,
plot_bgcolor = 'rgba(255, 255, 255, 0)',
paper_bgcolor = 'rgba(255, 255, 255, 0)',
margin = list(l = 20, r = 5, t = 20, b = 3), # Increase bottom margin to accommodate text
shapes = list(
list(
type = 'rect',
x0 = 0, x1 = 1, y0 = 0, y1 = 1,
xref = 'paper', yref = 'paper',
fillcolor = 'rgba(255, 255, 255, 0)',
line = list(width = 0)
)
),
hovermode = 'x unified',
hoverlabel = list(
bgcolor = 'white',
bordercolor = 'rgba(255, 255, 255, 0)'
),
annotations = list(
list(
x = 0.5, # Center the text horizontally
y = -0.12, # Position it further below the plot
xref = 'paper',
yref = 'paper',
showarrow = FALSE,
text = paste("Slope:", round(slope, 3), "°C/year | Mean: ", round(mean(data$VALUE), 1), "°C"),
xanchor = 'center',
yanchor = 'top',
font = list(size = 11, color = 'black')
)
)
) %>%
add_trace(
x = ~YEAR,
y = fitted(linear_model),
mode = 'lines',
name = 'Linear Trend',
line = list(color = 'gray'),
hoverinfo = 'x+y' # Display only x and y without custom text
)
# Configure the mode bar to show only the download button
plot <- plot %>%
config(
modeBarButtonsToRemove = list(
'zoom2d', 'pan2d', 'select2d', 'lasso2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d', 'resetScale2d'
),
displaylogo = FALSE,
toImageButtonOptions = list(
format = 'png', # Choose your desired format (png, jpeg, svg, webp)
filename = paste0(station_id, "_", month, "_time_series")
)
)
return(plot)
}