【问题标题】:ggplot2 Color Scale Over Affected by Outliers受异常值影响的ggplot2色标
【发布时间】:2012-04-06 09:35:24
【问题描述】:

我在处理一些异常值时遇到了困难,使色标无用。

我的数据有一个长度变量,它基于一个范围,但通常会有一些更大的值。下面的示例数据有 95 个介于 500 和 1500 之间的值,以及 5 个超过 50,000 的值。当我想看到 500 到 1500 之间的颜色变化时,生成的颜色图例倾向于使用 10k、20k、... 70k 来表示颜色变化。实际上,超过 1300 的任何东西都应该是相同的纯色(可能是中值 +/- mad ),但我不知道在哪里定义。

我对任何 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" 也不是很有效。

感谢您的帮助!

【问题讨论】:

  • 当我有异常值时,我的解决方法是使用对数刻度(或类似的东西)进行着色。但是,我很想知道是否有更好的方法!
  • 是的,我已经尝试过了,但是对于这个例子来说它仍然是关闭的。希望有更好的方法出现!
  • 您可以使用 ?cut 来为您的首选中断创建另一个变量,然后将 color= 美学设置为该变量。

标签: r ggplot2 scale gradient outliers


【解决方案1】:

根据我的评论,请参阅 ?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")

【讨论】:

  • 在这种情况下,我必须使用 scale_color_manual 为离散变量提供“连续外观”颜色,对吗?我得到了离散的颜色,这还不错,只是一个观察。
  • 是的,以适合您的原始问题(红色 -> 白色 -> 蓝色)。尝试像 + scale_colour_manual(values=c("red","white","blue")) 之类的东西。请参阅此处了解更有效的调色板:learnr.wordpress.com/2009/04/15/… 我认为色彩空间调色板名称可能最适合您的需求。请记住,使用 cut 创建的每个中断都需要一种颜色。伪造它并不难,因此它“似乎”是连续的,并使用了一些巧妙的调色板。
【解决方案2】:

这里有一个有点棘手的选项:

#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 比例一起使用。这样您就可以指示多个外围点组。

【讨论】:

    【解决方案3】:

    摆脱异常值。又快又脏,我知道,但我认为值得一说。你总是可以在你的文字中描述它们。为什么要让他们毁了你的分析和图表?

    这篇博文中引用了一篇论文,该论文涉及从道德上去除异常值:

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

    另一种处理它们的简单方法是限制它们:

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

    同样,您可以在文本中描述您是这样做的,甚至只是将比例编辑为 1300+ 而不是 1300

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-13
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2016-05-14
      • 2021-05-07
      相关资源
      最近更新 更多