交互式情节

时间:2017-03-08 14:23:35

标签: r ggplot2 shiny

我正在努力建立一个闪亮的应用程序,以重新滚动6面骰子。 一个有2个动作按钮。我想实现,每次点击重拍按钮都会在SAME(!!)图上添加另一个概率线。

每个概率线应该是另一种颜色(因此,如果你点击它30次,你会看到6个不同颜色的探测线作为结果)

使用“重新启动”按钮可以删除绘图中的所有打印图形,可以从头开始尝试(因此,如果一行打印时间也可以正常)。

这是我到目前为止所创造的:

library(ggplot2)
library(ggthemes)
library(extrafont)

ui <- fluidPage(

# Application title
titlePanel("Roll the dice"),

# Sidebar with a go_button and a restart_button
sidebarLayout(
sidebarPanel(
  actionButton("reroll", 
               "ReRoll the dice", 
               width = "100%"),
  br(),
  br(),

  actionButton("restart", 
               "Restart", 
               width = "100%")
),

# Show a plot 
mainPanel(
  plotOutput("plot")
  )
 )
)

server <- function(input, output) {

output$plot <- renderPlot({

input$reroll

a <- 1:6
b <- 1:1000
eyes <- sample(a,1000,replace=T)
six <- eyes == 6
c <- cumsum(six) / 1:1000
df <- data.frame(b , c)


gl <- geom_line(aes(x = b , y = c), size = 0.9, linetype="dashed", colour = "red", alpha = 0.5)

p <-  ggplot(data = df) +
      xlim(0, 1000) +
      ylim(0, 1) +
      labs(x="Number of Throws", y="Probability of 6") +
      ggtitle("Approximation of Diceprobability") +

      theme_fivethirtyeight() + scale_colour_fivethirtyeight() +
      theme(axis.title = element_text(family="Atlas Grotesk Regular"),
              legend.position="bottom", legend.direction="horizontal",
              legend.title=element_blank(),
              plot.title=element_text(family="Atlas Grotesk Medium"),
              legend.text=element_text(family="Atlas Grotesk Regular"),
              text=element_text(family="DecimaMonoPro"))

p + gl

 })
}

shinyApp(ui=ui, server = server)

问题:

  1. 如何在同一个图中绘制不同的线条(你知道......我点击了30次,它在同一个图中构建了30行)

  2. 我如何编程,每一行都有另一种颜色?

  3. 如何用我的重启按钮“擦除”它可以再试一次?

  4. 我很高兴在那里得到每一个帮助: - )

    非常感谢。

2 个答案:

答案 0 :(得分:1)

  • 使用observeEvent触发按钮。
  • 使用reactiveValues存储绘图和颜色计数器。
  • 不要使用那种色标,因为它只有三种颜色。

保持ui不变,然后制作server

server <- function(input, output) {
  # start plot
  p_blank <- ggplot() +
    xlim(0, 1000) +
    ylim(0, 1) +
    labs(x="Number of Throws", y="Probability of 6") +
    ggtitle("Approximation of Diceprobability") +
    theme_fivethirtyeight() + 
    theme(legend.position="bottom", legend.direction="horizontal",
          legend.title=element_blank())

  #reactive values
  reac <- reactiveValues()
  reac$p_lines <- p_blank
  reac$counter <- 0

  # button functionality
  observeEvent(input$reroll,
               {
                 input$reroll
                 a <- 1:6
                 b <- 1:1000
                 eyes <- sample(a,1000,replace=T)
                 six <- eyes == 6
                 c <- cumsum(six) / 1:1000
                 df <- data.frame(b, c, counter = reac$counter)
                 gl <- geom_line(aes(x = b , y = c, col = factor(counter)), df, 
                                 size = 0.9,  linetype="dashed", alpha = 0.5)
                 reac$p_lines <- reac$p_lines + gl
                 reac$counter <- reac$counter + 1
               })

  observeEvent(input$restart,
               {
                 reac$p_lines <- p_blank
                 reac$counter <- 0
               } )

  # draw the plot
  output$plot <- renderPlot(reac$p_lines)
}

enter image description here

答案 1 :(得分:0)

我不确定你想要实现什么,但除了:

  1. 要更新绘图,我会设置一个保持绘图对象的无功值。然后我会使用并观察事件以观察按钮按下。在此活动中添加您的新行。

  2. 然后,您可以为其他按钮创建一个observeEvent,以使用空图替换您的绘图对象。