2019-10-09

R Shiny でプロットのズーム

Shiny は R のパッケージの一つで、 このパッケージを使うと R を用いて対話的に操作する Web アプリケーションを作成することができます。Web 上のユーザーインタフェース部分を司る ui.R と、内部動作を司る server.R の二つの R 言語スクリプトで、サーバーサイドのコンテンツを作成できることが大きな特徴です。

RjpWiKi より引用

ggplot2 でズームをできるようにする

参考サイト [1] の Shiny のデモギャラリーに ggplot2 で描画したプロットをズームする例があります。プロットのズームしたいエリアをマウスでドラッグしてダブルクリックしてズームする機能はとても便利なので、この部分だけ取り出して、以前のブログ記事 [2] で紹介した簡単な Shiny アプリ iris-explorer にズーム機能を加えてみました。

ui.R を下記に示しました。

リスト:ui.R 
fluidPage(
    titlePanel("Iris explorer"),
    sidebarLayout(
        sidebarPanel(
            selectInput(
                inputId = "varX",
                label = "Select the X variable",
                choices = get.choices()),
            selectInput(
                inputId = "varY",
                label = "Select the Y variable",
                choices = get.choices(), selected = 2)
        ),
        mainPanel(
            plotOutput(
                "plot",
                dblclick = "plot_dblclick",
                brush = brushOpts(
                    id = "plot_brush",
                    resetOnNew = TRUE
                )
            )
        )
    )
)

server.R を下記に示しました。

リスト:server.R 
function(input, output) {
    ranges <- reactiveValues(x = NULL, y = NULL)
    var.x <- reactive(iris[, as.numeric(input$varX)])
    var.y <- reactive(iris[, as.numeric(input$varY)])
    label.x <- reactive(names(iris[as.numeric(input$varX)]))
    label.y <- reactive(names(iris[as.numeric(input$varY)]))

    output$plot <- renderPlot({
        ggplot(iris, aes(x = var.x(), y = var.y(), colour = Species)) +
            xlab(label.x()) + ylab(label.y()) + 
            coord_cartesian(xlim = ranges$x, ylim = ranges$y, expand = FALSE) +
            geom_point(size = 4) + gtheme
    })

    observeEvent(input$plot_dblclick, {
        brush <- input$plot_brush
        if (!is.null(brush)) {
            ranges$x <- c(brush$xmin, brush$xmax)
            ranges$y <- c(brush$ymin, brush$ymax)
        } else {
            ranges$x <- NULL
            ranges$y <- NULL
        }
    })
}

今回は global.R も使ってコード全体を少しだけ整理しています。

リスト:global.R 
library(shiny)
library(ggplot2)

gtheme <- theme(
    axis.title = element_text(size = 16),
    axis.text = element_text(size = 16),
    axis.line = element_line(),
    legend.title =  element_text(size = 14),
    legend.text = element_text(size = 14),
    panel.grid.major = element_line(colour="grey",size = rel(0.5)), 
    panel.grid.minor = element_blank(), 
    panel.background = element_rect(fill = "whitesmoke")
)

get.choices <- function() {
    part.iris <- list()
    for (item in names(iris)) {
        part.iris[[item]] <- grep(item, names(iris))       
    }
    return(part.iris)
}

下記に実行例を示しました。

プロット上、マウスでドラッグしてズームしたいエリア(薄青の矩形エリア)を決めます。

指定した矩形エリア上にマウスのポインタを移動して、ダブルクリックします。

指定したエリアにズームされます。

何も指定していないプロットの上でダブルクリックすると元のプロットに戻ります。

参考サイト

  1. Shiny - Plot interaction - zoom
  2. bitWalk's: R Shiny を使ってみる (2)

 

 

ブログランキング・にほんブログ村へにほんブログ村

0 件のコメント: