ggplot2 geom_points 不会着色或闪避

ggplot2 geom_points won't colour or dodge

所以我正在使用 ggplot2 绘制条形图和点。我目前得到这个:

如您所见,条形图很好地分开并涂上了所需的颜色。然而,我的观点都是无色的,并且相互堆叠。我希望这些点位于指定条的上方并且颜色相同。

  #Add bars
  A <- A + geom_col(aes(y = w1, fill = factor(Species1)), 
                    position = position_dodge(preserve = 'single'))

  #Add colors
  A <- A + scale_fill_manual(values = c("A. pelagicus"= "skyblue1","A. superciliosus"="dodgerblue","A. vulpinus"="midnightblue","Alopias sp."="black"))

  #Add points
  A <- A + geom_point(aes(y = f1/2.5), 
                      shape= 24, 
                      size = 3,
                      fill = factor(Species1), 
                      position = position_dodge(preserve = 'single'))

  #change x and y axis range
  A <- A + scale_x_continuous(breaks = c(2000:2020), limits = c(2016,2019))
  A <- A + expand_limits(y=c(0,150))

  # now adding the secondary axis, following the example in the help file ?scale_y_continuous
  # and, very important, reverting the above transformation
  A <- A + scale_y_continuous(sec.axis = sec_axis(~.*2.5, name = " "))

  # modifying axis and title
  A <- A + labs(y = " ",
                x = " ")
  A <- A + theme(plot.title = element_text(size = rel(4)))
  A <- A + theme(axis.text.x = element_text(face="bold", size=14, angle=45),
            axis.text.y = element_text(face="bold", size=14))
  #A <- A + theme(legend.title = element_blank(),legend.position = "none")
  #Print plot
  A

当我 运行 此代码时,出现以下错误:

错误:未知颜色名称:A. pelagicus 此外: 警告信息: 1:未定义宽度。设置 position_dodge(width = ?) 2:在 max(table(panel$xmin)) 中:max 没有非缺失参数;返回 -Inf

我已经尝试了一些东西,但我无法弄清楚它是否适用于 geom_col 而不是 geom_points。

提前致谢

你遇到的两个基本问题是处理你的颜色错误而不是闪避,它们可以通过使用 list 而不是格式化你的 scale_...(values= 参数来解决向量,并分别应用 group= 美学。

您将通过示例看到这两个问题的答案:

# dummy dataset
year <- c(rep(2017, 4), rep(2018, 4))
species <- rep(c('things', 'things1', 'wee beasties', 'ew'), 2)
values <- c(10, 5, 5, 4, 60, 10, 25, 7)
pt.value <- c(8, 7, 10, 2, 43, 12, 20, 10)
df <-data.frame(year, species, values, pt.value)

我为我的列高度设置了 "values",为了说明目的,我想对点使用不同的 y 美学,称为 "pt.value"。否则,数据设置与您自己的设置类似。请注意 df$year 将被设置为数字,因此最好将其更改为日期格式(有点麻烦而不是这里的价值),或者只是作为一个因素,因为“2017.5”不会太多感觉这里 :)。关键是,我需要 "year" 是离散的,而不是连续的。

解决颜色错误

剧情方面,我会尽量按照你的风格来创作。这里请注意,在 scale_fill_manual 对象中,您必须使用列表 设置 values= 参数 。在您的示例代码中,您使用向量 (c()) 来指定颜色和命名。如果你有name1=color1, name2=color2,...,这代表一个列表结构。

ggplot(df, aes(x=as.factor(year), y=values)) + 
    geom_col(aes(fill=species), position=position_dodge(width=0.62), width=0.6) + 
    scale_fill_manual(values=
        list('ew' = 'skyblue1', 'things' = 'dodgerblue',
            'things1'='midnightblue', 'wee beasties' = 'gray')) +
    geom_point(aes(y=pt.value), shape=24, position=position_dodge(width=0.62)) +
    theme_bw() + labs(x='Year')

所以颜色应用正确,我的轴是离散的,点的 y 值映射到我想要的 pt.value,但为什么点不闪避?!

解决闪避问题

闪避在ggplot2中是一件有趣的事情。我在这里可以给你的最好的推理是,对于列和条形图,闪避是几何的 "built-in",因为默认位置是 "stack" 并且 "dodge" 代表另一种绘制方法几何学。对于点、文本、标签和其他,默认位置是 "identity",你必须更明确地说明它们将如何躲避,或者它们根本不躲避。

基本上,我们需要让点知道什么他们在躲避。是"species"吗?使用 geom_col,它假定是,但使用 geom_point,您需要指定。我们通过使用 group= 美学来做到这一点,让 geom_point 知道使用什么作为躲避的标准。当你添加它时,它起作用了!

ggplot(df, aes(x=as.factor(year), y=values, group=species)) + 
    geom_col(aes(fill=species), position=position_dodge(width=0.62), width=0.6) + 
    scale_fill_manual(values=
        list('ew' = 'skyblue1', 'things' = 'dodgerblue',
            'things1'='midnightblue', 'wee beasties' = 'gray')) +
    geom_point(aes(y=pt.value), shape=24, position=position_dodge(width=0.62)) +
    theme_bw() + labs(x='Year')