Центрирование текстовых меток на столбцах с накоплением (галочки не в алфавитном порядке) в ggplot2
Я задал вопрос, аналогичный этому, в предыдущем посте, и этот код работает, когда все отметки по оси X расположены в алфавитном порядке. Цвета гистограммы основаны на "MaskID". Однако, когда я изменяю порядок тиков по оси X, текстовые метки "MaskID", которые я хочу на столбчатой диаграмме с накоплением, не меняются в соответствии с их соответствующими цветами.
p <- ggplot(df, aes(x, y))
p <- p + xlab("xlabel")
p <- p + ylab("ylabel")
p <- p + ggtitle("ylabel vs xlabel")
p <- p + geom_bar(stat="identity", aes(fill=MaskID))
p <- p + theme(axis.text.x = element_text(angle=90, vjust=-0.005, hjust=1))
df$x <- as.character(df$x)
dd <- ggplot_build(p)[[1]][[1]]
xy <- unique(dd[dd$y != 0, c("x", "y")])
dat <- with(xy, data.frame(
x=x,
y=unlist(sapply(split(y, x), function(z) diff(c(0, z))/2 + head(c(0, z), -1)))
))
labels <- with(df[df$y!=0,], unlist(split(MaskID, x)))
p <- p + geom_text(data=dat, aes(x, y), label=labels, angle=90)
Вот основной пример того, как мои данные отформатированы:
MaskID x y
0 ABC Name1 0
1 ABC Name2 0
2 ABC Name3 1
3 ABC Name4 0
.. ... ... ...
100 DEF Name1 0
101 DEF Name2 0
102 DEF Name3 3
103 DEF Name4 4
104 DEF Name5 0
Вот примерный график (опубликованный @nongkrong из моего предыдущего вопроса):
Скажем, вместо того, чтобы мои тики были в алфавитном порядке от Name1 до Name5, я хочу, чтобы мои тики были в любом произвольном порядке.Пример: Имя2, Имя1, Имя4, Имя3, Имя5
При изменении порядка тиков (для большего набора данных), как бы вы центрировали текстовые метки, если порядок не алфавитный?
1 ответ
Это должно быть просто изменить порядок данных перед получением меток. Попробуй это,
## Reorder bars as in the example
df$x <- factor(df$x, levels=paste0("Name", c(2:1,4:3,5)))
## This is all the same
p <- ggplot(df, aes(x, y))
p <- p + xlab("xlabel")
p <- p + ylab("ylabel")
p <- p + ggtitle("ylabel vs xlabel")
p <- p + geom_bar(stat="identity", aes(fill=MaskID))
p <- p + theme(axis.text.x = element_text(angle=90, vjust=-0.005, hjust=1))
dd <- ggplot_build(p)[[1]][[1]]
## *** Remove the part about converting to character ***
## The same
xy <- unique(dd[dd$y != 0, c("x", "y")])
dat <- with(xy, data.frame(
x=x,
y=unlist(sapply(split(y, x), function(z) diff(c(0, z))/2 + head(c(0, z), -1)))
))
## Order by factor
df <- df[order(df$x), ]
labels <- with(df[df$y!=0,], unlist(split(as.character(MaskID), x)))
p <- p + geom_text(data=dat, aes(x, y), label=labels, angle=90)
p