动态条件颜色ggplot for geom_bar

时间:2017-09-08 15:47:53

标签: r ggplot2

我的数据因不同公司而异,这些公司可能有不同数量的相关“措施”。如果测量值低于基准测试值,则应将其设置为粉红色的某种颜色。如果度量高于基准,则应为蓝色。问题是,不同的公司有不同数量的措施,这些措施可能低于或高于基准;没有模式。

我在填充中使用这个条件,它有时会起作用。

ggplot(df, aes(measure)) + geom_col(aes(y=company, fill=overall > company)) + geom_point(aes(y=overall, color="overall"), size=8, shape=124) +
  scale_color_manual("",values=c("company" = "yellow", "overall"="blue"),labels=c("company" = "Your Company", "overall"= "Overall Benchmark")) +
  coord_flip()+ guides(size=FALSE) + theme(legend.box="horizontal",legend.key=element_blank(), legend.title=element_blank(),legend.position="top") +
  scale_fill_manual(values=c("lightblue2", "lightpink2"),labels=c("Better","Worse"))

但是,例如,如果数据框看起来像这样,它就完全关闭了:

 df = data.frame(
      measure = c("Measure A","Measure B","Measure C","Measure D"),
      overall = c(9, 5, 11, 19),
      company = c(4,3,7, 16)
    )

enter image description here

如果数据框看起来像这样,那很好:

df2 = data.frame(
  measure = c("Measure A","Measure B", "Measure C"),
  overall = c(9, 5, 11),
  company = c(11,7, 9)
)

enter image description here

我认为这种方法并不能准确地为条纹着色,但我不确定为什么会这样。

1 个答案:

答案 0 :(得分:2)

请尝试以下方法:

library(dplyr)

ggplot(df %>%
         mutate(fill = ifelse(overall > company, "Worse", "Better")), aes(measure)) + 
  geom_col(aes(y=company, fill=fill)) + 
  geom_point(aes(y=overall, color="overall"), size=8, shape=124) +
  coord_flip()+ guides(size=FALSE) + 
  theme(legend.box="horizontal",legend.key=element_blank(), 
        legend.title=element_blank(),legend.position="top") +
  scale_fill_manual(values=c("Better" = "lightblue2", "Worse" = "lightpink2"))

解释:如果没有指定与每个值相关联的填充颜色,当您有不同的填充值时,您将遇到此问题。

在第二种情况下,overall > company评估为c(FALSE, TRUE, TRUE)的3项指标。第一个唯一值(FALSE)映射为浅蓝色/“更好”,而第二个(TRUE)映射为浅粉色/“更糟”。

在您的第一种情况下,overall > company评估为c(TRUE, TRUE, TRUE),因此TRUE被映射为淡蓝色/“更好”,因为浅蓝色/“更好”首先按顺序排列。没有什么映射到浅粉色/“更糟”,因为只有一个填充值。

此版本在源数据中明确创建填充变量,标签为“Better”/“Worse”,&使用scale_fill_manual中的命名向量将每个标签与适当的颜色相关联。它将适用于您的示例中的两种情况。