使用 Plotly 和 Shiny 在 R 中绘制交互式散点图
Interactive Scatter plot in R using Plotly and Shiny
我对 Shiny 和 Plotly 比较陌生,有以下代码片段:
#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
library(plotly)
library(odbc)
library(DBI)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Demo"),
#Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 0,
max = 100,
value = 70)
),
# Show a plot of the generated distribution
mainPanel(
tabPanel("Heading", plotlyOutput("tbTable"))
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output, session) {
QueriedData <- reactive({
connn <- DBI::dbConnect(odbc::odbc(),.connection_string = "XXX", uid = "AB", pwd = "CD")
lat_rec.df <- dbGetQuery(connn, "PQR")
dbDisconnect(connn)
lat_rec.df1
})
output$tbTable <- renderPlotly({
plot_ly(QueriedData(),x = ~TotalCount, y = ~MyScore, type = 'scatter', mode = 'markers')
})
}
# Run the application
shinyApp(ui = ui, server = server)
正如您在上面看到的,我正在绘制我从数据库中读取的数据框的散点图(如反应函数中所述)。我在这里有几个问题:
- 我想使用滑块输入作为我的 Y 轴 (MyScore)。我怎么做?我目前无法将 link 滑块(箱)放入我的绘图中。我希望散点图根据滑块输入进行更新。
- 我对反应函数有点困惑。这是否意味着每次我更改滑块时,数据库都会被调用(在反应函数中)?它是如何工作的?
- 如果我有其他数据库表要在其他区域读取和绘制,我是否将其包含在反应函数中?请指教
在此先感谢您的帮助!干杯!
我solutions/answers对你的三个问题。
1.As您想知道如何使用 sliderInput 控制 Y 轴,下面的代码解释了如何操作。
library(shiny)
library(plotly)
library(DBI)
library(pool)
pool <- dbPool(drv = RMySQL::MySQL(),dbname = "db",host = "localhost",username = "root",password = "psw", port = 3306)
data <- dbGetQuery(pool, "SELECT * FROM testTable;")
ui <- fluidPage(
titlePanel("Demo"),
sidebarLayout(
sidebarPanel(
sliderInput("bins", "Number of bins:", min = 0, max = 100, value = 70)
),
mainPanel(
tabPanel("Heading", plotlyOutput("tbTable"),
plotOutput("basicPlot") # Added extra as an Example for 3rd question
)
)
)
)
server <- function(input, output, session) {
QueriedData <- reactive({
df <- data[data$total <= input$bins,] # filtering datafarme based on sliderInput
return(df)
})
output$tbTable <- renderPlotly({
plot_ly(QueriedData(), x = ~count, y = ~total, type = 'scatter', mode = 'markers')
})
# Added extra as an Example for 3rd question
output$basicPlot <- renderPlot({
data_for_plot <- dbGetQuery(pool, "SELECT * FROM dummyTable WHERE uid = 2018;")
plot(x = data_for_plot$category, y = data_for_plot$performance, type = "p")
})
}
shinyApp(ui = ui, server = server)
2.For 反应性最好将 table 提取到数据帧中一次,然后将该数据帧放在反应性环境中。这样就可以避免多次数据库调用。您可以检查上面的代码。
3.Using of reactive
环境完全取决于您想要与闪亮的应用程序进行交互时的要求。如果您想从其他 table 获取数据并在不同的图中使用,则无需将数据库连接字符串放在反应环境中。只需像上面的代码一样根据您的要求查询数据库。
我对 Shiny 和 Plotly 比较陌生,有以下代码片段:
#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
library(plotly)
library(odbc)
library(DBI)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Demo"),
#Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 0,
max = 100,
value = 70)
),
# Show a plot of the generated distribution
mainPanel(
tabPanel("Heading", plotlyOutput("tbTable"))
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output, session) {
QueriedData <- reactive({
connn <- DBI::dbConnect(odbc::odbc(),.connection_string = "XXX", uid = "AB", pwd = "CD")
lat_rec.df <- dbGetQuery(connn, "PQR")
dbDisconnect(connn)
lat_rec.df1
})
output$tbTable <- renderPlotly({
plot_ly(QueriedData(),x = ~TotalCount, y = ~MyScore, type = 'scatter', mode = 'markers')
})
}
# Run the application
shinyApp(ui = ui, server = server)
正如您在上面看到的,我正在绘制我从数据库中读取的数据框的散点图(如反应函数中所述)。我在这里有几个问题:
- 我想使用滑块输入作为我的 Y 轴 (MyScore)。我怎么做?我目前无法将 link 滑块(箱)放入我的绘图中。我希望散点图根据滑块输入进行更新。
- 我对反应函数有点困惑。这是否意味着每次我更改滑块时,数据库都会被调用(在反应函数中)?它是如何工作的?
- 如果我有其他数据库表要在其他区域读取和绘制,我是否将其包含在反应函数中?请指教
在此先感谢您的帮助!干杯!
我solutions/answers对你的三个问题。
1.As您想知道如何使用 sliderInput 控制 Y 轴,下面的代码解释了如何操作。
library(shiny)
library(plotly)
library(DBI)
library(pool)
pool <- dbPool(drv = RMySQL::MySQL(),dbname = "db",host = "localhost",username = "root",password = "psw", port = 3306)
data <- dbGetQuery(pool, "SELECT * FROM testTable;")
ui <- fluidPage(
titlePanel("Demo"),
sidebarLayout(
sidebarPanel(
sliderInput("bins", "Number of bins:", min = 0, max = 100, value = 70)
),
mainPanel(
tabPanel("Heading", plotlyOutput("tbTable"),
plotOutput("basicPlot") # Added extra as an Example for 3rd question
)
)
)
)
server <- function(input, output, session) {
QueriedData <- reactive({
df <- data[data$total <= input$bins,] # filtering datafarme based on sliderInput
return(df)
})
output$tbTable <- renderPlotly({
plot_ly(QueriedData(), x = ~count, y = ~total, type = 'scatter', mode = 'markers')
})
# Added extra as an Example for 3rd question
output$basicPlot <- renderPlot({
data_for_plot <- dbGetQuery(pool, "SELECT * FROM dummyTable WHERE uid = 2018;")
plot(x = data_for_plot$category, y = data_for_plot$performance, type = "p")
})
}
shinyApp(ui = ui, server = server)
2.For 反应性最好将 table 提取到数据帧中一次,然后将该数据帧放在反应性环境中。这样就可以避免多次数据库调用。您可以检查上面的代码。
3.Using of reactive
环境完全取决于您想要与闪亮的应用程序进行交互时的要求。如果您想从其他 table 获取数据并在不同的图中使用,则无需将数据库连接字符串放在反应环境中。只需像上面的代码一样根据您的要求查询数据库。