2017-01-07 24 views
1

我正在学习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

你可以试试这个(假设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) 

enter image description here

如果哟ü要绘制elapsed针对test试试这个:如果您想了解更多可读图像

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

+0

亲爱sandipan,关于你的输出情节,如果我打算有针对''test'的elapsed'情节,我该怎么办呢?任何机会使线条图更加平滑和大胆,容易看到的线条?谢谢 – Dan

+0

@Dan根据您的要求更新 –

+0

亲爱的sandipan,如果我打算根据您的输出得到曲线图,我该怎么做?我只是好奇将线路情节与其他人进行比较。另外,我试图通过使用'geom_smooth()'来使绘图更加平滑,这样看来是错误的。任何想法 ? – Dan

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