Try quoting the minus sign after the superscript operator:
ggplot(df, aes(x=x, y=y))+ geom_point(size=4)+ labs(x=expression(Production~rate~" "~mu~moles~NO[3]^{"-"}-N~Kg^{-1}), y=expression(Concentration~mg~L^{-1})) + theme(legend.title = element_text(size=12, face="bold"), legend.text=element_text(size=12), axis.text=element_text(size=12), axis.title = element_text(color="black", face="bold", size=18))
I think that from a scientific point of view, it is more accurate to use the %.% Operator between blocks:
+ labs(x=expression(Production~rate~" "~mu~moles~NO[3]^{textstyle("-")}-N %.% Kg^{-1}), y=expression(Concentration~mg~L^{-1})) +
textstyle should not allow the size of superscript to be reduced. I'm also not sure why you have a " " between two tildes. You can link a whole bunch of tildes to increase the "spaces":
ggplot(df, aes(x=x, y=y))+ geom_point(size=4)+ labs(x=expression(Production~rate~~~~~~~~~~~~mu~moles~NO[3]^{textstyle("-")}-N %.% Kg^{-1}), y=expression(Concentration~mg~L^{-1})) + theme(legend.title = element_text(size=12, face="bold"), legend.text=element_text(size=12), axis.text=element_text(size=12), axis.title = element_text(color="black", face="bold", size=18))

And a bonus conspiracy tip: quoting numbers is a way around the documented difficulty of creating italic numbers using a conspiracy. (Using italic(123) fails, but italic("123") does.)
source share