ggplot2和一组抖动/闪避点

Posted

技术标签:

【中文标题】ggplot2和一组抖动/闪避点【英文标题】:ggplot2 and jitter/dodge points by a group 【发布时间】:2020-04-07 03:26:42 【问题描述】:

我将“海拔”作为我的 y 轴,我希望它作为离散变量(换句话说,我希望每个海拔之间的空间相等,而不是相对于数值差异)。我的 x 轴是“时间”(儒略日期)。

    mydata2<- data.frame(
                   "Elevation" = c(rep(c(1200),10),rep(c(1325.5),10),rep(c(1350.75),10), rep(c(1550.66),10)),
                   "Sex" = c(rep(c("F","M"),20)),
                   "Type" = c(rep(c("emerge","emerge","endhet","endhet","immerge","immerge","melt","melt", "storpor","storpor"),4)),
                   "mean" = c(rep(c(104,100,102,80,185,210,84,84,188,208,104,87,101,82, 183,188,83,83,190,189),2))
                   "se"=c(rep(c(.1,.01,.2,.02,.03),4)))

mydata2$Sex<-factor(mydata2$Sex))
mydata2$Type<-factor(mydata2$Type))
mydata2$Elevation<-factor(mydata2$Elevation))

at<-ggplot(mydata2, aes(y = mean, x = Elevation,color=Type, group=Sex)) +
  geom_pointrange(aes(ymin = mean-se, ymax = mean+se), 
                  position=position_jitter(width=0.2,height=.1), 
                  linetype='solid') +
  facet_grid(Sex~season,scales = "free")+
  coord_flip()

at

理想情况下,我希望每个“类型”都垂直分开。当我只抖动或闪避那些靠近且不均匀的。有没有办法强制每个“类型”稍微改变一下,让它们都在自己的线上?我试图通过给每种类型一个稍微不同的“高度”来强制它,但最后我得到了一个凌乱的 y 轴(我想不出一种方法来保持这一点,但不能用离散的比例显示所有刻度线)。

感谢您的帮助。

【问题讨论】:

mydata2$Sex 【参考方案1】:

如果要将数值用作离散值,则应使用as.factor。在您的示例中,尝试使用x = as.factor(Elevation)

另外,我会建议使用position = position_dodge() 来获取对应于同一海拔的不同条件的点并排绘制

ggplot(mydata2, aes(y = mean, x = as.factor(Elevation),color=Type, group=Sex)) +
  geom_pointrange(aes(ymin = mean-se, ymax = mean+se), 
                  position=position_dodge(), 
                  linetype='solid') +
  facet_grid(Sex~season,scales = "free")+
  coord_flip()

使用 OP 提供的示例数据进行编辑

使用您的数据集,我无法根据您的观点绘制范围。所以,我使用dplyr 包创建了两个变量LowerUpper

然后,我没有通过您在问题中提供的通讯 facotr(...),而是使用 as.factor(Elevation)position_dodge(0.9) 进行绘图以获得以下情节:

library(tidyverse)
mydata2 %>% mutate(Lower = mean-se*100, Upper = mean+se*100) %>%
  ggplot(., aes( x = as.factor(Elevation), y = mean, color = Type))+
  geom_pointrange(aes(ymin = Lower, ymax = Upper), linetype = "solid", position = position_dodge(0.9))+
  facet_grid(Sex~., scales = "free")+
  coord_flip()

它看起来像你要找的东西吗?

数据 您提供的数据集几乎没有错误(括号太多),所以我在这里更正。

mydata2<- data.frame(
  "Elevation" = c(rep(c(1200),10),rep(c(1325.5),10),rep(c(1350.75),10), rep(c(1550.66),10)),
  "Sex" = rep(c("F","M"),20),
  "Type" = rep(c("emerge","emerge","endhet","endhet","immerge","immerge","melt","melt", "storpor","storpor"),4),
  "mean" = rep(c(104,100,102,80,185,210,84,84,188,208,104,87,101,82, 183,188,83,83,190,189),2),
  "se"=rep(c(.1,.1,.2,.05,.03),4))

【讨论】:

好的,谢谢你的建议。我已经将高程设置为一个因素,并且 position=position_dodge() 也在我的代码中,并且无法创建我希望实现的情节。它不会按类型均匀地躲避所有点。 好的,您能提供一个可重现的数据集示例吗?它将帮助我们解决您的问题。见这里:***.com/questions/5963269/… 当然,我已经包含了一个与我发布的数字相似但略小一些的虚拟数据集。 @AmandaGoldberg,我编辑了我的答案,向您展示我的代码以获取上面发布的情节。它看起来像您要找的东西吗? 好的,非常感谢!这正是我想要的。

以上是关于ggplot2和一组抖动/闪避点的主要内容,如果未能解决你的问题,请参考以下文章

仅在 ggplot2 的重叠处闪避或抖动

R语言ggplot2可视化抖动数据点使用ggplot2中的geom_jitter函数可视化抖动数据点防止数据重叠影响可视化效果添加主标题副标题

ggplot2 - 带有堆栈和闪避的条形图

更改 ggplot2 barplot 中闪避条的顺序

如何从 df 的不同列中获取闪避的 geom_bar (ggplot2)

R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置显示散点抖动点jitter)实战