R语言 ggplot2:叠加两个图层时出错

yeotifhr  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(174)

下面以一种简化的方式描述了一个我经常遇到但从未解决过的问题,它与叠加具有不同信息的层有关。
任何帮助都很感激。

library(dplyr)
library(ggplot2)

df = data.frame(id = c(1,1,1,1,2,2,2,3,3,3), 
            year = c(2000,2001,2002,2003,2000,2001,2002,2001,2002,2003),
            meas = c(1.1,1.2,NA,1.4,2.1,1.9,1.8,3.1,3.0,3.3))

df$id   = as.factor(df$id)
df$year = as.factor(df$year)

tib = as.tbl(df)

它产生了tibble:

# A tibble: 10 x 3
       id   year  meas
   <fctr> <fctr> <dbl>
 1      1   2000   1.1
 2      1   2001   1.2
 3      1   2002    NA
 4      1   2003   1.4
 5      2   2000   2.1
 6      2   2001   1.9
 7      2   2002   1.8
 8      3   2001   3.1
 9      3   2002   3.0
10      3   2003   3.3

现在,我计算横截面中每年测量值的中位数。

tib2 = tib %>% group_by(year) %>%       
    summarise(medi=median(meas,na.rm=T))
tib2

正如预期的那样

# A tibble: 4 x 2
    year  medi
  <fctr> <dbl>
1   2000  1.60
2   2001  1.90
3   2002  2.40
4   2003  2.35

到目前为止一切顺利现在我创作我的第一个情节
p = ggplot(tib, aes(x = year, y = meas, group = id, color = id)) p = p + geom_line() p产生

另一方面,下面的代码生成了一组粗点

p1=ggplot(tib2, aes(x = year, y = medi)) + geom_point(colour = 'red', size = 3)
p1

不过,我试着把第一个图中的红点放在如下位置:

p = p + geom_point(data = tib2, aes(x = year, y = medi), colour = 'red', size = 3)
p

这是我得到错误的地方:
不知道如何为函数类型的对象自动选取小数位数。默认为连续。(function(...,row.names = NULL,check.rows = FALSE,check.names = TRUE中出错,参数表示不同的行数:4、0
备注:我注意到缺失的数值会在红线上产生一个切口,我可能希望用插值法来代替。当我用某个数值代替NA时,错误仍然存在。

ghhkc1vu

ghhkc1vu1#

“函数类型的对象”错误与dplyr::id()函数有关。
当您在ggplot调用中指定美学时,它将应用于所有绘图,并且虽然它在tib Dataframe 上下文中的第一个geom中被正确解释,但tib2上下文中没有它,因此它产生错误。
您可以将相关的aes传递给单个geom,或者可以在“tib2 geom”上使用inherit.aes = FALSE

library(ggplot)

ggplot(tib) + 
  geom_line(aes(x = year, y = meas, group = id, color = id)) +
  geom_point(data = tib2, aes(x = year, y = medi), size = 3, color = 'red')

ggplot(tib, aes(x = year, y = meas, group = id, color = id)) + 
  geom_line() +
  geom_point(data = tib2, aes(x = year, y = medi), size = 3, color = 'red', inherit.aes = FALSE)

或者更优雅地指定ggplot调用中常用的aes,以及其他需要的aes

ggplot(tib, aes(x = year)) + 
  geom_line(aes(y = meas, group = id, color = id)) +
  geom_point(data = tib2, aes(y=medi), size = 3, color = 'red')

reprex package(v0.2.0)于2018年5月8日创建。

vd2z7a6w

vd2z7a6w2#

你可以试试

ggplot(tib, aes(x = year, y = meas, group = id, color = id)) +
   geom_line() +
   stat_summary(fun.y = median, geom="point", aes(group=year), colour = 'red', size = 3)

或按Dash2建议使用

ggplot() +
   geom_line(data=tib, aes(x = year, y = meas, group = id, color = id)) +
   geom_point(data = tib2, aes(x = year, y = medi), colour = 'red', size = 3)

相关问题