条形图中的自定义线(多个条形图)

Custom line in barplot (multiple barplots)

我的数据框:

    N   P   E   S
W1 3.5 3.5 3.4 3.5
w2 3.4 3.7 3.6 3.5
w3 3.5 3.4 3.5 3.5
w4 3.5 3.4 3.5 3.5
w5 3.5 3.4 3.5 3.5
w6 3.5 3.4 3.5 3.5
w7 3.5 3.4 3.5 3.5
w8 3.5 3.4 3.5 3.5

条形图的代码

mat <- as.matrix(t(tabela.matrix))

qw <- barplot(mat, beside = TRUE, axisnames = FALSE, ylim = c(0, 6),
              col = c("yellow", "deepskyblue1", "yellowgreen", "orchid4"))

text(colMeans(qw[2:3, ]), -0.25, labels = colnames(mat), xpd = TRUE, srt = 15)
text(qw, 0, round(as.matrix(t(tabela.matrix)), 1), cex = 1, pos = 3, srt = 90)

legend(3.2, -0.6, c("N","P","E", "S"),
       fill = c("yellow", "deepskyblue1", "yellowgreen", "orchid4"),
       horiz = TRUE, xpd = TRUE)

生成此条形图

所以在我的条形图上我需要添加 line 表示减法:每行的最大最小值。所以我使用下面的代码来做减法。

max.tmp <- apply(df, 1, max)
min.tmp <- apply(df, 1, min)
substr.tmp <- max.tmp - min.tmp

现在我想在 substr.tmp 中添加表示值的红线。代码 lines() 无效。

我的输出(红线)应该"look"像这样(它是图片形式excel我感兴趣的是添加线,而不是图片本身的数据)


一个dput的数据:

structure(c(3.46666666666667, 3.35, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.45555555555556, 3.7, 3.36666666666667, 3.36666666666667, 3.36666666666667, 3.36666666666667, 3.36666666666667, 3.36666666666667, 3.40769230769231, 3.57692307692308, 3.53846153846154, 3.53846153846154, 3.53846153846154, 3.53846153846154, 3.53846153846154, 3.53846153846154, 3.51122994652406, 3.5156862745098, 3.49090909090909, 3.49090909090909, 3.49090909090909, 3.49090909090909, 3.49090909090909, 3.49090909090909 ), .Dim = c(8L, 4L), .Dimnames = list(c("a", "b", "c", "d", "e", "f", "g", "h"), NULL))

使用 data.tableggplot2 包,您可以按如下方式进行:

library(data.table)
df2 <- melt(setDT(df), id="name")
df2[, difference := max(value) - min(value), by = name]

library(ggplot2)
ggplot(df2, aes(x=name, y=value, fill=variable)) +
  geom_bar(stat="identity", position="dodge") +
  geom_line(aes(x=name, y=difference, group=1), size=1.5, color="red") +
  scale_x_discrete(expand = c(0,0)) +
  scale_y_continuous(expand = c(0,0), limits = c(0,4)) +
  scale_fill_manual(breaks = c("V1", "V2", "V3", "V4"),
                    values = c("yellow", "deepskyblue1", "yellowgreen", "orchid4")) +
  theme_bw()

这给出:

已用数据:

m <- structure(c(3.46666666666667, 3.35, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.45555555555556, 3.7, 3.36666666666667, 3.36666666666667, 3.36666666666667, 3.36666666666667, 3.36666666666667, 3.36666666666667, 3.40769230769231, 3.57692307692308, 3.53846153846154, 3.53846153846154, 3.53846153846154, 3.53846153846154, 3.53846153846154, 3.53846153846154, 3.51122994652406, 3.5156862745098, 3.49090909090909, 3.49090909090909, 3.49090909090909, 3.49090909090909, 3.49090909090909, 3.49090909090909 ), .Dim = c(8L, 4L), .Dimnames = list(c("a", "b", "c", "d", "e", "f", "g", "h"), NULL))
df <- as.data.frame(m)
df$name <- rownames(df)

这可能对您有用,但您的示例数据集(以及您评论中的差异)的差异会产生一个看起来很有趣的图:

#original code
mat <- as.matrix(t(tabela.matrix)) ;qw <- barplot(mat, beside=TRUE, axisnames = FALSE,ylim = c(0, 6), col=c("yellow", "deepskyblue1", "yellowgreen","orchid4")) ; text(colMeans(qw[2:3,]), -0.25, labels = colnames(mat), xpd=TRUE, srt=15); legend(3.2,-0.6, c("Nadrejeni","Podrejeni","Enak nivo", "Samoocenjevalec"), fill=c("yellow", "deepskyblue1", "yellowgreen","orchid4"), horiz=TRUE, xpd=TRUE)
text(qw, 0, round(as.matrix(t(tabela.matrix)), 1),cex=1,pos=3,srt=90)
legend(3.2, -0.6, c("N","P","E", "S"),
   fill = c("yellow", "deepskyblue1", "yellowgreen", "orchid4"),
   horiz = TRUE, xpd = TRUE)
#new code
par(new=TRUE)
plot(substr.tmp, lwd=2, col="red", type="l", axes=FALSE, ylim=c(0,6))
axis(4, ylim=c(0,6), col="red",col.axis="red",las=1)

请注意,此图有两个轴,一黑一红。红色的是第二个情节。如果您想删除它,请注释最后一行。而且,根据您的预期输出,这保持在原始比例(因此 ylim=c(0,6)