Search code examples
rdateggplot2shinyposixct

POSIXct axis and sliderInput in ggplot with shiny


I'm new to Shiny. I'm trying to use sliderInput for dates with ggplot and shiny. I could use dygraphs and it worked. But I'm hoping to stick with ggplot for data visualisation. R script below may be a mess. I just can't get the sliderInput to work on shiny app using ggplot.

The data set is here.

library(shiny)
library(scales)
library(ggplot2)
library(reshape2)


# Set system language as Japanese
Sys.setlocale(category = "LC_ALL", locale = "Japanese")

# Load data ---- the dataset is available at the link above.
df <-read.csv("data.csv", encoding="UTF-8", stringsAsFactors=FALSE, check.names = F)
colnames(df)[1]<-"取引オープン日"  ##If the first column had extra string.


##Formating date
df$取引クローズ日edit<-gsub("/","-",df$取引クローズ日)
df$取引クローズ日edit<-as.POSIXct(df$取引クローズ日edit, format="%m-%d-%Y %H:%M")

##Pick 5 columns
df_5col<-df[,c("ロット","総ピップス","総収益","ドローダウン(差額)","取引クローズ日edit")]

##Stack dataset
stacked<-melt(df_5col,id.vars="取引クローズ日edit",variable.name="USD/pips",value.name="USD/pips(値)")

stacked$取引クローズ日edit<-as.POSIXct(stacked$取引クローズ日edit, format="%Y-%m-%d %H:%M") ##%m-%d-%Y    

# User interface ----
ui <- fluidPage(
  titlePanel("Autobot1"),
  sidebarLayout(
    sidebarPanel(
      helpText("FX autobot"),
      
      checkboxGroupInput("checkGroup", label = "Choose a variable to display", 
                         choices = c("総収益" = "総収益", "ドローダウン(差額)" = "ドローダウン", "総ピップス" = "総ピップス", "ロット" = "ロット"),
                         selected = "総収益"),
      
      sliderInput("sliderdate", 
                  label = "可視化する期間:",
                  min = as.POSIXct("2020-03-24 10:23", "%Y-%m-%d %H:%M"),
                  max = as.POSIXct("2020-12-30 10:23", "%Y-%m-%d %H:%M"),
                  value=c(as.POSIXct("2020-03-24 10:23"),
                          as.POSIXct("2020-12-30 10:23")),
                  timeFormat="%Y-%m-%d %H:%M")
    ),
    mainPanel(plotOutput("plot1"))
  )
)

# Server logic
server <- function(input, output) {
  output$plot1 <- renderPlot({
    ##filter data
    df_5col%>% 
      filter(取引クローズ日edit == input$sliderdate) %>%
      #data manipulation
      data1=reactive({
        return(stacked[stacked$USD/pips%in%input$checkGroup,])
      })
    ggplot(data=data1) +geom_line(aes(x=取引クローズ日edit, y= 総収益, colour="総収益"))+geom_line(aes(x=取引クローズ日edit, y=総ピップス, colour="総ピップス"))+geom_line(aes(x=取引クローズ日edit, y= ロット, colour="ロット"))+scale_x_datetime(labels = date_format("%Y-%m-%d %H:%M"),date_breaks = "2 months")
  })
  
}

# Run the app
shinyApp(ui, server)

Thanks in advance


Solution

  • It's solved. The script below works.

    library(shiny)
    library(scales)
    library(ggplot2)
    library(reshape2)
    
    # Set system language as Japanese
    Sys.setlocale(category = "LC_ALL", locale = "Japanese")
    
    # Load data ----
    df <-read.csv("data.csv", encoding="UTF-8", stringsAsFactors=FALSE, check.names = F)
    colnames(df)[1]<-"取引オープン日"  ##If the first column had extra string.
    
    ##Formating date
    df$取引クローズ日edit<-gsub("/","-",df$取引クローズ日)
    df$取引クローズ日edit<-as.POSIXct(df$取引クローズ日edit, format="%m-%d-%Y %H:%M") 
    
    ##Pick 5 columns
    df_5col<-df[,c("ロット","総ピップス","総収益","ドローダウン(差額)","取引クローズ日edit")]
    
    ##Stack dataset
    stacked<-melt(df_5col,id.vars="取引クローズ日edit",variable.name="USD/pips",value.name="USD/pips(値)")
    
    stacked$取引クローズ日edit<-as.POSIXct(stacked$取引クローズ日edit, format="%m-%d-%Y %H:%M") 
    
    
    # User interface ----
    ui <- fluidPage(
      titlePanel("title"),
      sidebarLayout(
        sidebarPanel(
          helpText("Times-series data of FX autobot"),
          
          checkboxGroupInput("checkGroup", label = "Choose a variable to display", 
                             choices = c("総収益" = "総収益", "ドローダウン(差額)" = "ドローダウン(差額)", "総ピップス" = "総ピップス", "ロット" = "ロット"),
                             selected = "総収益"),
          
          sliderInput("sliderdate", 
                      label = "可視化する期間:",
                      min = as.POSIXct("2020-03-24 10:23"),
                      max = as.POSIXct(Sys.Date()),
                      value=c(as.POSIXct("2020-03-24 10:23"),
                              as.POSIXct("2020-12-30 10:23")),
                      timeFormat="%m-%d-%Y %H:%M")
        ),
        mainPanel(plotOutput("plot1"))
      )
    )
    
    # Server logic
    server <- function(input, output) {
      output$plot1 <- renderPlot({
        
        ##create the data
        date1<-as.POSIXct(input$sliderdate, timeFormat="%m-%d-%Y %H:%M")
        
        sub_data <- subset(stacked, 取引クローズ日edit >= date1[1] & 取引クローズ日edit <= date1[2])
     
        sub_data2<-sub_data[sub_data[,2]%in%input$checkGroup,]
        ggplot(data=sub_data2) +geom_line(aes(x=取引クローズ日edit, y= sub_data2[,3], color=sub_data2[,2]))+ylab("USD/pips")+xlab("取引クローズ日")+scale_x_datetime(labels = date_format("%m-%d-%Y"),date_breaks = "1 month")
      })
      
    }
    
    # Run the app
    shinyApp(ui, server)