如何改进data.frame的结果条形图?

时间:2017-01-11 10:36:31

标签: r ggplot2

我有两个data.frame需要在单个网格中生成条形图。我获得这些data.frame作为R中算法的基准测试结果。为此,获取两个data.frame必须合并为一的绘图数据。我已经在SO中了解了这类问题的早期帖子,并了解如何获得条形图。但是,我的结果图不是很好阅读,我认为我的代码需要做些什么。任何人都可以指出我如何以更好的方式改善结果情节?

可重现的数据:

使用两个cvs文件进行基准测试算法:

bnch_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文件来对相同的算法进行基准测试:

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

我使用bind_rows来获取单个data.frame并可能以这种方式得到条形图:

library(dplyr)
library(ggplot2)

DF <- bind_rows(bnch_2, bnch_3)
ggplot(DF$elapsed, aes(factor(test))) + 
    geom_bar(stat="identity", position = "dodge")

但我的代码有一些问题,无法产生我想要的情节。为了产生更易读的条形图,也许我增加输入数据的比例以使图可以很好地区分。我怎样才能做到这一点?

这是我想要实现的理想情节:

enter image description here

如何改进获取条形图的代码?我怎样才能实现我想要的条形图?有什么好主意吗?在此先感谢:)

1 个答案:

答案 0 :(得分:3)

您需要创建一个包含type的附加列,例如

DF = bind_rows(bnch_2, bnch_3, .id = "type")
# or add in the column
#DF$type = rep(c("A", "B"), each=9)

然后使用fill

进行绘图
g = ggplot(DF, aes(factor(test), elapsed)) + 
  geom_col(aes(fill = type), position = "dodge")

要匹配示例图的themetheme_tufte看起来很匹配

library(ggthemes)
g +   theme_tufte()

给你

enter image description here