Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ggplot2 调整ggplot中两个GOUP在离散x轴上的位置_Ggplot2_Rstudio - Fatal编程技术网

Ggplot2 调整ggplot中两个GOUP在离散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",

我有一个连续的y轴和离散的x轴的图。 对于数据,我有一个包含3个级别和2个测量点的组因子,因此创建了6个几何体 我希望保持单个几何体的宽度,但在两个测量点之间增加空间,分别是两组几何体。例如:3几何-间隙-3几何。是否有可能调整ggplot中x轴上一组几何图形的位置

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
    提供的自动绘图

    • width=
      控制沿x轴的数据之间的空白

    • position\u dodge(width=
      控制沿x轴定位的数据子组之间的空白量

    • 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)))