使用循环更新 ggplot2 折线图的数据
Update the data for ggplot2 line graph using the loop
嗨,我是编程新手,'R'。编写了以下代码来测试我的 ping 连续性:
library(pingr)
library(ggplot2)
cc=2
counts <- c(1:1)
pings <- c(ping("8.8.8.8",count = 1))
rgh <- data.frame(counts,pings)
ggplot(rgh, aes(x=counts,y=pings))+geom_line(aes(col="red"))+coord_cartesian(xlim=(c(0,300)),ylim=(c(0,100)))
#qplot(x=counts,y=pings,data=rgh)
while (cc<300) {
counts <- c(counts,cc)
pings <- c(pings,ping("8.8.8.8",count = 1))
rgh <- data.frame(counts,pings)
print(ggplot(rgh, aes(x=counts,y=pings))+geom_line(aes(col="red"))+coord_cartesian(xlim=(c(0,300)),ylim=(c(0,100))))
cc <- cc+1
}
我想让它看起来像 speedtest.net 上的酷图。但是这个每次循环都会重新绘制整个图,这会花费太多时间。还有其他办法吗?
这里有一个例子,说明如何使用 shiny 和 plotly 设置所需的行为:
library(shiny)
library(plotly)
library(pingr)
带有开始按钮和绘图区域的简单 ui:
ui <- fluidPage(
div(actionButton("button", "start")),
div(plotlyOutput("plot"), id='graph')
)
server <- function(input, output, session) {
p <- plot_ly(
y = ping("8.8.8.8",count = 1),
type = 'scatter',
mode = 'lines')
output$plot <- renderPlotly(p)
observeEvent(input$button, {
while(TRUE){
Sys.sleep(1)
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("extendTraces", list(y=list(list(ping("8.8.8.8",count = 1)))), list(0))
}
})
}
shinyApp(ui, server)
一段时间后它看起来像这样:
编辑:回答评论中的问题:
有多种方法可以控制 ping 的数量。也许是最简单的:
server <- function(input, output, session) {
p <- plot_ly(
y = ping("8.8.8.8",count = 1),
type = 'scatter',
mode = 'lines')
a = 1
output$plot <- renderPlotly(p)
observeEvent(input$button, {
while(a <= 30){
a <- a + 1
Sys.sleep(1)
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("extendTraces", list(y=list(list(ping("8.8.8.8",count = 1)))), list(0))
}
})
}
此处执行了 30 次 ping
要更改 ping 的频率,请将 Sys.sleep(1)
更改为您的链接。
嗨,我是编程新手,'R'。编写了以下代码来测试我的 ping 连续性:
library(pingr)
library(ggplot2)
cc=2
counts <- c(1:1)
pings <- c(ping("8.8.8.8",count = 1))
rgh <- data.frame(counts,pings)
ggplot(rgh, aes(x=counts,y=pings))+geom_line(aes(col="red"))+coord_cartesian(xlim=(c(0,300)),ylim=(c(0,100)))
#qplot(x=counts,y=pings,data=rgh)
while (cc<300) {
counts <- c(counts,cc)
pings <- c(pings,ping("8.8.8.8",count = 1))
rgh <- data.frame(counts,pings)
print(ggplot(rgh, aes(x=counts,y=pings))+geom_line(aes(col="red"))+coord_cartesian(xlim=(c(0,300)),ylim=(c(0,100))))
cc <- cc+1
}
我想让它看起来像 speedtest.net 上的酷图。但是这个每次循环都会重新绘制整个图,这会花费太多时间。还有其他办法吗?
这里有一个例子,说明如何使用 shiny 和 plotly 设置所需的行为:
library(shiny)
library(plotly)
library(pingr)
带有开始按钮和绘图区域的简单 ui:
ui <- fluidPage(
div(actionButton("button", "start")),
div(plotlyOutput("plot"), id='graph')
)
server <- function(input, output, session) {
p <- plot_ly(
y = ping("8.8.8.8",count = 1),
type = 'scatter',
mode = 'lines')
output$plot <- renderPlotly(p)
observeEvent(input$button, {
while(TRUE){
Sys.sleep(1)
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("extendTraces", list(y=list(list(ping("8.8.8.8",count = 1)))), list(0))
}
})
}
shinyApp(ui, server)
一段时间后它看起来像这样:
编辑:回答评论中的问题: 有多种方法可以控制 ping 的数量。也许是最简单的:
server <- function(input, output, session) {
p <- plot_ly(
y = ping("8.8.8.8",count = 1),
type = 'scatter',
mode = 'lines')
a = 1
output$plot <- renderPlotly(p)
observeEvent(input$button, {
while(a <= 30){
a <- a + 1
Sys.sleep(1)
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("extendTraces", list(y=list(list(ping("8.8.8.8",count = 1)))), list(0))
}
})
}
此处执行了 30 次 ping
要更改 ping 的频率,请将 Sys.sleep(1)
更改为您的链接。