我有以下数据框
A <- c(2020, 2020, 2020, 2021, 2021, 2021)
B <- c("category 1", "category 2", "category 3", "category 1", "category 2", "category 3")
C <- c(7, 10, 5, 11, 8, 7)
data <- data.frame(A, B, C)
names(data) <- c("yeat", "categories", "value")
如何绘制水平条形图,如下所示(即类别按每年的值排序):
最佳答案
在lapply
中使用barplot
。按年份
分割
数据,并根据顺序
绘制值
。我们还根据此方案提供条形 col=
ors 以及使用 mtext
的标签。
颜色和标签可以方便地存储在矩阵 m
中,其中行名称按类别划分,以便我们以后可以轻松匹配。
(m <- matrix(c('#3C79A7', '#8ECBE9', '#FB4C58',
"Category 1", "Category 2", "Category 3"), 3, 2,
dimnames=list(sort(unique(data$categories)), NULL)))
# [,1] [,2]
# category 1 "#3C79A7" "Category 1"
# category 2 "#8ECBE9" "Category 2"
# category 3 "#FB4C58" "Category 3"
S <- split(data, data$year)
op <- par(mfrow=c(1, 2), mar=c(2, 6, 4, 2)) ## par: 2 plots, expand margins
lapply(names(S), \(x) {
s <- S[[x]]
u <- order(s$value)
barplot(s$value[u], horiz=TRUE, col=m[s$categories[u], 1], border=NA,
main=x[1], xaxt='n', yaxt='n', ylab='')
mtext(m[s$categories[u], 2], 2, 1, at=seq_len(nrow(s)), las=2)
})
par(op) ## reset pars
数据:
data <- structure(list(year = c(2020, 2020, 2020, 2021, 2021, 2021),
categories = c("category 1", "category 2", "category 3",
"category 1", "category 2", "category 3"), value = c(7, 10,
5, 11, 8, 7)), class = "data.frame", row.names = c(NA, -6L
))
关于r - 按类别划分的水平条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71536681/