0

所以我使用 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. pelagcus 另外:警告消息:1:未定义宽度。设置为position_dodge(width = ?) 2:在 max(table(panel$xmin)) 中:max 没有非缺失参数;返回-Inf

我已经尝试了几件事,但我不知道它是否适用于 geom_col 而不适用于 geom_points。

提前致谢

4

1 回答 1

1

您遇到的两个基本问题是处理颜色错误而不是闪避,它们可以通过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)

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

解决颜色错误

对于情节,我将尝试创建与您相似的情节。请注意,在scale_fill_manual对象中,您必须使用 listvalues=设置参数。在您的示例代码中,您使用向量 ( ) 来指定颜色和命名。如果你有,这代表一个列表结构。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。我可以给你的最好的推理是,对于列和条形图,闪避是几何图形的“内置”,因为默认位置是“堆栈”,而“闪避”代表绘制几何图形的另一种方法。对于点、文本、标签等,默认位置是“身份”,您必须更明确地说明它们将如何躲避,否则它们根本不躲避。

基本上,我们需要让点知道他们躲避的依据。是“物种”吗?使用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')

在此处输入图像描述

于 2020-04-24T13:50:25.113 回答