我希望将数据按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中固定着色?我真的很感谢你的帮助,谢谢。
发布于 2016-11-09 21:40:22
使用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)这意味着:

发布于 2016-11-09 22:15:48
根据您的需要,这里还有另一种可能比点图更有效的选择。我们绘制各个点,但将它们分开,这样每个点都是可见的。
在我最初的答案中,我使用了position_jitterdodge,但是这种方法的随机性导致了点的重叠和对点位置的控制。下面是一个更新的方法,直接控制点的位置,以防止重叠。
在下面的例子中,我们使用cyl作为x变量,disp作为y变量,gear作为颜色美学。
cyl中,我们都希望gear能避开点数。gear中,我们希望具有disp相似值的点水平地分开,这样它们就不会重叠。我们通过向cyl的值添加适当的增量来实现这一点,以便移动点的水平位置。我们使用两个参数来控制这一点:dodge通过gear来分离各点组,而sep则控制具有类似disp值的每个gear内的点的分离。我们通过创建一个名为disp的分组变量来确定“类似的值”,该变量仅将disp四舍五入到最接近的10(当然,这可以根据数据的规模、绘制点的大小和图形的物理大小进行调整)。
为了确定每个点的x值,我们从cyl的值开始,通过gear添加闪避,最后将每个gear和dispGrp组合中的点数按依赖于每个分组内点数的数量进行分配。
所有这些数据转换都是在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()

https://stackoverflow.com/questions/40516227
复制相似问题