2011-12-12 2 views
2

data.frame에 추가 열을 추가하지 않으면 최소/최대 막대를 강조 표시하는 기본 제공 방법이 있습니까? 다음 예제에서는 Joe 막대가 녹색 (최대)으로, John 막대가 빨간색 (최소)으로 표시되도록하고 싶습니다.ggplot2 - min/max bar 강조 표시

나는이 전에 요청 된 확신하지만, 검색 할 때 나는 찾을 수 없습니다 : 여기

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

답변

4

당신은 부분 집합 사용할 수 있습니다

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

당신이가는 :

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") 
+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

@ acs()와 같이 aes (...)와 stat = "Identity"를 추가하는 경우에만 작동한다고 생각합니다. – SFun28

+0

@ SFun28 - 참조를 찾을 수 없지만'aes() '는 각 후속 레이어로 전달되므로 각 geom_layer에'stat = "identity"'가 암시 적으로 제공됩니다. – Chase

+0

@ SFun28 - 우리는'Name'과'Value'를 명시 적으로 전달할 필요가 없었습니다. – Chase