我有两个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")
但我的代码有一些问题,无法产生我想要的情节。为了产生更易读的条形图,也许我增加输入数据的比例以使图可以很好地区分。我怎样才能做到这一点?
这是我想要实现的理想情节:
如何改进获取条形图的代码?我怎样才能实现我想要的条形图?有什么好主意吗?在此先感谢:)
答案 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")
要匹配示例图的theme
,theme_tufte
看起来很匹配
library(ggthemes)
g + theme_tufte()
给你