2012-03-21 30 views
10

我遇到了一些異常情況,使色標無用。ggplot2色差過大受異常值影響

我的數據有一個長度變量,它基於一個範圍,但通常會有一些更大的值。以下示例數據具有500到1500之間的95個值,以及50,000以上的5個值。當我想看到500到1500之間的顏色變化時,結果顏色圖例傾向於使用10k,20k,... 70k作爲顏色變化。實際上,大約1300以上的任何應該是相同的純色(可能是中值+/-瘋狂),但我不知道在哪裏定義。

我打開任何ggplot解決方案,但理想情況下較低的值將是紅色,中間白色和更高的藍色(低是壞)。在我自己的數據集中,日期是ggplot aes()中as.POSIXct()的實際日期,但似乎不影響該示例。

#example data 
date <- sample(x=1:10,size=100,replace=T) 
stateabbr <- sample(x=1:50,size=100,replace=T) 
Length <- c(sample(x=500:1500,size=95,replace=T),60000,55000,70000,50000,65000) 
x <- data.frame(date=date,stateabbr=stateabbr,Length=Length) 

#main plot 
(g <- ggplot(data=x,aes(x=date,y=factor(stateabbr))) + 
    geom_point(aes(color=as.numeric(as.character(Length))),alpha=3/4,size=4) + 
    #scale_x_datetime(labels=date_format("%m/%d")) + 
    opts(title="Date and State") + xlab("Date") + ylab("State")) 

#problem 
g + scale_color_gradient2("Length",midpoint=median(x$Length)) 

添加trans =「log」或「sqrt」也不完全有效。

謝謝你的幫助! ?

+0

我的解決方法是使用日誌比例(或類似的東西)着色,當我有異常值時。但是,我很想知道是否有更好的方法! – Justin 2012-03-21 20:05:19

+0

是的,我曾嘗試過,但這個例子仍然沒有。希望有更好的方法出現! – ARobertson 2012-03-21 20:14:52

+0

你可以使用?cut來創建另一個變量到你的優先休息區,然後將'color ='美學設置爲該變量。 – 2012-03-21 20:36:10

回答

8

這裏有一個稍微棘手的選擇:

#Create a new variable indicating the unusual values 
x$Length1 <- "> 1500" 
x$Length1[x$Length <= 1500] <- NA 

#main plot 
# Using fill - tricky! 
g <- ggplot() + 
    geom_point(data = subset(x,Length <= 1500), 
      aes(x=date,y=factor(stateabbr),color=Length),size=4) + 
    geom_point(data = subset(x,Length > 1500), 
      aes(x=date,y=factor(stateabbr),fill=Length1),size=4)+ 
    opts(title="Date and State") + xlab("Date") + ylab("State") 

#problem 
g + scale_color_gradient2("Length",midpoint=median(x$Length)) 

enter image description here

所以這裏的棘手的部分是在點使用fill,爲了說服ggplot做出另一個傳奇。顯然,您可以用填充比例的不同標籤和顏色對其進行定製。

還有一件事,閱讀布蘭登的答案。原則上,您可以通過採用偏離值來結合兩種方法,使用cut爲它們創建單獨的分類變量,然後使用我的技巧和fill比例。這樣你可以指出多個離羣點。

6

從我的意見,看切

x$colors <- cut(x$Length, breaks=c(0,500,1000,1300,max(x$Length))) 

g <- ggplot(data=x,aes(x=date,y=factor(stateabbr),color=colors)) + 
    geom_point() + 
    opts(title="Date and State") + 
    xlab("Date") + 
    ylab("State") 
+0

在這種情況下,我將不得不使用scale_color_manual向離散變量提供「連續看」的顏色,對吧?我得到了離散的着色,這並不壞,只是一個觀察。 – ARobertson 2012-03-26 18:26:48

+0

是的,以適應您的原始問題(紅色 - >白色 - >藍色)。嘗試像+ scale_colour_manual(values = c(「red」,「white」,「blue」))。在這裏看到更有效的托盤:http://learnr.wordpress.com/2009/04/15/ggplot2-qualitative-colour-palettes/我認爲colourspace托盤指定可能最適合您的需求。請記住,您需要使用剪輯創建的每個中斷的顏色。假裝它並不難,所以它看起來是連續的,有一些聰明的調色板用法。 – 2012-03-27 06:14:38

+0

聽起來不錯,謝謝! – ARobertson 2012-03-27 13:54:02

3

擺脫異常值。我知道,快速和骯髒,但我認爲這是值得說。你總是可以在你的文字中描述它們。爲什麼讓他們毀了你的分析和圖表?

有一個在這篇博客文章與道德消除異常交易中引用的論文:

http://psuc2f.wordpress.com/2011/10/14/is-it-dishonest-or-unethical-to-remove-outliers/

與他們打交道的另一種簡單的方法是將封頂他們:

DF $值[DF $ Value> 1300] = 1300

同樣,你可以描述你在文本中做了這個或者甚至只是編輯比例來說1300+而不是1300