R ggplot,当遇到相同的值时,重新排序功能会混淆标签的颜色代码

R ggplot, reorder function mess color code of labels when confronted to same value

我对 ggplot 和彩色标签有疑问

#example data:

names<-c("a","albert","aline","d","francis")
value<-c(11,10,9,9,21)
c<-c("black","red","red","black","red")

df<-data.frame(names,value,color)

我正在尝试制作一个非常简单的条形图,带有彩色标签(此处为具有名字的示例标签)。它是这样做的:

p<-ggplot(data=df, aes(x=reorder(names,value), y=value)) +
  geom_bar(stat="identity")
p+ coord_flip()+
  theme(axis.text.y = element_text(hjust = 1,colour =  reorder(c, value) ))

plot

“d”变成了红色,而不是“aline”。看起来像这样,当遇到相同的值时,reorder 函数会按字母顺序倒序对名称进行排序。但是,在对颜色进行排序时,该功能似乎无法正常工作,因为它没有为正确的标签着色。

我是这么认为的,因为如果您将“aline”更改为“eric”(将字母顺序更改为“d”),它会以正确的方式工作。

names<-c("a","albert","eric","d","francis")
value<-c(11,10,9,9,21)
c<-c("black","red","red","black","red")

df<-data.frame(names,value,color)
p<-ggplot(data=df, aes(x=reorder(names,value), y=value)) +
  geom_bar(stat="identity")
p+ coord_flip()+
  theme(axis.text.y = element_text(hjust = 1,colour =  reorder(c, value) ))

我希望这很清楚,如果有人知道如何解决这个问题,我们非常欢迎您

根据@MonJeanJean 的建议,我冒昧地重命名了一些对象。

names <- c("a", "albert", "aline", "d", "francis")
value <- c(11, 10, 9, 9, 21)
colvec <- c("black", "red", "red", "black", "red")

dat <- data.frame(names, value, colvec)

问题出在函数reorder:应用于颜色,只有当每个条只有一种颜色时它才会起作用。以下将适用于您的示例:

ggplot(data = dat, aes(x = reorder(names, value), y = value, fill = I(colvec))) +
  geom_col() + 
  coord_flip() +
  theme(axis.text.y = element_text(colour = colvec[order(value)]))

不真正支持通过主题元素的矢量化输入来更改标签的颜色。相反,可以使用 ggtext 包来标记带有(一些)html 标签的文本。

library(ggplot2)
library(ggtext)

names<-c("a","albert","aline","d","francis")
value<-c(11,10,9,9,21)
color<-c("black","red","red","black","red")

df<-data.frame(names,value,color)
df$xlabel <- glue::glue("<span style='color:{color}'>{names}</span>")

ggplot(data=df, aes(x=reorder(xlabel,value), y=value)) +
  geom_bar(stat="identity") +
  theme(axis.text.x = element_markdown())

reprex package (v0.3.0)

于 2021-10-05 创建