R 如何根据条的填充深度控制标签颜色?

R 如何根据条的填充深度控制标签颜色?,r,ggplot2,R,Ggplot2,我有一个堆叠的条形图,标有geom\u text。为了增加标签的可见性,我想根据其背景的“暗度”(即条形图的填充颜色)将标签颜色设置为白色或黑色。因此,较暗的条应该有白色标签,较亮的条应该有黑色标签 我从问题的代码开始,这个问题的答案。最重要的是,我想用“白色”或“黑色”显示数据值的标签,这取决于堆叠的条形图填充颜色是否分别为深色 我试了两次。第一种方法是使用geom_text函数的aes(color=…),但是这个函数失败了。。。为什么 第二次尝试是使用功能缩放\u颜色\u手册。但这里的堆叠条

我有一个堆叠的条形图,标有
geom\u text
。为了增加标签的可见性,我想根据其背景的“暗度”(即条形图的填充颜色)将标签颜色设置为白色或黑色。因此,较暗的条应该有白色标签,较亮的条应该有黑色标签

我从问题的代码开始,这个问题的答案。最重要的是,我想用“白色”或“黑色”显示数据值的标签,这取决于堆叠的条形图填充颜色是否分别为深色

我试了两次。第一种方法是使用
geom_text
函数的
aes(color=…)
,但是这个函数失败了。。。为什么

第二次尝试是使用功能
缩放\u颜色\u手册
。但这里的堆叠条线也使用黑色或白色切换设置“着色”

library(ggplot2)
library(RColorBrewer)

Year      <- c(rep(c("2006-07", "2007-08", "2008-09", "2009-10"), each = 4))
Category  <- c(rep(c("A", "B", "C", "D"), times = 4))
Frequency <- c(168, 259, 226, 340, 216, 431, 319, 368, 423, 645, 234, 685, 166, 467, 274, 251)
Data      <- data.frame(Year, Category, Frequency)

isDark <- function(color) {
  (sum(grDevices::col2rgb(color) *c(299, 587,114))/1000 < 123)
}

## control the color assignments
paletteName <- 'Set1' # 'Dark2'
colorsPerCat <- brewer.pal(name=paletteName,n=4)
names(colorsPerCat) <- c("A", "B", "C", "D")

## First attempt
Data$LabelColor <- as.character(as.vector(sapply(unlist(colorsPerCat)[Data$Category], function(color) { if (isDark(color)) 'white' else 'black' })))
Data
p <- ggplot(Data, aes(x = Year, y = Frequency, fill = Category, label = Frequency)) +
  geom_bar(stat = "identity") +
  geom_text(aes(colour=LabelColor), size = 3, position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = colorsPerCat)
p

## Second attempt
labelColoursPerCat <- sapply(as.vector(colorsPerCat), function(color) { if (isDark(color)) 'white' else 'black' })
names(labelColoursPerCat) <- c("A", "B", "C", "D")
p <- ggplot(Data, aes(x = Year, y = Frequency, fill = Category, label = Frequency, colour = Category)) +
  geom_bar(stat = "identity") +
  geom_text(size = 3, position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = colorsPerCat) +
  scale_colour_manual(values = labelColoursPerCat)
p
库(ggplot2)
图书馆(RColorBrewer)

年份通过使用
geom_bar
颜色或大小来解决此问题的两种方法:

Data$LabelColor <- as.factor(Data$LabelColor)
p <- ggplot(Data, aes(x = Year, y = Frequency, fill = Category, label = Frequency, colour = LabelColor)) +
              geom_bar(stat = "identity", color = "black") +
              geom_text(size = 3, position = position_stack(vjust = 0.5)) +
              scale_fill_manual(values = colorsPerCat) +  
              scale_colour_manual(values = levels(Data$LabelColor)) +
              guides(colour = FALSE)

Data$LabelColor
p+scale\u color\u identity()
?您也可以给due@Henrik Sorry yes忘了:)@Henrik我不太明白scale\u color\u identity是什么意思。当我在“首次尝试”中查看您的“数据”时,您似乎已经在变量(“LabelColor”)中获得了用于
geom\u text
的实际颜色(“也就是说,它已经代表了ggplot2可以直接处理的美学价值”;来自
?比例\u颜色\u标识
)。另请参见和
Data$LabelColor <- as.factor(Data$LabelColor)
p <- ggplot(Data, aes(x = Year, y = Frequency, fill = Category, label = Frequency, colour=LabelColor)) +
              geom_bar(stat = "identity", size = 0) +
              geom_text(size = 3, position = position_stack(vjust = 0.5)) +
              scale_colour_manual(values = levels(Data$LabelColor)) +
              scale_fill_manual(values = colorsPerCat) +  
              guides(colour = FALSE)