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

如何在R Shiny中根据用户输入动态修改plot_ly饼图标签

动态Plotly饼图标签问题解决

问题描述

在Shiny应用中基于用户输入创建Plotly饼图,不添加labels参数时饼图可正常渲染,但尝试用labels=~input$cat设置动态标签时,饼图仅显示单一100%的块,无法正确显示各分类标签。

原因分析

~input$cat的写法有误:~符号用于直接引用数据框中的列名,但input$cat是字符串类型的变量名,并非分组后数据框的实际列名。分组后的数据框中,目标列的名称就是input$cat的取值(比如选择"col"时,列名是col),需要通过动态引用列的方式获取标签值。

解决方法

提供两种简单有效的实现方式:

方法1:使用.data代词动态引用列

直接在plot_ly的labels参数中,用.data[[input$cat]]来引用对应列:

fig2 <- plot_ly(fig, labels = ~.data[[input$cat]], values = ~n, type = 'pie')

方法2:重命名分组后的列

将分组后的列重命名为固定名称(比如category),之后直接引用该名称:

fig <- df %>%
  group_by(across(input$cat)) %>%
  summarise(n=n()) %>%
  rename(category = all_of(input$cat))

fig2 <- plot_ly(fig, labels = ~category, values = ~n, type = 'pie')

修改后的完整代码

library(shiny)
library(ggplot2)
library(dplyr)
library(plotly)

student_name <- c("Ally","Sam","Bailey","Aaron","Emily","Zack")
col <- c("Red","Red","Red","Green","Green","Blue")
subject <-c("math","math","science","art","art","music")

df <- data.frame(student_name, col, subject)

ui <- fluidPage(
    selectInput("cat", "Category", choices = c("student_name","col","subject"), selected = "col"),
    plotlyOutput("oppie")
)

server <- function(input, output, session) {

  output$oppie <- renderPlotly({
      
      # 按用户选择的分组统计
      fig <- df %>%
        group_by(across(input$cat)) %>%
        summarise(n=n())
      
      # 使用.data代词动态引用列作为标签
      fig2 <- plot_ly(fig, labels = ~.data[[input$cat]], values = ~n, type = 'pie')
      fig2
    })
}

shinyApp(ui, server)

效果说明

修改后,选择不同分类时,饼图会自动显示对应分类的标签,每个块的占比也会正确计算,实现预期的动态效果。

内容的提问来源于stack exchange,提问作者Kat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:05:41