根据条件在ggplot中分配标签颜色会返回意外(和不正确)结果

时间:2016-04-14 16:33:39

标签: r ggplot2 axis-labels

真的很奇怪,如果我尝试根据满足的条件分配轴标签的颜色,返回的图标的轴标签颜色与标准不符。

例如

 p <- ggplot(mtcars, aes(x=as.factor(cyl), y=mpg)) + 
  geom_boxplot() 
p +  theme(axis.text.x = element_text(color = ifelse(mtcars$cyl==4, "red", "black"), angle = 90, hjust = 1))

返回一个框图,其中&#34; 8&#34;被标记为红色,&#34; 4&#34;和&#34; 6&#34;是黑色的。但是,如果我在任何情况下都设置了不正确的条件,例如:

p <- ggplot(mtcars, aes(x=as.factor(cyl), y=mpg)) + 
  geom_boxplot() 
p +  theme(axis.text.x = element_text(color = ifelse(mtcars$cyl=="something", "red", "black"), angle = 90, hjust = 1))

所有标签均为黑色。

如果我选择一个他们都满足的条件,它们都是红色的,例如:

p <- ggplot(mtcars, aes(x=as.factor(cyl), y=mpg)) + 
  geom_boxplot() 
p +  theme(axis.text.x = element_text(color = ifelse(mtcars$cyl < 100, "red", "black"), angle = 90, hjust = 1))

然而,只有一些人符合标准,我得到随机结果。

p <- ggplot(mtcars, aes(x=as.factor(cyl), y=mpg)) + 
  geom_boxplot() 
p +  theme(axis.text.x = element_text(color = ifelse(mtcars$cyl < 5, "red", "black"), angle = 90, hjust = 1))

仅返回8为红色,

p <- ggplot(mtcars, aes(x=as.factor(cyl), y=mpg)) + 
  geom_boxplot() 
p +  theme(axis.text.x = element_text(color = ifelse(mtcars$cyl < 7, "red", "black"), angle = 90, hjust = 1))

将所有这些都返回为红色。

有谁知道发生了什么?!任何帮助将非常感激。

2 个答案:

答案 0 :(得分:4)

请注意,您的输入数据包含许多元素,而比例只包含三个元素,与您的数据级别相对应。

因此,您必须将向量传递给长度为3的scale_x_discrete,而不是数据的长度。

breaks <- levels(as.factor(mtcars$cyl))
colours <- ifelse(breaks == 4, "red", "blue")

ggplot(mtcars, aes(x=as.factor(cyl), y=mpg)) + 
  geom_boxplot() +
  scale_x_discrete("Cyl", breaks = breaks) +
  theme(axis.text.x = element_text(color = colours, size = 16))

enter image description here

答案 1 :(得分:1)

您的ifelse正在检查整个mtcars$cyl向量,其值为:

`[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4`

因此,它返回值(对于第一个示例):

 [1] "black" "black" "red"   "black" "black" "black" "black" "red" "red" "black" "black" "black" "black" "black" "black" "black" "black" "red"  

[19] "red"   "red"   "red"   "black" "black" "black" "black" "red"   "red"   "red"   "black" "black" "black" "red"

然后element_text color参数按顺序使用它们。它没有按照您的预期进行,即检查轴上x的值。要做到这一点,请在单独的步骤中生成颜色,然后将它们传递给element_text参数(@Andrie在其他答案中做得很好。)