You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:35:31