ggplot2 На цветовую шкалу влияют выбросы

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

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

Я открыт для любого решения ggplot, но в идеале более низкие значения были бы красным, средним белым и более высоким синим (низкие - это плохо). В моем собственном наборе данных дата является фактической датой с 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" тоже не помогает.

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


person ARobertson    schedule 21.03.2012    source источник
comment
Мой обходной путь заключался в использовании логарифмической шкалы (или чего-то подобного) для раскрашивания, когда у меня есть выбросы. Однако я хотел бы знать, есть ли способ лучше!   -  person Justin    schedule 22.03.2012
comment
Да, я пробовал это, но для этого примера он все еще не работает. Надеюсь, появится лучший способ!   -  person ARobertson    schedule 22.03.2012
comment
Вы можете использовать? Cut, чтобы создать другую переменную для ваших предпочтительных разрывов, а затем установить эстетику color= для этой переменной.   -  person Brandon Bertelsen    schedule 22.03.2012


Ответы (3)


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

#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))

введите описание изображения здесь

Таким образом, сложная часть здесь заключается в использовании fill по точкам, чтобы убедить ggplot создать еще одну легенду. Очевидно, вы можете настроить это с помощью разных меток и цветов для шкалы заливки.

Еще одна вещь, читая ответ Брэндона. В принципе, вы могли бы объединить оба подхода, взяв выпадающие значения, используя cut, чтобы создать для них отдельную категориальную переменную, а затем использовать мой трюк со шкалой fill. Таким образом вы можете указать несколько удаленных групп точек.

person joran    schedule 21.03.2012

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

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")
person Brandon Bertelsen    schedule 21.03.2012
comment
В этом случае мне пришлось бы передать непрерывно выглядящие цвета дискретной переменной с помощью scale_color_manual, верно? Я получаю дискретную окраску, что неплохо, просто наблюдение. - person ARobertson; 26.03.2012
comment
Да, в соответствии с вашим исходным вопросом (красный - ›белый -› синий). Попробуйте что-нибудь вроде + scale_colour_manual (values ​​= c (красный, белый, синий)). См. Более эффективные палитры здесь: learnr.wordpress.com/ 2009/04/15 / Я думаю, что обозначение цветовой палитры подойдет вам лучше всего. Просто помните, что вам нужен цвет для каждого разрыва, который вы создаете с помощью разреза. Его несложно подделать, чтобы он казался непрерывным, с небольшим умным использованием поддонов. - person Brandon Bertelsen; 27.03.2012

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

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

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

Другой простой способ справиться с ними - ограничить их:

Значение df $ [значение df $> 1300] = 1300

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

person Chris Beeley    schedule 22.03.2012