ggplot2 Цветовая шкала, на которую влияют выбросы - PullRequest
11 голосов
/ 21 марта 2012

У меня проблемы с несколькими выбросами, делающими цветовую шкалу бесполезной.

Мои данные имеют переменную длины, которая основана на диапазоне, но обычно будет иметь несколько гораздо больших значений.Приведенные ниже примерные данные имеют 95 значений от 500 до 1500 и 5 значений более 50000.Получающиеся цветные легенды имеют тенденцию использовать 10k, 20k, ... 70k для изменения цвета, когда я хочу видеть изменения цвета между 500 и 1500. Действительно, все, что больше 1300, должно быть одного и того же сплошного цвета (вероятно, медиана +/- без), но я не знаю, где это определить.

Я открыт для любого решения ggplot, но в идеале более низкие значения должны быть красным, средним белым и более высоким синим (низкий - плохо).В моем собственном наборе данных date является фактической датой с as.POSIXct () в ggplot aes (), но, похоже, не влияет на пример.

#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 "тоже не совсем справляется.

Спасибо за вашу помощь!

Ответы [ 3 ]

9 голосов
/ 22 марта 2012

Вот несколько хитрых вариантов:

#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 голосов
/ 22 марта 2012

Из моего комментария видите? Cut

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")
3 голосов
/ 22 марта 2012

Избавьтесь от выбросов.Я знаю, быстро и грязно, но, думаю, стоило сказать.Вы всегда можете описать их в своем тексте.Зачем позволять им испортить ваши анализы и графики?

В этом сообщении есть ссылка на статью, посвященную этическому устранению выбросов:

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

Еще один простой способ справитьсяс ними было бы ограничить их:

df $ Value [df $ Value> 1300] = 1300

Опять же, вы можете описать, что вы сделали это в тексте или даже просто отредактировать масштабсказать 1300+ вместо 1300

...