I ran out of time a couple of months ago and decided to use the following quick hack to generatea Kiviat plot using ggplot2’s coord_polar function.
The result

Sample Dataset Used
> dataset <- read.table('experiments-performance-kiviat.dat', header=TRUE, sep=',') > dataset Workload Indexing Ingestion OAI.PMH.data.provider RSS.Feed Search 1 100 0.86 0.1213379 480 3.130493e+00 2.466736e+01 2 200 0.86 0.1166992 980 5.613892e+00 4.787427e+01 3 400 1.14 0.1174316 2000 1.099023e+01 9.738324e+01 4 800 1.32 0.1179199 4120 2.089575e+01 1.919023e+02 5 1600 2.14 0.1170247 5410 4.034625e+01 3.869901e+02 6 3200 3.13 0.1193034 5940 7.885956e+01 7.683469e+02 7 6400 5.33 0.1194661 6730 1.565882e+02 1.531056e+03 8 12800 10.61 0.1269531 8370 3.099473e+02 3.093123e+03 9 25600 17.99 0.1186523 11680 6.167455e+02 6.172219e+03 10 51200 35.66 0.1223145 18900 1.237004e+03 1.248706e+04 11 102400 70.36 0.1350098 33460 2.505255e+03 2.510874e+04 12 204800 148.22 0.1280111 66950 5.117130e+03 4.930145e+04 13 409600 3618.62 0.1213379 139720 1.053439e+04 1.002673e+05 14 819200 8337.75 0.1241048 586450 1.374618e+05 7.365254e+06 15 1638400 19968.95 0.1243490 1937090 1.503809e+06 1.866471e+07 >
The plot
# import libraries require(ggplot2) require(reshape2) require(grid) require(scales) require(fmsb) require(ggthemes) # import datafeeds dataset <- read.table("plot.experiments-performance-kiviat.dat", header=TRUE, sep=",") # re-order and rename workloads dataset$Workload <- factor(dataset$Workload, levels=c(100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400), labels=c("100","200","400","800","1.6k","3.2k","6.4k","12.8k","25.6k","51.2k","102.4k","204.8k","409.6k","819.2k","1638.4k")) # convert dataset to molten form for ggplot2 experimentdataset <- melt(dataset, id.vars=c(1)) # rename/normalise performance evaluation aspects levels(experimentdataset$variable)[levels(experimentdataset$variable)=="Indexing"] <- paste("Index","") levels(experimentdataset$variable)[levels(experimentdataset$variable)=="Ingestion"] <- paste("Ingest","") levels(experimentdataset$variable)[levels(experimentdataset$variable)=="OAI.PMH.data.provider"] <- paste("OAI-PMH","") levels(experimentdataset$variable)[levels(experimentdataset$variable)=="RSS.Feed"] <- paste("Feed","") levels(experimentdataset$variable)[levels(experimentdataset$variable)=="Search"] <- paste("Search","") # generate plot ggplot(experimentdataset, aes(x=variable, y=value, colour=as.factor(Workload), group=as.factor(Workload))) + geom_line(aes(linetype=as.factor(Workload)),size=1.5) + coord_polar(theta="x", direction=-1) + scale_linetype_manual(values=c("solid","dashed","dotted","dotdash","longdash","solid","dashed","dotted","dotdash","longdash","solid","dashed","dotted","dotdash","longdash")) + scale_y_log10(breaks=trans_breaks("log10", function(x) 10^x), labels=trans_format("log10", math_format(10^.x))) + labs(x="", y="log10(Time [ms])") + theme_igray() + scale_colour_stata() + theme(legend.title=element_blank(), legend.position="bottom", legend.text=element_text(size=8), #legend.key.height=unit(0.35,"cm"), #plot.margin=unit(c(0.2,0.15,0.05,0.8),"cm"), plot.margin=unit(c(0.5,0.5,0,0.8),"cm"), strip.text = element_text(size=9), axis.text = element_text(size=8), axis.title.y = element_text(vjust=-0.2,size=10)) + guides(linetype = guide_legend(nrow = 3)) @