2017-09-08 186 views
0

我有不同的公司,他们可能有不同数量的相关“措施”的数据。如果某项指标低于基准值,则应该为我设定为粉红色的某种颜色着色。如果某项指标高于基准,则应该用蓝色表示。问题是,不同的公司有不同的措施数量,这些措施可能会低于或高于基准;没有模式。geom_bar的动态条件颜色ggplot

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

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

我认为这种方法并不能准确地为酒吧上色,但我不确定为什么。

回答

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是被映射为淡蓝色/“更好”,因为淡蓝色/“更好”是第一位的顺序。由于只有一个填充值,因此没有任何内容映射为浅粉色/“较差”。

该版本在源数据中明确创建一个填充变量,标签为“更好”/“更差”,&使用scale_fill_manual中的命名向量将每个标签与适当的颜色相关联。它将在你的例子中适用于这两种情况。

+0

我没意识到你可以在ggplot中改变数据。感谢您深入解释为什么我所做的没有奏效。 – PinkyL