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

时间:2015-09-30 13:50:40

标签: r plot bar-chart

我的数据框:

    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

和barplot的代码

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)

产生这个条形图 enter image description here

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

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

现在我想在substr.tmp中添加红线指示值。代码lines()不起作用。

我的输出(红线)应该“看起来”像这样(它是图片形式excel,我有兴趣添加行,而不是图片本身的数据)

enter image description here

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))

2 个答案:

答案 0 :(得分:4)

使用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()

这给出了:

enter image description here

使用过的数据:

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)

答案 1 :(得分:2)

这可能对您有用,但您的示例数据集(以及评论中的一个)的差异将产生一个有趣的情节:

#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)