Я пытаюсь создать тепловую карту с помощью ggplot и Shiny в R, но график не отображается так, как я ожидал. Я использую данные, которые имеют другую структуру, чем образцы Shiny-RStudio, и, возможно, поэтому у меня не было хорошего результата.

Моя таблица данных содержит 152013 строк и 7 переменных (зона, сезон, неделя, рыболовный флот, длина, категория, vul1.indicator). Я хочу создать тепловую карту переменной vul1.indicator с x = неделя и y = зона, и пользователь блестящего приложения может выбрать категорию и время года. Моя проблема в том, что когда я меняю варианты «сезон» и «категория» на боковой панели, изменяется только легенда, но не сюжет. Похоже, что нет никакой связи между сюжетом и выбором. Не знаю, где я ошибся. Не могли бы вы мне помочь?

Это пример моей таблицы (у меня есть 10 вариантов для «категории» и 3 варианта для «сезона»:

> Vul1MoyZoneAgr
    zone    season week fishingfleet length category vul1.indicator
1     Z1 2012-2013    1          CAD     T1   CAD-T1              1
2     Z1 2012-2013    2          CAD     T1   CAD-T1              1
3     Z1 2012-2013    3          CAD     T1   CAD-T1              1
4     Z1 2012-2013    4          CAD     T1   CAD-T1              1
5     Z1 2012-2013    5          CAD     T1   CAD-T1              1
6     Z1 2012-2013    6          CAD     T1   CAD-T1              1
7     Z1 2012-2013    7          CAD     T1   CAD-T1              1
8     Z1 2012-2013   46          CAD     T1   CAD-T1              1
9     Z1 2012-2013   47          CAD     T1   CAD-T1              1
10    Z1 2012-2013   48          CAD     T1   CAD-T1              1
11    Z1 2012-2013   49          CAD     T1   CAD-T1              1
12    Z1 2012-2013   50          CAD     T1   CAD-T1              1
13    Z1 2012-2013   51          CAD     T1   CAD-T1              1
14    Z1 2012-2013   52          CAD     T1   CAD-T1              1

А это мой код:

library(ggplot2)
Vul1MoyZoneAgr <- read.table("C:/Users/user/Documents/Vul1MoyZoneAgr.txt", sep="\t",quote="", dec=",", header = TRUE)
Vul1MoyZoneAgr$zone <- factor(Vul1MoyZoneAgr$zone, levels = c("Z1", "Z2", "Z3", "Z4", "Z5", "Z6", "Z7", "Z8", "Z9", "Z10", "Z11", "Z12", "Z13", "Z14", "Z15", "ZI", "ZJ"))
Vul1MoyZoneAgr$week <- factor(Vul1MoyZoneAgr$week, levels = c("40","41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"))
# Define UI ----
ui <- fluidPage(
    
    
    titlePanel("Vulnerability indicator"),
    
    
    sidebarLayout(
        
        sidebarPanel(
            
            selectInput("category", "category:", 
                        choices = c(unique(Vul1MoyZoneAgr$category))),
            selectInput("season", "season:",
                        choices = c(unique(Vul1MoyZoneAgr$season))),
            
            
        ),
        
        mainPanel(
            
            # Output: Formatted text for caption ----
            h3(textOutput("caption")),
            
            # Output ----
            
                plotOutput("vul1.indicatorPlot")

            
        )
    )
)

# Define server logic ----
server <- function(input, output) {

    # Compute the formula text ----
    # This is in a reactive expression since it is shared by the
    # output$caption and output$vul1.indicatorPlot functions
    formulaText <- reactive({
        paste("vulnerability indicator ~", input$category, "~", input$season)
})
    # Return the formula text for printing as a caption ----
    output$caption <- renderText({
        formulaText()
    })
    
    # Reactive expression for the data subsetted to what the user selected
    
    
   
    # Generate a plot of the requested season and category ----

    output$vul1.indicatorPlot <- renderPlot({
        ggplot(as.formula(formulaText()),
            data = Vul1MoyZoneAgr, mapping = aes(x=week, y=zone, fill=vul1.indicator)) + theme_bw() +
            geom_tile(aes(fill = vul1.indicator), colour = "white") + scale_fill_gradient(low = "#F2E8EC", high = "#990000", limits=c(0, 7), breaks=seq(0,7,by=1)) +
            labs(fill = "Vul. Ind.") +
            theme(strip.background = element_rect(colour="black", fill="white"), axis.text.x = element_text(face= "bold", size = 10), axis.text.y = element_text(face= "bold",size = 10), axis.title.x = element_text(face= "bold",size = 12), axis.title.y = element_text(face= "bold",size = 12), strip.text.y = element_text(face= "bold",size = 10),strip.text.x = element_text(face= "bold",size = 12), legend.text = element_text(face= "bold",size = 12), legend.title = element_text(face= "bold",size = 12), legend.key.size = unit(1.5, "cm"), legend.key.width = unit(0.5,"cm"), panel.grid.major=element_line(colour = "white"))
        })
    
}


shinyApp(ui, server)

Спасибо!

0
Sora 5 Мар 2021 в 16:38

2 ответа

Лучший ответ

Короткий ответ: вы не используете какое-либо реактивное значение при создании графика, т.е. когда вы меняете свой выбор, это не меняет способ расчета графика. Я имею в виду, что у вас уже есть закомментированный раздел вашего кода, который не содержит сведений о том, куда это будет идти.

Вам нужно что-то вроде набора данных, который обновляется при изменении одного из селекторов:

displayData <- reactive( <code to subset data> )

Затем используйте это при создании своего сюжета

ggplot(data = displayData()...
0
Marcus 5 Мар 2021 в 19:21

Спасибо, Маркус! Теперь это работает.

Я использовал этот код:

# Reactive expression for the data subsetted to what the user selected
    filteredData <- reactive({
        req(input$category, input$season)
        filter(Vul1MoyZoneAgr, category == input$category, season == input$season)
    
    })

Затем:

ggplot(data = filteredData(), ...
0
Sora 8 Мар 2021 в 15:30