Используя tapply
, вы можете суммировать цифры по классам и основным специальностям. Затем просто разделите число основных валют по английскому на 1018 * на сумму всех, чтобы получить процент, который затем легко может быть равен barplot
. Я использую данные игрушек с 50 специальностями и 50 классами.
tmp <- with(dat, t(tapply(num, list(grade, major), sum)))
calc <- tmp[rownames(tmp) == "EN"] / colSums(tmp)*100
b <- barplot(t(calc), ylim=c(0, 4.5), col="lightblue", xlab="Grade", ylab="Percent",
main="Grades of english majors as percentage of all majors", xaxt="n", yaxt="n", border=FALSE)
box()
# x-axis
smj <- (1:50)[(1:50) %% 10 == 0]*.1
smn <- (1:50)*.1
axis(1, smj, at=b[seq(b) %% 10 == 0], tck=-.02, labels=F)
axis(1, smn, at=b, tck=-.01, labels=F)
mtext(formatC(smj, digits=1, format="f"), 1, 1, at=b[seq(b) %% 10 == 0])
# y-axis
axis(2, 1:50, at=1:50, labels=F)
mtext(paste(1:4, "%"), 2, 1, 0, at=1:4, las=2)
Результат
Игрушка данные
set.seed(43)
dat <- expand.grid(grade=(1:50)*.1, major=c("EN", "LH", "DU", "BE", "ZX", "XM", "GG", "BV", "GN", "IW",
"AT", "SM", "VH", "ND", "YC", "NA", "YN", "XH", "JT", "TD", "GS",
"EY", "RQ", "NY", "GD", "BS", "WF", "GJ", "XO", "FV", "TQ", "MU",
"FH", "LT", "GP", "ZY", "AZ", "GK", "EU", "XL", "VI", "JC", "CI",
"UM", "QU", "JX", "EE", "XJ", "XX", "DM"),
stringsAsFactors=F)
dat$num <- sample(1:10, nrow(dat), replace=TRUE)