geom_dotplot() 应用颜色美学后失去闪避
geom_dotplot() loses dodge after applying colour aesthetics
我想在 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)
这些点相互闪避,但颜色只是随机的,与实际数据不符。
我希望 的答案能够解决我的问题,但颜色仍然是随机的:
图 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 中的颜色?非常感谢任何帮助,谢谢。
使用 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)
给出:
根据您的需要,这是另一个可能比点图效果更好的选项。我们绘制了各个点,但我们将它们分开,以便每个点都可见。
在我原来的回答中,我使用了position_jitterdodge
,但该方法的随机性导致重叠点和对点放置的控制很少。下面是一种直接控制点放置以防止重叠的更新方法。
在下面的示例中,我们将 cyl
作为 x 变量,disp
作为 y 变量,gear
作为颜色美学。
- 在每个
cyl
中,我们希望点被 gear
躲避。
- 在每个
gear
中,我们希望具有相似 disp
值的点水平分开,这样它们就不会重叠。
我们通过向 cyl
的值添加适当的增量来实现这一点,以移动点的水平位置。我们用两个参数来控制它:dodge
通过 gear
分隔点组,而 sep
控制每个 gear
中具有相似值 [=14= 的点的分隔].我们通过创建一个名为 dispGrp
的分组变量来确定 "similar values of disp
",它只是 disp
四舍五入到最接近的十(当然,这可以根据数据的规模进行调整,绘制点的大小,以及图形的物理大小)。
为了确定每个点的 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()
我想在 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)
这些点相互闪避,但颜色只是随机的,与实际数据不符。
我希望
图 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 中的颜色?非常感谢任何帮助,谢谢。
使用 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)
给出:
根据您的需要,这是另一个可能比点图效果更好的选项。我们绘制了各个点,但我们将它们分开,以便每个点都可见。
在我原来的回答中,我使用了position_jitterdodge
,但该方法的随机性导致重叠点和对点放置的控制很少。下面是一种直接控制点放置以防止重叠的更新方法。
在下面的示例中,我们将 cyl
作为 x 变量,disp
作为 y 变量,gear
作为颜色美学。
- 在每个
cyl
中,我们希望点被gear
躲避。 - 在每个
gear
中,我们希望具有相似disp
值的点水平分开,这样它们就不会重叠。
我们通过向 cyl
的值添加适当的增量来实现这一点,以移动点的水平位置。我们用两个参数来控制它:dodge
通过 gear
分隔点组,而 sep
控制每个 gear
中具有相似值 [=14= 的点的分隔].我们通过创建一个名为 dispGrp
的分组变量来确定 "similar values of disp
",它只是 disp
四舍五入到最接近的十(当然,这可以根据数据的规模进行调整,绘制点的大小,以及图形的物理大小)。
为了确定每个点的 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()