如何绘制基准输出?

时间:2017-01-07 16:25:49

标签: r ggplot2 benchmarking

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

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

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中实现显示算法性能的期望图?非常感谢

2 个答案:

答案 0 :(得分:2)

您可以尝试此操作(假设s1, s2, s3, ...表示您要比较的不同测试(可能包含不同的n),结果df_2代表df_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)

enter image description here

如果您想elapsedtest进行投标,请尝试以下操作:

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))

enter image description here

如果您想要更具可读性的图像,请尝试以下方法:

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))

enter image description here

[已编辑] 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))

enter image description here

答案 1 :(得分:1)

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

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()

line plot

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

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

smooth plot