使用geom_point()的位置躲避技术,x轴连续,y轴为因子

7

我已经编写了一个函数,可以同时绘制多个因子分析的载荷图,即使它们的变量没有完全重叠(或根本没有)。这个函数效果很好,但有时候不同分析中的因子载荷是相同的,这意味着这些点会被绘制在彼此之上。

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轴上闪避?

2个回答

10

显然,你只能侧向躲避,但有一个变通方法。诀窍是翻转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()

enter image description here


reorder_by是必要的,以修复级别的顺序,否则它们将不会按正确的顺序排列(因为ggplot2喜欢按字母顺序排列)。它在plotflow包中(由p_load()加载)。在你的答案中,顺序被颠倒了。不过这个想法很好,我会尝试看看是否可以通过coord_flip()找到可接受的解决方案。 - CoderGuy123
是的,但你是手动完成的,所以如果我尝试在另一个数据集上使用你的代码,它可能不会很好地工作。然而,在ggplot2代码的第一行中,你似乎犯了一个错误。你已经两次指定了“data”参数。如果使用g = ggplot(reorder_by(id, ~ fa, d2), aes(x=id, y=fa, color=time, group=time)) +,据我所知,绘图就像应该的那样工作。 - CoderGuy123

0

可能存在重复

在链接的帖子中,正确答案指出必须使用position_jitter()而不是position_dodge()。这对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接