使用ggplot2

时间:2018-01-12 22:50:16

标签: r ggplot2 boxplot outliers stripchart

我正在尝试创建一个Boxplot / Scatterplot组合。到目前为止,我对它做得还不错,但有一个问题让我感到非常烦恼,我一直无法弄明白。我在R,我已经安装了ggplot2包。这是我正在使用的代码:

  #(xx= stand in for my data set, which I imported from excel with the 
      #  column labels as the X-axis values)
  > boxplot(xx, lwd = 1.5, ylab = 'Minutes', xlab = "Epoch")
  > stripchart(xx, vertical = TRUE, 
  +            method = "jitter", add = TRUE, pch = 20, col = 'blue')

这给了我一个非常接近我想要的情节,但问题是异常值被放置在图表上两次。如果可能的话,我想让条形图排除它们(最高的蓝点组)并且只使用箱形图中的那些(黑色轮廓圆圈),这样它们就会脱颖而出并且看起来不那么草率。

我试图通过在stripchart命令中添加许多不同的异常值参数来改变有问题的点,遗憾的是没有运气。我已经尝试将y-limits设置为低于其值,尝试使用outline = false(完全删除条形图),尝试更改异常值颜色,outpch等。该命令不适用于任何这些尝试。这是ylim的一个例子:

 > stripchart(xx, vertical = TRUE, 
+       method = "jitter", add = TRUE, pch = 20, col = 'blue', ylim = true, 
ylim (0,20))
  

ylim(0,20)中的错误:找不到函数“ylim”

这是一个异常颜色的例子:

> stripchart(xx vertical = TRUE, 
+   method = "jitter", add = TRUE, pch = 20, col = 'blue', outcol = "black")
  

警告讯息:
      1:在plot.xy(xy.coords(x,y),type = type,...)中:“outcol”不是       图形参数
      .......#警告信息继续如此。

条形图是否能够排除异常值?或者我还没有充分了解它们(以及R作为一个整体,就此而言)有效地编写代码?

如果可以这样做,我该怎么办?只要视图上的视觉效果相同,我就完全没有直接解决数据方面的异常问题的解决方案。

感谢您的时间和任何帮助!

编辑:这是一些可以使用的数据。顶行是列标签,数据在下面。很抱歉,如果这种格式是坏的。第29行和第10行等数据中的第29行和第10行等,是我的图表中作为异常值绘制的一些点的示例,我想保留在箱线图中而不是散点图中/带状图。

1   5   10  15  30  60
7.233333333 8.166666667 9.666666667 7.75    9   7
7.133333333 9.25    9.333333333 9.75    10  11
0.733333333 0.5 0.833333333 1   1   0
1.766666667 1.166666667 1   0.75    1   0
1.75    2.25    2.333333333 2.25    1   1
6.75    7   7.166666667 7.75    6.5 7
1.516666667 1.75    1.333333333 2   2   2
1.533333333 1.5 2   1.25    1.5 2
27.3    28.33333333 29.33333333 30.25   28.5    29
6.35    6   6.333333333 7   6   6
7.083333333 8.333333333 8.833333333 8.75    8   8
8.533333333 10.08333333 10.5    12  10.5    11
7.65    8.416666667 9   10.75   9   12
6.85    7.333333333 8   7.25    6   8
4.433333333 5   5.5 5   6.5 6
8.616666667 10  11.66666667 12.25   13  12
3.633333333 3.75    3.5 3.25    3   2
0.8 0.75    0.833333333 1   1   0
7.283333333 8.583333333 9.666666667 9.75    12  8
7.483333333 8.75    8.333333333 7.75    6.5 7
3.466666667 2.916666667 3.166666667 2.5 2   0
5.483333333 6.416666667 6.833333333 6.75    7   8

1 个答案:

答案 0 :(得分:0)

这里有一些事情发生。如果您想坚持基础绘图功能(boxplot()stripchart()),您只需告诉stripchart仅绘制某些标准内的点。异常值的通用标准是距离均值3个或更多标准差的任何点。我们不是将未经修改的数据集传递给stripchart,而是将该数据集分组(请注意[ ]括号)。

boxplot(xx)
stripchart(xx[xx <= mean(xx) + sd(xx) * 3], vertical = T, method = 'jitter', add = T, pch = 20, col = 'blue')

enter image description here

当然,如果您确实想要使用ggplot2(我建议不仅要安装该软件包,而是整个 tidyverse 安装install.packages('tidyverse')),您可以生成一个可以说是更好的情节:

enter image description here

生成ggplot版本所需的数据格式和命令与基本图形版本完全不同,超出了本答案的范围。可重现的代码如下。

library(tidyverse)

df <- structure(list(X1 = c(7.233333333, 7.133333333, 0.733333333, 1.766666667, 1.75, 6.75, 1.516666667, 1.533333333, 27.3, 6.35, 7.083333333, 8.533333333, 7.65, 6.85, 4.433333333, 8.616666667, 3.633333333, 0.8, 7.283333333, 7.483333333, 3.466666667, 5.483333333 ), X5 = c(8.166666667, 9.25, 0.5, 1.166666667, 2.25, 7, 1.75, 1.5, 28.33333333, 6, 8.333333333, 10.08333333, 8.416666667, 7.333333333, 5, 10, 3.75, 0.75, 8.583333333, 8.75, 2.916666667, 6.416666667 ), X10 = c(9.666666667, 9.333333333, 0.833333333, 1, 2.333333333, 7.166666667, 1.333333333, 2, 29.33333333, 6.333333333, 8.833333333, 10.5, 9, 8, 5.5, 11.66666667, 3.5, 0.833333333, 9.666666667, 8.333333333, 3.166666667, 6.833333333), X15 = c(7.75, 9.75, 1, 0.75, 2.25, 7.75, 2, 1.25, 30.25, 7, 8.75, 12, 10.75, 7.25, 5, 12.25, 3.25, 1, 9.75, 7.75, 2.5, 6.75), X30 = c(9, 10, 1, 1, 1, 6.5, 2, 1.5, 28.5, 6, 8, 10.5, 9, 6, 6.5, 13, 3, 1, 12, 6.5, 2, 7), X60 = c(7L, 11L, 0L, 0L, 1L, 7L, 2L, 2L, 29L, 6L, 8L, 11L, 12L, 8L, 6L, 12L, 2L, 0L, 8L, 7L, 0L, 8L)), .Names = c("X1", "X5", "X10", "X15", "X30", "X60"), class = "data.frame", row.names = c(NA, -22L))

df.long <- gather(df, x, value) %>% 
  mutate(x = as.factor(as.numeric(gsub('X', '', x)))) %>% 
  group_by(x) %>% 
  mutate(is.outlier = value > mean(value) + sd(value) * 3)

plot.df <- ggplot(data = df.long, aes(x = x, y = value, group = x)) +
  geom_boxplot() +
  geom_point(data = filter(df.long, !is.outlier), color = '#0000ff88', position = position_jitter(width = 0.1))
print(plot.df)