Ggplot2 Масштабирование цвета по сравнению с выбросами

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

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

Я открыт для любого решения 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" также не делает трюк.

Благодарим за помощь!

Ответ 1

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

#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. Таким образом, вы можете указать несколько отдаленных групп точек.

Ответ 2

Из моего комментария см.? 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

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

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

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

Другим простым способом справиться с ними было бы их ограничение:

ДФ $Value [DF $Value > 1300] = 1300

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