Если вы также хотите отображать пустое время просто без какой-либо линии бара, есть способ использовать базу barplot
. Сначала нам нужны данные в широком формате, чего можно достичь с помощью reshape
(вы также можете посмотреть на ?data.table::dcast
) и создать два клона.
dat1 <- reshape(dat[-4], idvar="group", direction="wide")
dat1[] <- lapply(dat1, function(x) if (all(x == 0)) NA else x) # set zeros to NA
dat1.1 <- dat1.2 <- dat1 # create clones
В одном клоне мы устанавливаем «нет раз» на NA
, в другом - противоположности.
no.times <- paste0("value.", 1:7)
dat1.1[names(dat1) %in% no.times] <- NA
dat1.2[-which(names(dat1) %in% no.times)] <- NA
Теперь мы можем построить один график поверх другого (используя опцию add=TRUE
) с различными настройками для border
и col
.
barplot(as.matrix(dat1.1[-1]), names.arg=1:10,
ylim=c(-.1, max(colSums(dat1[-1]), na.rm=TRUE) + .1),
border=0, col=c("#56B4E9", "#E69F00"),
main="My plot", xlab="Time", ylab="Value")
barplot(as.matrix(dat1.2[-1]), names.arg=1:10,
border=c("#56B4E9", "#E69F00"), col=NA, add=TRUE)
box() # add box around plot
legend("topleft", legend=c("A", "B", "no"), pch=c(15, 15, 0), # add legend
col=c("#56B4E9", "#E69F00", "black"), title="Group")
Результат
![enter image description here](https://i.stack.imgur.com/Jm6Fq.png)
Данные
dat <- structure(list(time = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), value = c(0, 0, 0,
0, 1.37095844714667, 0.564698171396089, 0.363128411337339, 0.63286260496104,
0.404268323140999, 0.106124516091484, 0, 0, 0, 0, 0, 1.51152199743894,
0.0946590384130976, 2.01842371387704, 0.062714099052421, 1.30486965422349
), group = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("A", "B"), class = "factor"),
group_fill = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L,
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L), .Label = c("A",
"B", "no"), class = "factor")), class = "data.frame", row.names = c(NA,
-20L))