在Shiny散点图的回归线上添加斜率方程与R²值的实现方法
给Shiny交互式热图的散点图添加回归方程和R²值
作为Shiny新手,想给点击热图后生成的散点图加上回归斜率方程和R²值其实不难,核心就是先拟合线性模型提取关键参数,再把这些参数格式成文本添加到图里。我把修改后的完整代码给你,再拆解下关键步骤:
完整修改后的代码
library(plotly) library(shiny) # 计算相关矩阵 correlation <- round(cor(mtcars), 3) nms <- names(mtcars) ui <- fluidPage( mainPanel( plotlyOutput("heat"), plotlyOutput("scatter") # 补充散点图的输出控件 ) ) server <- function(input, output) { # 生成交互式相关热图 output$heat <- renderPlotly({ plot_ly(x = nms, y = nms, z = correlation, type = "heatmap", hoverinfo = "text", text = paste0("X: ", nms, "\nY: ", rep(nms, each = length(nms)), "\nCorrelation: ", correlation)) %>% layout(xaxis = list(title = ""), yaxis = list(title = "")) }) # 监听热图点击事件,生成带回归线、方程和R²的散点图 output$scatter <- renderPlotly({ # 获取点击的热图点信息 event_data <- event_data("plotly_click", source = "heat") if (is.null(event_data)) { # 初始状态没有点击时,显示提示文本 return(plot_ly() %>% layout(title = "点击热图中的方块查看对应散点图")) } # 提取点击对应的x和y变量名 x_var <- event_data$x y_var <- event_data$y # 拟合线性回归模型 model <- lm(mtcars[[y_var]] ~ mtcars[[x_var]]) coeffs <- coef(model) intercept <- coeffs[1] slope <- coeffs[2] r_squared <- summary(model)$r.squared # 格式化回归方程和R²文本 eq_text <- paste0("y = ", round(slope, 2), "x + ", round(intercept, 2), "\nR² = ", round(r_squared, 3)) # 生成散点图+回归线+注释文本 plot_ly(mtcars, x = ~get(x_var), y = ~get(y_var), type = "scatter", mode = "markers", name = "数据点") %>% add_lines(x = ~get(x_var), y = ~fitted(model), name = "回归线", line = list(color = "red")) %>% add_annotations( x = min(mtcars[[x_var]]), # 文本放在x轴最小值附近 y = max(mtcars[[y_var]]), # y轴最大值附近,也就是左上角 text = eq_text, showarrow = FALSE, font = list(size = 12) ) %>% layout(title = paste(y_var, "vs", x_var), xaxis = list(title = x_var), yaxis = list(title = y_var)) }) } shinyApp(ui, server)
关键步骤说明
- 提取点击变量:用
event_data("plotly_click")获取热图点击的位置,拿到对应的x和y变量名,这样就能确定要绘制哪两个变量的散点图。 - 拟合回归模型:用
lm()拟合线性模型,从模型结果里提取截距、斜率,再通过summary(model)$r.squared获取R²值。 - 添加注释文本:把提取到的参数格式成易读的文本,用
add_annotations()把文本放在散点图的左上角(你也可以调整x和y的数值来改变文本的摆放位置)。 - 初始状态提示:当还未点击热图时,散点图区域会显示提示文本,引导用户进行操作。
这样修改后,你点击热图里的任意方块,就能看到对应两个变量的散点图、回归线,还有标注好的回归方程和R²值啦~
内容的提问来源于stack exchange,提问作者J.Con
相关产品推荐
相关产品推荐

