Ggplot2 调整ggplot中两个GOUP在离散x轴上的位置
我有一个连续的y轴和离散的x轴的图。 对于数据,我有一个包含3个级别和2个测量点的组因子,因此创建了6个几何体 我希望保持单个几何体的宽度,但在两个测量点之间增加空间,分别是两组几何体。例如:3几何-间隙-3几何。是否有可能调整ggplot中x轴上一组几何图形的位置Ggplot2 调整ggplot中两个GOUP在离散x轴上的位置,ggplot2,rstudio,Ggplot2,Rstudio,我有一个连续的y轴和离散的x轴的图。 对于数据,我有一个包含3个级别和2个测量点的组因子,因此创建了6个几何体 我希望保持单个几何体的宽度,但在两个测量点之间增加空间,分别是两组几何体。例如:3几何-间隙-3几何。是否有可能调整ggplot中x轴上一组几何图形的位置 preferences %>% pivot_longer(c(F1_life_satisfaction_pre, F1_life_satisfaction_current), names_to = "variables",
preferences %>%
pivot_longer(c(F1_life_satisfaction_pre, F1_life_satisfaction_current), names_to = "variables", values_to = "ratings")%>%
ggplot( aes(y=ratings, x=fct_inorder(variables), fill=fct_inorder(playing_preference))) +
geom_violin(scale="width", adjust=0.5, width=0.8, alpha= 0.2, position = position_dodge(1)) +
stat_summary(fun=mean, geom="point", shape=23, size=2, position = position_dodge(1)) +
stat_summary(aes(group=fct_inorder(playing_preference)), fun=mean, geom = "line", size= 0.5, position = position_dodge(1)) +
stat_summary(fun.data=mean_cl_normal, fun.args=list(mult=1),aes(x=fct_inorder(variables), y=ratings), geom="errorbar",
width=0.05, position = position_dodge(1)) +
scale_x_discrete(labels = c("pre-Pokemon-Go", "current"),expand = c(0, 0.3)) +
theme(axis.text.x = element_text(color = "black", size=10)) +
scale_y_continuous(breaks = c(1, 2, 3, 4, 5, 6, 7), limits=c(1,7)) +
geom_segment(aes(x = 0, y=4, yend=4, xend=3), color="grey") +
theme(axis.ticks.x = element_blank()) +
labs(fill = "playing preference") +
labs(x="life satisfaction") +
theme(axis.title = element_text(size = 10))+
theme(legend.text = element_text(size = 10)) +
theme(legend.title = element_text(size = 10)) +
labs(y = "mean ratings") +
geom_boxplot(width=0.1,color="black", alpha=0.2, position = position_dodge(1)) +
scale_fill_viridis(discrete=T)
TL;DR-在您的线内使用
width=
和position\u dodge(width=…)
播放geom\u小提琴
和geom\u盒形图
以调整位置以及scale\u x\u离散(展开=展开(…)
第一点是决议(以及距离有多近和有多远)绘图上的内容将与窗口大小相关。因此,可以通过ggplot
控制绘图元素之间的定位关系。特别是,您需要更改width=
和position\u dodge(width=…)的值
在您的geom_小提琴
通话中(以及您的geom_盒形图
通话)
示例数据集
我将使用一个示例数据集来说明这个想法,其中我将绘制箱线图…但想法是相同的。示例数据集包含两个x值(“组1”和“组2”),每个值都有“A”、“B”或“C”的细分,每个x
和x.subdiv
包含50个数据点的独立正态分布
set.seed(8675309)
df <- data.frame(
x=c(rep('Group1', 150), rep('Group2', 150)),
x.subdiv=rep(c(rep('A', 50), rep('B',50), rep('C',50)), 2),
y=unlist(lapply(1:6, function(x){rnorm(50, runif(1,10,15), runif(1,0,7))}))
)
这里要注意的规则是:
控制每个geom_盒形图(宽度=…)
值周围盒形图的整体分布宽度x=
控制position\u dodge(width=…)
周围组的排列量(“闪避量”)x=
位置减淡(宽度=1)
,但保留geom\u箱线图(宽度=0.5)
:
每个框的宽度与以前相同,但是x=
周围的每个框的位置更“分散”。实际上,每个框的“减淡”程度更高。如果设置position\u dodge(宽度=0.2)
,则会看到相反的效果,框会一起挤压(因为它们在x=
周围分布得不多):
有趣的是geom\u箱线图(width=)
和position\u dodge(width=)
是如何关联的:
- 如果
等于geom\u boxplot(width=)
,则框将相互接触position\u dodge(width=)
- 如果
小于geom\u boxplot(width=)
,则框将彼此分开position\u dodge(width=)
- 如果
大于geom\u方框图(宽度=)
,则方框将相互重叠position\u dodge(宽度=)
width=
与箱线图的宽度有关。要记住以下两点:
width=
是特定x=
美学的单个减淡几何体的所有宽度之和width=1
是离散轴上两个值之间的宽度,这意味着当您设置width=1
时,框将足够宽,可以触摸geom\u箱线图(宽度=1)
,那么“Group1”的所有框的总和将足够宽,可以接触到“Group2”的框……但您只能看到,如果框之间没有重叠(这意味着position\u dodge(宽度=)
将等于geom\u箱线图(宽度=)
)
因此,这使得框足够宽,可以接触,但位置减淡(宽度)
小于几何图形箱线图(宽度)
…因此框重叠,但“组1”框与“组2”框分开:
如果我们想让所有东西都接触,则必须将它们设置为相等,并且两者都等于1:
p + geom_boxplot(aes(fill=x.subdiv), width=1, position=position_dodge(1))
控制两种宽度
最后,最好控制两者。如果我们从上一个绘图开始,您可能希望绘图在“Group1”和“Group2”之间有分隔。这意味着您需要使所有框的宽度更小(我们通过geom_boxplot(width)
控制)。但是,您可能仍然希望避开框之间留有一点空间,因此我们必须将位置\u减淡(宽度)
设置为大于geom\u箱线图(宽度)
,但不要太大,这样我们就失去了“Group1”和“Group2”之间的分隔。类似的功能非常有效:
p + geom_boxplot(aes(fill=x.subdiv), width=0.5, position=position_dodge(0.55))
在您的例子中,您同时拥有geom_小提琴
和geom_盒形图
,因此您需要将它们一起调整,并形成正确的外观
编辑:“左右移动”和“挤压”
如果width=
和position\u dodge(width=
参数不能满足您的需要,那么还有另一个参数可以与它们协同工作来移动对象。这将是使用scale\x\u离散(expand=…
控制x轴项目左右的空间量。与width=
和position\u dodge(width=
)一起使用,这实际上可以让您精确控制数据沿x轴的位置,同时仍然遵循ggplot2
提供的自动绘图
控制沿x轴的数据之间的空白width=
控制沿x轴定位的数据子组之间的空白量position\u dodge(width=
控制面板左右两侧的空白scale\u x\u discrete(expand=…
p + geom_boxplot(aes(fill=x.subdiv), width=0.5, position=position_dodge(0.2))
p + geom_boxplot(aes(fill=x.subdiv), width=1, position=position_dodge(0.8))
p + geom_boxplot(aes(fill=x.subdiv), width=1, position=position_dodge(1))
p + geom_boxplot(aes(fill=x.subdiv), width=0.5, position=position_dodge(0.55))
p + geom_boxplot(aes(fill=x.subdiv), width=0.5, position=position_dodge(0.55)) +
scale_x_discrete(expand=expansion(mult=0.3))
p + geom_boxplot(aes(fill=x.subdiv), width=0.5, position=position_dodge(0.55)) +
scale_x_discrete(expand=expansion(mult=c(1,0.5)))