【问题标题】:Position dodge with geom_point(), x=continuous, y=factor使用 geom_point() 进行位置闪避,x=continuous,y=factor
【发布时间】:2015-05-03 03:14:54
【问题描述】:

我制作了一个函数,可以一次绘制来自多个因子分析的载荷,即使它们的变量没有完全重叠(或根本没有重叠)。它工作正常,但有时因子载荷在分析中是相同的,这意味着这些点被绘制在彼此之上。

library(pacman)
p_load(devtools, psych, stringr, plotflow)
source_url("https://raw.githubusercontent.com/Deleetdk/psych2/master/psych2.R")

loadings.plot2 = function(fa.objects, fa.names=NA) {
  fa.num = length(fa.objects) #number of fas

  #check names are correct or set automatically
  if (length(fa.names)==1 & is.na(fa.names)) {
    fa.names = str_c("fa.", 1:fa.num)
  }
  if (length(fa.names) != fa.num) {
    stop("Names vector does not match the number of factor analyses.")
  }

  #merge into df
  d = data.frame() #to merge into
  for (fa.idx in 1:fa.num) { #loop over fa objects
    loads = fa.objects[[fa.idx]]$loadings
    rnames = rownames(loads)
    loads = as.data.frame(as.vector(loads))
    rownames(loads) = rnames
    colnames(loads) = fa.names[fa.idx]

    d = merge.datasets(d, loads, 1)
  }

  #reshape to long form
  d2 = reshape(d,
               varying = 1:fa.num,
               direction="long",
               ids = rownames(d))
  d2$time = as.factor(d2$time)
  d2$id = as.factor(d2$id)
  colnames(d2)[2] = "fa"

  print(d2)

  #plot
  g = ggplot(reorder_by(id, ~ fa, d2), aes(x=fa, y=id, color=time, group=time)) +
      geom_point(position=position_dodge()) +
      xlab("Loading") + ylab("Indicator") +
      scale_color_discrete(name="Analysis",
                           labels=fa.names)

  return(g)
}

#Some example plots    
fa1 = fa(iris[-5])
fa2 = fa(iris[-c(1:50),-5])
fa3 = fa(ability)
fa4 = fa(ability[1:50,])

loadings.plot2(list(fa1,fa1,fa2))

在这里,我将同一个对象绘制了两次,只是为了显示效果。该图没有红点,因为来自fa.2 的绿色点在顶部。相反,我希望它们在 y 轴上被躲避。但是,position="dodge" 的各种设置似乎并没有什么不同。

然而,position="jitter" 有效,但它是随机的,所以有时它不能很好地工作,而且会使情节看起来混乱。

如何使 y 轴上的点被躲避?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    显然,您只能侧身躲避,但有一种解决方法。诀窍是翻转 x 和 y,执行 position_dodge,然后执行 coord_flip()。

      g = ggplot(data = reorder_by(id, ~ fa, d2), aes(x=id, y=fa, color=time, group=time)) +
        geom_point(position=position_dodge(width = .5)) +
        xlab("Loading") + ylab("Indicator") +
        scale_color_discrete(name="Analysis",
                             labels=fa.names) +
        coord_flip()
    

    【讨论】:

    • reorder_by 是固定级别顺序所必需的,否则它们的顺序将不正确(它们将按字母顺序排列,因为这是 ggplot2 喜欢的)。它在 plotflow 包中(由p_load() 加载)。在您的回答中,顺序颠倒了。好主意,我会尝试使用coord_flip() 找到可接受的解决方案。
    • 是的,但是您是手动操作的,所以如果我尝试在另一个数据集上使用您的代码,它(可能)不会很好地工作。但是,您似乎在 ggplot2 代码的第一行中出错了。您已经指定了两次data 参数。如果有人使用g = ggplot(reorder_by(id, ~ fa, d2), aes(x=id, y=fa, color=time, group=time)) +,就我所知,情节就像它应该躲避一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多