2017-09-08 225 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