您可以使用错误(或任何其他变量)除以代码行数 (LOC) 的比率。由于比率可能变化很大,例如错误与漏洞,因此生成的图通常看起来不太好,因此您可以使用规范化程序,事实上,这是推荐的程序。
在您的情况下,除以 LOC 的错误和一些漏洞看起来还不错,因此我在此示例中也包含了原始比率图。我正在使用计数重叠点图,它是条形图的变体,它不填充条形图,只关心作为一个点的值。您可以使用任何您认为能给您带来最佳结果的标准化。在这里,我只是将数据居中。在这两个图中,根据比率度量,最高值意味着更高的复杂性。
变量的原始比率除以 LOC

变量的归一化比率除以 LOC

R 中的代码需要复制这些图
require("reshape2")
require("ggplot2")
df1 <- data.frame(App = c("SweetApp", "SourApp", "SaltyApp"),
LOC = c(10000, 5660000, 1500),
Bugs = c(10, 120, 55),
CodeSmells = c(50, 30, 20),
Vulnerabilities = c(2, 3, 10))
#Define ratios
df1$RatiosBugs <- df1$Bugs / df1$LOC
df1$RatiosCodeSmells <- df1$CodeSmells / df1$LOC
df1$RatiosVulnerabilities <- df1$Vulnerabilities / df1$LOC
#Normalize Ratios
df1$NormRatiosBugs <- scale(df1$RatiosBugs, scale = FALSE)
df1$NormRatiosCodeSmells <- scale(df1$RatiosCodeSmells, scale = FALSE)
df1$NormRatiosVulnerabilities <- scale(df1$RatiosVulnerabilities, scale = FALSE)
dfRaw <- df1[, c("App", "RatiosBugs", "RatiosCodeSmells", "RatiosVulnerabilities")]
dfNorm <- df1[, c("App", "NormRatiosBugs",
"RatiosCodeSmells", "RatiosVulnerabilities")]
dfRaw.m <- melt(dfRaw, id.vars = c("App"))
dfNorm.m <- melt(dfNorm, id.vars = c("App"))
#Plot Raw Ratios
ggplot(dfRaw.m, aes(App, value)) +
geom_count(aes(color = variable), position = position_dodge(width = 0.4), stat = "identity")
#Plot Normalized Ratios
ggplot(dfNorm.m, aes(App, value)) +
geom_count(aes(color = variable), position = position_dodge(width = 0.4), stat = "identity")