【问题标题】:How can I plot benchmark output?如何绘制基准输出?
【发布时间】:2017-01-07 16:25:48
【问题描述】:

我正在学习 rbenchmark 包以对算法进行基准测试并查看 R 环境中的性能。但是,当我增加输入时,基准测试结果会有所不同。为了展示不同输入的算法性能如何,需要生成折线图或曲线。我希望有一条线或曲线来显示使用不同数量的输入的性能差异。我使用的算法工作 O(n^2)。在结果图中,X 轴显示输入的观察次数,Y 轴分别显示运行时间。我怎样才能通过使用@987654324 更优雅地实现这一点@?谁能给我一些想法来生成所需的情节?请问有什么办法吗?

让我们想象一下,这些是输入文件:

foo.csv
bar.csv
cat.csv

当我使用两个 csv 文件作为输入时的基准测试结果:

df_2 <- data.frame(
    test=c("s3","s7","s4" ,"s1" ,"s2" ,"s5" ,"s6" ,"s9","s8"),
    replications=c(10,10, 10, 10 ,10 ,10 ,10 ,10 ,10),
    elapsed=c(0.23,  0.28,  0.53 , 0.80 , 4.12 , 8.57 , 8.81 ,20.16 ,24.53),
    relative=c( 1.000 ,  1.217 ,  2.304 ,  3.478 , 17.913 , 37.261 , 38.304 , 87.652 ,106.652),
    user.self=c(0.23, 0.28 , 0.53 , 0.61 , 4.13 , 8.55 , 8.80 ,18.06 ,19.08),
    sys.self=c(0.00, 0.00 ,0.00, 0.00 ,0.00, 0.00 ,0.00 ,0.13, 0.51)
)

这次我使用了三个 csv 文件作为输入:

df_3 <- data.frame(
    test=c("s3", "s7" ,"s4", "s1", "s5", "s6","s2", "s9","s8"),
    replications=c(10,10, 10, 10 ,10 ,10 ,10 ,10 ,10),
    elapsed=c( 0.34 , 0.47 , 0.70 , 2.41  ,8.26 , 8.75 , 9.03, 28.78 ,36.56),
    relative=c( 1.000 ,  1.382 ,  2.059  , 7.088 , 24.294 , 25.735 , 26.559  ,84.647 ,107.529),
    user.self=c(0.34 , 0.46  ,0.70 , 1.72 , 8.26 , 8.74  ,9.01, 26.24 ,30.95),
    sys.self=c(0.00 ,0.00 ,0.00, 0.12, 0.00 ,0.00 ,0.00, 0.12 ,0.77)
)

在我想要的图中,两条线图或曲线必须放在一个网格中。

如何使用上述基准测试结果获得漂亮的折线图或曲线?如何在 R 中获得显示算法性能的所需图?非常感谢

【问题讨论】:

    标签: r ggplot2 benchmarking


    【解决方案1】:

    你可以试试这个(假设s1, s2, s3, ...代表不同的测试,可能有不同的n,你想比较结果df_2df_3):

    library(reshape2)
    df_2 <- melt(df_2, id='test')
    df_3 <- melt(df_3, id='test')
    df_2$num_input <- 'two_input'
    df_3$num_input <- 'three_input'
    df <- rbind(df_2, df_3)
    library(ggplot2)
    ggplot(df, aes(test, value, group=num_input, col=num_input)) + geom_point() + geom_line() + facet_wrap(~variable)
    

    如果您想针对test 绘制elapsed,试试这个:

    ggplot(df[df$variable=='elapsed',], aes(test, value, group=num_input, col=num_input)) + geom_point() + geom_line(lwd=2) + ylab('elapsed') +
      theme(text=element_text(size=15))
    

    如果你想要更多可读的图像,试试这个:

    ggplot(df, aes(test, value, group=num_input, col=num_input)) + geom_point() + geom_line(lwd=2) + facet_wrap(~variable) +
      theme(text=element_text(size=15))
    

    [编辑]geom_smooth

    ggplot(df[df$variable=='elapsed',], aes(test, value, group=num_input, col=num_input)) + 
      geom_point() + geom_smooth(span=0.7, se=FALSE) + ylab('elapsed') +
      theme(text=element_text(size=15))
    

    【讨论】:

    • 亲爱的 Sandipan,关于您的输出图,如果我打算将 elapsed 的图与 test 对比,我该怎么做?有没有机会让折线图更平滑、更粗、更容易看到?谢谢
    • 亲爱的sandipan,如果我打算根据你的输出得到曲线图,我该怎么做?我只是好奇将线图与其他人进行比较。另外,我试图通过使用geom_smooth() 使情节流畅,以这种方式使用似乎有问题。有什么想法吗?
    • 亲爱的Dan,用geom_smooth更新了,但是拟合的曲线不会很平滑,因为我们的数据点很少,我们可以用span参数控制曲线的平滑度。
    • 你能看看我的问题吗? stackoverflow.com/questions/65458335/… 谢谢!
    【解决方案2】:

    首先,我们创建一个分组变量。

    df_2$set <- "set_1"
    df_3$set <- "set_2"
    

    然后我们为复制次数创建一个变量。

    df_2$n <- 1:length(df_2$replications)
    df_3$n <- 1:length(df_2$replications)
    

    我们按行绘制绑定df_2df_3,创建单个数据框。

    这将创建一个线图。

    ggplot(rbind(df_2, df_3)) + 
      aes(as.factor(n), elapsed, color = set, group = set) + 
      geom_line()
    

    这将创建一个平滑的线图,使用黄土作为方法。

    ggplot(rbind(df_2, df_3)) + 
      aes(as.factor(n), elapsed, color = set, group = set) + 
      geom_smooth(alpha = 0)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2019-10-08
    • 2018-07-22
    • 2015-07-20
    • 1970-01-01
    • 2010-09-21
    • 2013-04-03
    相关资源
    最近更新 更多