Это трудно воспроизвести без набора данных, но использование reorder
в вашем операторе aes(
должно сработать (учитывая, что под "отдельным" вы подразумеваете группирование их вместе по оси x):
library(ggplot2)
city_summary$colour<-ifelse(city_summary$x < 0, "Negative","Positive")
city_summary$hjust<-ifelse(city_summary$x >0,1.3,-0.3)
p1<-ggplot(city_summary, aes(x= reorder(City, x) , y=x, label="",hjust=hjust))+
geom_text(aes(y=0,colour=colour))+
geom_bar(stat = "identity", position = "identity", aes(fill=colour))+
scale_fill_manual(values = c(Positive="steelblue1",Negative="firebrick1"))
p1