ggplot2 中的中心和偏移标签
Centre and offset labels in ggplot2
我已经画好了,但是我有两个问题需要帮助。
问题 1)
如何使条形的每个部分的标签居中?
在寻找解决方案时,我尝试更改行:
geom_text(aes(label= paste(round(pct),"%")), color = "white", size=2.6, position="fill", stat="identity")
到
geom_text(aes(label= paste(round(pct),"%")), color = "white", size=2.6, position=position_stack(vjust = 0.5))
这会将标签放在正确的位置,但现在彩色条不是 printet。
问题2)
要用到地块的地方,会像这张图一样窄:。
有没有自动处理重叠标签的方法?另一个有用的解决方案可能是偏移所有其他标签,以便第一个标签位于条形中间上方,第二个标签位于中间下方(我希望这是有道理的)。也欢迎其他解决方案。
重现情节的代码:
library(ggplot2)
exdata <- structure(list(Var1 = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L,
4L), .Label = c("Meget ofte", "Ofte", "Nogle gange", "Aldrig eller næsten aldrig"
), class = "factor"), Freq = c(4L, 16L, 50L, 38L, 6L, 5L, 55L,
43L), spm = c("Question 1: aaaaaabbbbbbbbbcccccc", "Question 1: aaaaaabbbbbbbbbcccccc",
"Question 1: aaaaaabbbbbbbbbcccccc", "Question 1: aaaaaabbbbbbbbbcccccc",
"Question 2: aaaaaabbbbbbbbbcccccc", "Question 2: aaaaaabbbbbbbbbcccccc",
"Question 2: aaaaaabbbbbbbbbcccccc", "Question 2: aaaaaabbbbbbbbbcccccc"
), pct = c(3.7037037037037, 14.8148148148148, 46.2962962962963,
35.1851851851852, 5.5045871559633, 4.58715596330275, 50.4587155963303,
39.4495412844037)), row.names = 21:28, class = "data.frame")
palette1 <- c("#00ABA4", "#008983", "#006763", "#004543")
plot1 <- ggplot(data=exdata, aes(y=Freq, x=spm, fill= fct_rev(Var1))) +
geom_bar(position="fill", stat="identity") +
scale_fill_manual(values=c(palette1)) +
geom_text(aes(label= paste(round(pct),"%")), color = "white", size=2.6, position="fill", stat="identity") +
coord_flip() +
labs(fill = "Svar") +
labs(title = "Hvor often do you do these things?") +
ylab("Percentage") +
xlab("Question") +
theme(legend.position="bottom", legend.title=element_text(size=10)) +
guides(fill =guide_legend(reverse = TRUE,nrow=2,byrow=TRUE))
plot1
您可以尝试使用 ggrepel
包中的 geom_text_repel()
。我还建议您切换回 position="fill"
以正确放置标签。需要注意的一点是,您还应该将 vjust=
应用于文本的 position=
调整,就像您尝试使用 position_stack()
.
一样
在没有排斥标签的情况下,它是这样的(请注意,我更改了您的数据,以便标签之间的更多重叠显而易见):
# all code the same except for this line
geom_text(aes(label= paste0(round(pct),"%")),
color = "white", size=2.6, position=position_fill(vjust = 0.5))
和geom_text_repel
,看起来像这样。务必加载 library(ggrepel)
:
geom_text_repel(aes(label= paste0(round(pct),"%")),
direction='y',color = "white", size=2.6,
position=position_fill(vjust = 0.5))
我已经画好了,但是我有两个问题需要帮助。
问题 1)
如何使条形的每个部分的标签居中? 在寻找解决方案时,我尝试更改行:
geom_text(aes(label= paste(round(pct),"%")), color = "white", size=2.6, position="fill", stat="identity")
到
geom_text(aes(label= paste(round(pct),"%")), color = "white", size=2.6, position=position_stack(vjust = 0.5))
这会将标签放在正确的位置,但现在彩色条不是 printet。
问题2)
要用到地块的地方,会像这张图一样窄:
有没有自动处理重叠标签的方法?另一个有用的解决方案可能是偏移所有其他标签,以便第一个标签位于条形中间上方,第二个标签位于中间下方(我希望这是有道理的)。也欢迎其他解决方案。
重现情节的代码:
library(ggplot2)
exdata <- structure(list(Var1 = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L,
4L), .Label = c("Meget ofte", "Ofte", "Nogle gange", "Aldrig eller næsten aldrig"
), class = "factor"), Freq = c(4L, 16L, 50L, 38L, 6L, 5L, 55L,
43L), spm = c("Question 1: aaaaaabbbbbbbbbcccccc", "Question 1: aaaaaabbbbbbbbbcccccc",
"Question 1: aaaaaabbbbbbbbbcccccc", "Question 1: aaaaaabbbbbbbbbcccccc",
"Question 2: aaaaaabbbbbbbbbcccccc", "Question 2: aaaaaabbbbbbbbbcccccc",
"Question 2: aaaaaabbbbbbbbbcccccc", "Question 2: aaaaaabbbbbbbbbcccccc"
), pct = c(3.7037037037037, 14.8148148148148, 46.2962962962963,
35.1851851851852, 5.5045871559633, 4.58715596330275, 50.4587155963303,
39.4495412844037)), row.names = 21:28, class = "data.frame")
palette1 <- c("#00ABA4", "#008983", "#006763", "#004543")
plot1 <- ggplot(data=exdata, aes(y=Freq, x=spm, fill= fct_rev(Var1))) +
geom_bar(position="fill", stat="identity") +
scale_fill_manual(values=c(palette1)) +
geom_text(aes(label= paste(round(pct),"%")), color = "white", size=2.6, position="fill", stat="identity") +
coord_flip() +
labs(fill = "Svar") +
labs(title = "Hvor often do you do these things?") +
ylab("Percentage") +
xlab("Question") +
theme(legend.position="bottom", legend.title=element_text(size=10)) +
guides(fill =guide_legend(reverse = TRUE,nrow=2,byrow=TRUE))
plot1
您可以尝试使用 ggrepel
包中的 geom_text_repel()
。我还建议您切换回 position="fill"
以正确放置标签。需要注意的一点是,您还应该将 vjust=
应用于文本的 position=
调整,就像您尝试使用 position_stack()
.
在没有排斥标签的情况下,它是这样的(请注意,我更改了您的数据,以便标签之间的更多重叠显而易见):
# all code the same except for this line
geom_text(aes(label= paste0(round(pct),"%")),
color = "white", size=2.6, position=position_fill(vjust = 0.5))
和geom_text_repel
,看起来像这样。务必加载 library(ggrepel)
:
geom_text_repel(aes(label= paste0(round(pct),"%")),
direction='y',color = "white", size=2.6,
position=position_fill(vjust = 0.5))