【问题标题】:How to add boxplots to scatterplot with jitter如何使用抖动将箱线图添加到散点图
【发布时间】:2014-05-15 10:33:37
【问题描述】:

我正在使用以下命令生成带有抖动的散点图:

ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5],500,replace=T))
library(lattice)
stripplot(NUMS~GRP,data=ddf, jitter.data=T)

我想在这些点上添加箱线图(每组一个)。我尝试搜索,但找不到绘制所有点(而不仅仅是异常值)和抖动的代码。我该如何解决这个问题。感谢您的帮助。

【问题讨论】:

  • 必须是格子的吗?否则试试with(ddf, { boxplot(NUMS~GRP); points(jitter(as.numeric(GRP)), NUMS, col=rgb(0,0,0,.2), cex=.5, pch=19) })
  • 首选使用基本图形。您的解决方案效果很好。谢谢。
  • 这可以用ggplot2完成吗?我试过 {ggplot(ddf,aes(x=GRP, y=NUMS))+geom_boxplot()+geom_jitter()} 但它产生了太多的散点 - 抖动可以减少吗?
  • 请参阅此相关问题以及按组抖动的点:stackoverflow.com/questions/21468380/…

标签: r plot lattice


【解决方案1】:

这是使用基本图形的一种方法。

boxplot(NUMS ~ GRP, data = ddf, lwd = 2, ylab = 'NUMS')
stripchart(NUMS ~ GRP, vertical = TRUE, data = ddf, 
    method = "jitter", add = TRUE, pch = 20, col = 'blue')

【讨论】:

  • 是的,效果很好。谢谢。我正在尝试 stripplot 然后是 boxplot ,但它不起作用。
  • add = TRUE 参数是关键。 :)
  • add=T 单独可能还不够,因为 {stripplot(NUMS~GRP,data=ddf, jitter=T) ; boxplot(NUMS~GRP,data=ddf, add=T)} 不起作用;显然,需要先放一个“情节”,然后是点或图表。
  • stripplotlattice 中。 stripchart 是一个基本的图形函数。
【解决方案2】:

要在ggplot2 中执行此操作,请尝试:

ggplot(ddf, aes(x=GRP, y=NUMS)) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(position=position_jitter(width=.1, height=0))

显然,您可以根据自己的喜好调整position_jitter() 的宽度和高度参数(尽管我推荐height=0,因为高度抖动会使您的绘图不准确)。

【讨论】:

    【解决方案3】:

    我在包basiclotteR 中编写了一个名为spreadPoints() 的R 函数。该软件包可以使用以下代码直接安装到您的 R 库中:

    install.packages("devtools")
    library("devtools")
    install_github("JosephCrispell/basicPlotteR")
    

    对于提供的示例,我使用以下代码生成了下面的示例图。

    ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5],500,replace=T))
    
    boxplot(NUMS ~ GRP, data = ddf, lwd = 2, ylab = 'NUMS')
    
    spreadPointsMultiple(data=ddf, responseColumn="NUMS", categoriesColumn="GRP",
                         col="blue", plotOutliers=TRUE)
    

    这是一项正在进行的工作(缺少公式作为输入很笨拙!),但它提供了一种非随机方法来扩展 X 轴上的点,该方法兼作小提琴般的数据摘要。有兴趣的可以看看源代码code

    【讨论】:

    • 看起来不错。是否可以仅用一行代码绘制所有组,而不是为每个组重复代码:spreadPoints(ddf[ddf$GRP=="A", "NUMS"], position=1, col="blue", plotOutliers=TRUE)
    • @rnso 我创建了一个附加函数spreadPointsMultiple(),它可以使用单个命令传播多个箱线图的点(参见上面的编辑)。我目前正在努力让spreadPoints() 将公式作为其第一个参数。感谢您指出这一点:-)
    【解决方案4】:

    对于lattice 解决方案:

    library(lattice)
    ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5], 500, replace = T))
    bwplot(NUMS ~ GRP, ddf, panel = function(...) {
      panel.bwplot(..., pch = "|")
      panel.xyplot(..., jitter.x = TRUE)})
    

    默认中点符号已更改为带有pch = "|" 的行。盒子和胡须的其他属性可以通过trellis.par.set() 函数使用box.umbrellabox.rectangle 进行调整。抖动量可以通过名为factor 的变量进行调整,其中factor = 1.5 将其增加50%。

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 2020-10-10
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 2018-08-06
      相关资源
      最近更新 更多