【问题标题】:Misaligned dots in ggplot2's dotplot in RR中ggplot2的点图中未对齐的点
【发布时间】:2018-10-02 13:04:57
【问题描述】:

我不明白为什么 ID 2、6、8、10 的点不会像在 1、3、4、7、9 中那样垂直对齐。

偏移量受stackratio影响,但为什么不影响所有组?

ggplot(sleep, 
       aes(x=ID,fill=group,y=extra))+
  geom_dotplot(binaxis = 'y',
               method="histodot",
               stackgroups = TRUE,
               binpositions="bygroup",
               stackratio=1,
               binwidth=0.1, 
               stackdir = "center",
               dotsize = 3)

另一个例子是

ggplot(mtcars, aes(x = factor(am),fill = factor(cyl), y = mpg)) +
  geom_dotplot(binaxis = "y",stackgroups = TRUE, stackdir = "center", binpositions="all")

这里stackgroups = TRUE 让一切都奇怪地偏移了。

可以在这里做点什么,或者有其他方法可以做到吗?

【问题讨论】:

  • 尝试将binwidth=0.1 调整为更小的数字。我相信这可以控制点何时被认为与另一个点共享一个 bin,因此偏移。
  • 试过了。这使得“网格”更小,但由于点大小基于此,它也使点更小。为了补偿,点大小可以增加相同的因子。完成后,不幸的是,我得到了相同的结果。

标签: r ggplot2


【解决方案1】:

似乎 geom_dotplot 计算“闪避”位置,就好像所有点都在一个组中,然后将它们绘制在每个组中。

我找到了解决办法。 在这里,我自己制作了一个情节并为这些点着色。这个 ggplot 无法为其制作图例,所以我制作了另一个图例,这是正确的图例。 然后使用 plot_grid 制作我的最终情节。 正确设置key很重要,否则绘图会颜色不正确。

mycars <- as.data.table(mtcars)
mycars[cyl=="4",mycol:="red"][cyl=="6",mycol:="green"][cyl=="8",mycol:="blue"]
setkey(mycars,am,mpg)
myplot <- ggplot(mycars, aes(x = factor(am), y = mpg)) +
  geom_dotplot(binaxis = "y",
               fill=mycars$mycol,
               stackratio=1,
               binwidth=0.7, drop=FALSE,
               stackdir = "center",
               dotsize = 1)

lplot <- ggplot(mtcars, aes(x = factor(am),fill = factor(cyl), y = mpg))+
  geom_dotplot(binaxis = "y",stackgroups = TRUE)+
  scale_fill_manual(values=c("red","green", "blue"))
mylegend <- get_legend(lplot)

plot_grid(myplot,mylegend,ncol=2,rel_widths =  c(6,1))

Plot

【讨论】:

  • 只要确保这是你想要的。例如,如果您运行代码然后查看数据,您会看到点 14 和 15 具有相同的高度(y=mpg=19.2),但点 12 和 13 却不同(18.1 和 18.7)但它们是绘制在相同的高度(这也发生在其他点上,例如点 23、24、25)。如果这是你想要的,好的。但它可能会产生误导性的想法,即第 12 点和第 13 点具有完全相同的 mpg。
  • 这是个问题。这是由于 binwidth 造成的。我可以将其减少 7 倍至 0.1 并将点大小增加 7 倍。这将使它们仅在它们相同时并排放置(因为这里的精度为 1 位)
【解决方案2】:

我无法告诉您使用 geom_dotplot 函数时有什么问题,但您可以通过使用 geom_point 和选项 position = position_dodge2() 得到您想要的。在函数position_dodge2() 中,您可以使用width 来控制每个点的位置。请看下面的完整代码:

library(ggplot2)

ggplot(sleep, 
       aes(x=ID,fill=group,y=extra))+
  geom_point(
    size=3,
    pch = 21,
    position = position_dodge2(width=c(rep(0.00001,4),
                                       0.2,
                                       rep(0.00001,5)))
  ) + 
  scale_y_continuous(limits = c(-2,6)) +
  theme_classic() + 
  theme(panel.grid.major.x = element_line(color="gray",
                                          linetype = "dashed"))

结果:


更新

我们可以在同一个 X 内有不同的对齐方式。例如,当 ID=1 时,我可以移动第 2 组的点,同时保持第 1 组的点:

代码:

library(ggplot2)

ggplot(sleep, 
       aes(x=ID,fill=group,y=extra))+
  geom_point(
    size=3,
    pch = 21,
    position = position_dodge2(width=c(0.7,
                                       rep(0.00001,3),
                                       0.2,
                                       rep(0.00001,5),
                                       0.00001,
                                       rep(0.00001,3),
                                       0.2,
                                       rep(0.00001,5)))
  ) + 
  scale_y_continuous(limits = c(-2,6)) +
  theme_classic() + 
  theme(panel.grid.major.x = element_line(color="gray",
                                          linetype = "dashed"))

【讨论】:

  • 如果必须躲避相同 X 值内的所有内容,这将起作用,但对于我的其他示例,这将不起作用。我确实找到了我发布的解决方案。
  • 这不太正确。就像我说的,如果你使用 position_dodge2 你控制每个点的位置。但是,您可能需要花费大量时间来了解如何单独移动每个点。关于您的解决方案,请查看我的评论。
  • 我已经更新了我的答案以解决这种情况。 @彼得
  • 我更喜欢你的图表的外观,但正如你自己所说,当我有很多点和很多图时,它会花费很多时间。
猜你喜欢
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
相关资源
最近更新 更多