2017-12-22 56 views
1

私はここでユーザーとしては新しいですが、Rstudioで輝くデータビジュアライゼーションアプリケーションを作成しようとしているときに遭遇した問題を狂ったように検索しました。ggplot2のズームを使用したときのトラブル

問題は、.csvを読み込み、その列を理解し、xとy軸として表示する列を選択し、選択したグラフの種類をプロットして、私が望むたびにセカンダリプロット

私はほとんどそこにいますが、私がやろうとしたブラシのズームは正しく機能していないということです。軸の値が正しく分かりません。代わりに、両方の軸が0から1までしかない場合と同じように動作し、正しい方法でズームされますが、xlimとylimが間違っています。

library(shiny) 
library(ggplot2) 

base = read.csv("TESTE.csv", sep = ";") 
tipos <- c("Dispersão", "Histograma", "Boxplot", "Área") 

shinyUI(fluidPage(


    titlePanel("MGM"), 


    sidebarLayout(
    sidebarPanel(
     selectInput("selectedColX", "Select colum for X axis", choices = colnames(base), selected = colnames(base)[7]), 
     selectInput("selectedColY", "Select colum for Y axis", choices = colnames(base), selected = colnames(base)[4]), 
     selectInput("selectedColor", "Select colum for colour axis", choices = colnames(base), selected = colnames(base)[6]), 
     selectInput("seletedGraph", "Select type of graph", choices = tipos, selected = tipos[1]) 
    ), 


    fluidRow(

     column(width = 12, class = "well", 
      h4("Left plot controls right plot"), 
      fluidRow(
       column(width = 10, 
         plotOutput("Disp", height = 300, 
           brush = brushOpts(
            id = "Disp_brush", 
            clip = TRUE, 
            resetOnNew = TRUE 
           ) 
        ) 
       ), 
       column(width = 10, 
         plotOutput("DispZoom", height = 300) 
       ) 
      ) 
    ) 

    ) 

# mainPanel(
#  
#  plotOutput("Hist"), 
#  plotOutput("Box"), 
#  plotOutput("Ar") 
# ) 
) 
)) 

そして、私のServer.R:

library(shiny) 
library(ggplot2) 

base = read.csv("TESTE.csv", sep = ";") 
tipos <- c("Dispersão", "Histograma", "Boxplot", "Área") 

shinyServer(function(input, output) { 

    output$Disp <- renderPlot({ 

    validate(need(input$seletedGraph=="Dispersão", message=FALSE)) 

    y_axis <- input$selectedColY 
    x_axis <- input$selectedColX 
    color_axis <- input$selectedColor 

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis)) 
    gg <- gg + geom_point() 

    plot(gg) 

    }) 

    ranges2 <- reactiveValues(x = NULL, y = NULL) 

    output$DispZoom <- renderPlot({ 

    validate(need(input$seletedGraph=="Dispersão", message=FALSE)) 

    y_axis <- input$selectedColY 
    x_axis <- input$selectedColX 
    color_axis <- input$selectedColor 

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis)) + geom_point() + coord_cartesian(xlim = ranges2$x, ylim = ranges2$y) 
    plot(gg) 

    }) 

    output$Hist <- renderPlot({ 

    validate(need(input$seletedGraph=="Histograma", message=FALSE)) 

    y_axis <- input$selectedColY 
    x_axis <- input$selectedColX 
    color_axis <- input$selectedColor 

    gg <- ggplot(base, aes_string(x = x_axis)) 
    gg <- gg + geom_histogram() 
    gg 

    }) 

    output$Box <- renderPlot({ 

    validate(need(input$seletedGraph=="Boxplot", message=FALSE)) 

    y_axis <- input$selectedColY 
    x_axis <- input$selectedColX 
    color_axis <- input$selectedColor 

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis)) 
    gg <- gg + geom_boxplot() 
    gg 

    }) 

    output$Ar <- renderPlot({ 

    validate(need(input$seletedGraph=="Área", message=FALSE)) 

    y_axis <- input$selectedColY 
    x_axis <- input$selectedColX 
    color_axis <- input$selectedColor 

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis)) 
    gg <- gg + geom_area() 
    gg 

    }) 

    observe({ 
    brush <- input$Disp_brush 
    if (!is.null(brush)) { 
     ranges2$x <- c(brush$xmin, brush$xmax) 
     ranges2$y <- c(brush$ymin, brush$ymax) 

    } else { 
     ranges2$x <- NULL 
     ranges2$y <- NULL 
    } 
    }) 

}) 

ちょうどgeom_pointていない他のプロットを無視

は、ここに私のui.Rです。私がこれを稼働させるとすぐに他の人がうまくいくはずです...

ありがとう、私はこれを理解しようとするような苦痛を持っています! 一部のテキストはポルトガル語で書かれていますが、私はすべてが理解できると思います。

答えて

0

brushOptsprintまたはplotという変数が返されるのではなく、ブラシ付き点のサイズが0から1になります。

1.ショートdesmonstration

この短いアプリは、それが返ってきたかに応じてブラシ点のスケールの違いを示しました。

library(shiny) 


ui <- fluidPage(

    fluidRow(
    column(6, 
     # My plot rendering with print or plot 
     h4("Plot with print or plot variable"), 
     plotOutput("plot1", height = 300, brush = brushOpts(id = "plot1_brush", clip = TRUE, resetOnNew = TRUE)), 
     p(), 
     # Brushed points 
     "Brushed points informations, scale from 0 to 1", 
     verbatimTextOutput("brush1") 
    ), 
    column(6, 
     # My plot rendering without print or plot 
     h4("Plot with a return variable"), 
     plotOutput("plot2", height = 300, brush = brushOpts(id = "plot2_brush", clip = TRUE, resetOnNew = TRUE)), 
     p(), 
     # Brushed points 
     "Brushed points informations, scale according to x and y variables", 
     verbatimTextOutput("brush2") 
    ) 
) 
) 


server <- function(input, output) { 

    data <- iris 

    # Plot1 I render with print or plot 
    output$plot1 <- renderPlot({ 
    gg <- ggplot(data, aes(x = Sepal.Length, y = Petal.Length, color = Species)) + geom_point() 
    plot(gg) 
    }) 

    # Brush points from plot1 
    output$brush1 <- renderPrint({ 
    input$plot1_brush 
    }) 

    # Plot2 I render just returning the variable 
    output$plot2 <- renderPlot({ 
    gg <- ggplot(data, aes(x = Sepal.Length, y = Petal.Length, color = Species)) + geom_point() 
    return(gg) 
    }) 

    # Brush points from plot2 
    output$brush2 <- renderPrint({ 
    input$plot2_brush 
    }) 
} 


shinyApp(ui = ui, server = server) 

2.あなたの質問

からReproductible例私はirisデータセットを使用してreproductible例を作っHerebelow。
また、アクセントのために一部の文字を変更しました。

ui.R

library(shiny) 
library(ggplot2) 

shinyUI(fluidPage(


    titlePanel("MGM"), 


    sidebarLayout(
    sidebarPanel(
     uiOutput("plots_parameters") 
    ), 

    mainPanel(
     fluidRow(
     column(12, 
      h4("Plot without zoom"), 
      plotOutput("Disp", height = 300, brush = brushOpts(id = "Disp_brush", clip = TRUE, resetOnNew = TRUE)) 
     ) 
    ), 
     fluidRow(
     column(12, 
      h4("Zoomed plot"), 
      plotOutput("DispZoom", height = 300) 
     ) 
    ) 
    ) 
) 
)) 

server.R

library(shiny) 
library(ggplot2) 

base = iris 


shinyServer(function(input, output) { 

    output$plots_parameters <- renderUI({ 
    tipos <- c("Dispersao", "Histograma", "Boxplot", "Área") 
    choices <- colnames(base) 
    div(
     selectInput("selectedColX", "Select colum for X axis", choices = choices, selected = "Sepal.Length"), 
     selectInput("selectedColY", "Select colum for Y axis", choices = choices, selected = "Petal.Length"), 
     selectInput("selectedColor", "Select colum for colour axis", choices = choices, selected = "Species"), 
     selectInput("seletedGraph", "Select type of graph", choices = tipos, selected = "Dispersao") 
    ) 
    }) 

    output$Disp <- renderPlot({ 

    req(input$seletedGraph == "Dispersao") 

    y_axis <- input$selectedColY 
    x_axis <- input$selectedColX 
    color_axis <- input$selectedColor 

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis)) 
    gg <- gg + geom_point() 

    # Return variable without print or plot 
    gg 

    }) 

    ranges2 <- reactiveValues(x = NULL, y = NULL) 

    output$DispZoom <- renderPlot({ 

    req(input$seletedGraph == "Dispersao") 

    y_axis <- input$selectedColY 
    x_axis <- input$selectedColX 
    color_axis <- input$selectedColor 

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis)) + geom_point() + 
     coord_cartesian(xlim = ranges2$x, ylim = ranges2$y) 
    # Return variable without print or plot 
    gg 

    }) 

    observe({ 
    brush <- input$Disp_brush 
    if (!is.null(brush)) { 
     ranges2$x <- c(brush$xmin, brush$xmax) 
     ranges2$y <- c(brush$ymin, brush$ymax) 

    } else { 
     ranges2$x <- NULL 
     ranges2$y <- NULL 
    } 
    }) 

}) 
+0

返事のおかげで、私はこれを追加しようと、それはまだ私がよ...動作しません。ブラシを使用してズームするのではなく、x、yスケールのスライダーを使用する方が簡単でしょうか?どのように私のために働いていないかを示すためにここに画像を追加する方法はわかりません:P –

+0

あなたはそうです!再現可能な解決策で私の答えを更新しました。 – qfazille

+0

ありがとうございました!私は今、完璧に働いた:D –

関連する問題