I’m using the jbryer/likert package to plot Likert data.
Consider the response table, called items—here, A, B, and so on are the column names, not part of the data:
A B C D
5 4 5 4
3 3 3 4
2 2 2 2
2 2 2 3
5 3 6 7
3 3 5 4
And the following code:
choices = c("Very low", "Low", "Rather low", "Neither low nor high", "Rather high", "High", "Very high")
for(i in 1:ncol(items)) {
items[,i] = factor(items[,i], levels=1:7, labels=choices, ordered=TRUE)
}
Now, we transform this into the likert data and plot it, which overrides the built-in plot function with one that uses ggplot:
plot(likert(items), ordered=FALSE)
This gives me:

Cool. All ordered. But A, B, etc. are not meaningful as descriptors for the conditions, and I’d like to override them:
names(items) = c("LT", "ST", "SemTag", "SemTagContext")
Which gives me the wrong order:

See how ST comes first, although it’s the name for B? My ordering got changed to B, D, C, A.
How can I make it preserve the order and return the bars in D, C, B, A—or, with my new group names: SemTagContext, SemTag, ST, LT?
Note: The data table above is shortened. The bar widths in the plot don’t reflect this short data example, but the full dataset I have. The problem is the same though.
I decided to re-implement this myself, as jon suggested:
This produces the correct order: