2011-12-12 29 views
2

無需添加額外的列到data.frame,有一個內置的方式來突出最小/最大吧?在下面的例子中,我希望Joe欄爲綠色(最大),John杆爲紅色(最小)。GGPLOT2 - 亮點最小/最大欄

我敢肯定,這已被問過,但搜索時,我找不到:

data= data.frame(Name = c("Joe","Jane", "John") , Value = c(3,2,1)) 
ggplot(data=data)+geom_bar(aes_string(x="Name",y="Value"), stat="identity") 

回答

4

您可以使用子集:

p <- ggplot(data=data)+ 
    geom_bar(aes(x=Name, y=Value), stat="identity") + 
    geom_bar(data=subset(data, Value==min(Value)), aes(Name, Value), 
       fill="red", stat="identity") + 
    geom_bar(data=subset(data, Value==max(Value)), aes(Name, Value), 
       fill="green", stat="identity") 
print(p) 

ggplot2 output

+0

+1的偉大工程!非常感謝 – SFun28

1

在這裏你去

ggplot(data, aes(Name, Value)) + 
geom_bar(stat = 'identity') + 
geom_bar(stat = 'identity', aes(fill = factor(Value)), 
    subset = .(Value %in% range(Value))) +  
scale_fill_manual(values = c('red', 'green')) 
+0

酷使用範圍 – SFun28

1

我想我會用ifelse辦法做這一切一氣呵成:

ggplot(data=data) + 
    geom_bar(aes_string(x="Name",y="Value", fill='factor(ifelse(Value==max(Value), 3, ifelse(Value==min(Value), 2, 1)))'), stat="identity") + 
    scale_fill_manual(values=c('gray20', 'red', 'green'), legend=F) 

enter image description here

+0

感謝,約翰!這似乎工作。 – SFun28

1

通過which.min()which.max()使用邏輯索引這裏有一個選項:

ggplot(data, aes(Name, Value, stat = "identity")) + 
    geom_bar() + 
    geom_bar(data = data[which.min(data$Value),], fill = "red") + 
    geom_bar(data = data[which.max(data$Value),], fill = "green") 
+0

我覺得這個,如果你添加AES(...)和stat =「身份」就像@rcs例如 – SFun28

+0

@ SFun28只會工作 - 我無法找到參考,但在'AES設置的任何值() '會傳遞到每個後續圖層,所以'stat =「identity」'被隱式地提供給每個geom_layer。 – Chase

+0

@ SFun28 - 這也是爲什麼我們沒有通過'Name'和'Value'明確。 – Chase