Add labels to likert scale ggplot graph

2019-09-10 11:10发布

问题:

I'd like to add labels to a likert scale manually made plot. However, when I try to add labels, I only get some values in the right side/position, as show in the figure. Why it's not working?

Packages:

   library(dplyr)
    library(tidyr)
    library(ggplot2)
    library(scales)

Data example:

Servicos <- read.table(text="Serviços, Muito, Pouco, Nunca, NS/NR
A,.513,.328,.081, .078
B,.387,.423,.109,.081
C, .301, .384, .209, .105
D, .355, .344, .204, .097
E,  .317, .412, .191, .080
F, .092, .474, .341, .093", sep=",", header=TRUE, stringsAsFactors=FALSE)


  Servicos %>%
        gather(Response, percent, -Serviços) -> likert


    likert %>%
        filter(Response=="NS.NR") %>%
        arrange(desc(percent)) %>% .$Serviços -> ind_order


    likert %>%
        mutate(Serviços=factor(Serviços, levels=ind_order, ordered=TRUE)) %>%
        mutate(Response=factor(Response,
                               levels=c("Muito", "Pouco", "Nunca", "NS.NR"), ordered=TRUE,
                               labels=c("Muito", "Pouco", "Nunca", "NS/NR"))) %>%
        mutate(percent=ifelse(Response %nin% c("Muito", "Pouco", "NS/NR"), -percent, percent)) -> lik

The plot:

gg <- ggplot()
gg <- gg + geom_hline(yintercept=0)
gg <- gg + geom_bar(data=filter(lik, percent<0), width=.75,
                    stat="identity", position="stack",
                    aes(x=Serviços, y=percent, fill=Response))
gg <- gg + geom_bar(data=filter(lik, percent>=0), width=.75,
                    stat="identity", position="stack",
                    aes(x=Serviços, y=percent, fill=Response))
gg <- gg + geom_text(data=filter(lik, percent<0), aes(x=Serviços, y=percent, group=Response,label = percent))
gg <- gg + scale_x_discrete(expand=c(0, .75))
gg <- gg + scale_fill_manual(values=c( "#4393c3", "#92c5de","#b2182b", "gray"),
                             drop=FALSE)
gg <- gg + scale_y_continuous(expand=c(0,.10),
                              breaks=seq(-.35, 1, .25),
                              limits=c(-.35, .95),
                              labels=percent_format())
gg <- gg + coord_flip()
gg <- gg + theme_bw()
gg <- gg + theme(axis.ticks=element_blank())
gg <- gg + theme(panel.border=element_blank())
gg <- gg + theme(panel.grid.major.y = element_blank()) 
gg <- gg + theme(panel.grid=element_blank())
gg

回答1:

Building upon mpalanco's partially answer, you can work around of this using two different lines for geom_text:

gg <- gg + geom_text(data=filter(lik, percent<0), aes(x=Serviços, y = percent, group=Response,label = paste(percent*100, "%")), position = "stack", hjust = -.2, size = 2.5, color="white")

gg <- gg + geom_text(data=filter(lik, percent>0), aes(x=Serviços, y = percent, group=Response,label = paste(percent*100, "%")), position = "stack", hjust = 1, size = 2.5)



回答2:

To show percent values add label = paste(percent*100, "%") in the line:

gg <- gg + geom_text(data=filter(lik, percent<0), aes(x=Serviços, y=percent, group=Response,label = paste(percent*100, "%")))



标签: r ggplot2