应用色彩美学后,geom_dotplot()会失去躲闪

时间:2016-11-09 21:21:29

标签: r ggplot2 colors fill

我想在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)

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

2 个答案:

答案 0 :(得分:5)

使用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)

给出:

enter image description here

可能的替代方法是使用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)

给出:

enter image description here

答案 1 :(得分:2)

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

在我的原始答案中,我使用了position_jitterdodge,但该方法的随机性导致了重叠点并且几乎无法控制点位置。以下是一种更新方法,可直接控制点位置以防止重叠。

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

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

我们通过在cyl的值中添加适当的增量来实现此目的,以便移动点的水平放置。我们使用两个参数来控制它:dodge将点组分开gear,而sep控制每个gear内具有相似值disp的点的分隔}。我们确定了disp&#34;的相似值。通过创建一个名为dispGrp的分组变量,它只是disp四舍五入到最接近的十(当然,这可以调整,取决于数据的规模,绘制点的大小,和图的物理尺寸)。

要确定每个点的x值,我们从cyl的值开始,按gear添加躲避,最后在每个gear和{{1}内展开点数组合的数量取决于每个分组中的点数。

所有这些数据转换都在dispGrp链内完成,然后将得到的数据帧提供给dplyr。数据转换和绘图的顺序可以推广到一个函数中,但下面的代码只解决了问题中的特定情况。

ggplot

enter image description here

这是我的原始答案,使用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

enter image description here