【问题标题】:geom_dotplot() loses dodge after applying colour aestheticsgeom_dotplot() 应用颜色美学后失去闪避
【发布时间】:2017-03-23 19:26:06
【问题描述】:

我想在 X 轴上按一个类别来组织我的数据,但按另一个类别为它着色,如下例所示:

图表 1,未着色:

require(ggplot2)
nocolor <- ggplot(mtcars, aes(x=as.factor(cyl), y=disp)) + 
  geom_dotplot(binaxis="y", stackdir = "center")
print(nocolor)

图 2,带颜色:

nododge <- ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
  geom_dotplot(binaxis="y", stackdir = "center")
print(nododge)

引入着色后出现的一个问题是属于不同组的点不再相互躲避。这会导致我的真实数据出现问题,因为我得到的点恰好具有相同的值并且彼此完全模糊。

然后我尝试了这个,但它使我的数据乱码:

图 3:

garbled <- ggplot(mtcars, aes(x=as.factor(cyl), y=disp)) +
  geom_dotplot(binaxis="y", stackdir = "center", fill=as.factor(mtcars$gear))
print(garbled)

点相互闪避,但颜色只是随机的,与实际数据不符。

我希望this question 的答案能够解决我的问题,但颜色仍然是随机的:

图 4:

graphdata <- mtcars
graphdata$colorname <- as.factor(graphdata$gear) 
levels(graphdata$colorname) <- c("red", "blue", "black")
jalapic <- ggplot(graphdata, aes(x=as.factor(cyl), y=disp)) +
  geom_dotplot(binaxis="y", stackdir = "center", fill=as.character(graphdata$colorname))
print(jalapic)

有没有人知道如何让 Graph #2 中的点相互躲避,或者如何修复图 3 或 4 中的颜色?非常感谢任何帮助,谢谢。

【问题讨论】:

  • 在图#2中,你可以做geom_dotplot(binaxis="y", stackdir = "center", position="dodge")
  • 这将每个着色组隔离在单独的 x 轴上,这不是我想要的外观。我希望这些点仍然聚集在同一堆中,但可以通过颜色识别。我的问题实际上与 Kristoffer Vitting-Seerup 的问题完全相同,这在link 下的问题中得到了非常准确的描述。不过,我不知何故无法在 jalapic 的答案中找到适合我的解决方案。

标签: r ggplot2 colors fill


【解决方案1】:

使用binpositions = "all"stackgroups = TRUE

ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
  geom_dotplot(binaxis="y", stackdir = "center", binpositions="all", stackgroups=TRUE)

给予:

一种可能的替代方法是使用stackdir = "up"

ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
  geom_dotplot(binaxis="y", stackdir = "up", binpositions="all", stackgroups=TRUE)

给出:

【讨论】:

  • 这比我开始的地方好多了,谢谢!我能够用我的原始数据复制它。然而,它看起来有点奇怪。它看起来像是一个个拆开的拼图。当您使用 mtcars 数据的 mpg 变量进行尝试时,它会更加明显:ggplot(mtcars, aes(x=as.factor(cyl), y=mpg, fill=as.factor(gear)))+ geom_dotplot(binaxis="y", stackdir = "center", binpositions="all", stackgroups=TRUE) 您介意尝试一下并告诉我是否有解决奇怪外观的方法吗?否则,我对你已经给出的答案很满意。
【解决方案2】:

根据您的需要,这是另一个可能比点图效果更好的选项。我们绘制了各个点,但我们将它们分开,以便每个点都可见。

在我最初的答案中,我使用了position_jitterdodge,但该方法的随机性导致点重叠并且对点放置的控制很少。下面是一种直接控制点放置以防止重叠的更新方法。

在下面的示例中,我们将 cyl 作为 x 变量,disp 作为 y 变量,gear 作为颜色美学。

  • 在每个cyl 中,我们希望被gear 躲避点。
  • 在每个gear 中,我们希望将具有相似disp 值的点水平分开,以免它们重叠。

我们通过向cyl 的值添加适当的增量来实现这一点,以改变点的水平位置。我们使用两个参数来控制它:dodgegear 分隔点组,而sep 控制每个gear 中具有disp 相似值的点的分隔。我们通过创建一个名为dispGrp 的分组变量来确定“disp 的相似值”,它只是将disp 四舍五入到最接近的十位(当然,这可以根据数据的规模进行调整,绘制点的大小和图形的物理大小)。

为了确定每个点的 x 值,我们从 cyl 的值开始,添加 gear 的躲避,最后将每个 geardispGrp 组合内的点按取决于的数量分布每个分组内的点数。

所有这些数据转换都在dplyr 链中完成,然后将生成的数据帧馈送到ggplot。数据转换和绘图的顺序可以概括为一个函数,但下面的代码只解决了问题中的特定情况。

library(dplyr)
library(ggplot2)

dodge = 0.3  # Controls the amount dodging
sep = 0.05   # Within each dodge group, controls the amount of point separation

mtcars %>% 
  # Round disp to nearest 10 to identify groups of points that need to be separated
  mutate(dispGrp = round(disp, -1)) %>%
  group_by(gear, cyl, dispGrp) %>% 
  arrange(disp) %>%
  # Within each cyl, dodge by gear, then, within each gear, separate points
  #  within each dispGrp
  mutate(cylDodge = cyl + dodge*(gear - mean(unique(mtcars$gear))) + 
           sep*seq(-(n()-1), n()-1, length.out=n())) %>%
  ggplot(aes(x=cylDodge, y=disp, fill=as.factor(gear))) + 
  geom_point(pch=21, size=2) +
  theme_bw() + 
  scale_x_continuous(breaks=sort(unique(mtcars$cyl)))

这是我的原始答案,使用position_jitterdodge按颜色进行闪避,然后在每个颜色组内抖动以分离重叠点:

set.seed(3521)
ggplot(mtcars, aes(x=factor(cyl), y=disp, fill=as.factor(gear))) + 
  geom_point(pch=21, size=1.5, position=position_jitterdodge(jitter.width=1.2, dodge.width=1)) +
  theme_bw()

【讨论】:

  • 这是我想到的替代方案,但我还没有尝试过。很高兴看到它工作,谢谢!但是,有没有办法让这些点完全相互躲避?我尝试增加 jitter.width,这会在没有完全消除重叠的情况下将点展开太多。我想让它们完全相互躲避,这样我就可以将 alpha 增加到 1。有什么想法吗?
  • 我已经更新了我的答案以使用更小的点大小和更多的抖动。在仍然使用足够小的闪避来防止 x 轴类别重叠的同时,可能很难完全分离所有点,但是您可以尝试一下,看看是否可以得到您喜欢的东西。
  • 我已经用一种新方法更新了我的答案,以避免各个点重叠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
相关资源
最近更新 更多