Another tool specifically designed for this purpose is likert() in the HH package. This sweet feature displays diverging stacked bar charts suitable for Likert data, semantic differential and rating.
library(HH) # note use of t(test)[,4:1] to transpose and mirror dataframe for easy plotting # test dataframe is otherwise unaltered from OP question likert(t(test)[,4:1], horizontal = FALSE, main = NULL, # or give "title", xlab = "Percent", # becomes ylab due to horizontal arg auto.key = list(space = "right", columns = 1, reverse = TRUE))

One particularly attractive feature of likert() is the ability to center a neutral response using the ReferenceZero argument. (Note how it uses the appropriate gray color for the reference response):
likert(t(test)[,4:1], horizontal=FALSE, main = NULL, # or give "title", xlab = "Percent", # becomes ylab due to horizontal arg ReferenceZero = 3, auto.key=list(space = "right", columns = 1, reverse = TRUE))

(These examples use vertical columns, as usual, but horizontal=TRUE is often better, especially if you want to include question or scale names.)
source share