将平滑线绘制到预定截止值时 ggplot 中出现错误

问题描述 投票:0回答:2

我的代码结果有问题:

ggplot(df, aes(x=DOGUM_YIL)) +
geom_point(aes(y=percent_male), color="red") +
geom_point(aes(y=percent_female), color="blue") +
geom_smooth(data = stats::filter(percent_male, DOGUM_YIL \<= 1998), method = "lm")+
geom_smooth(data = stats::filter(percent_male, DOGUM_YIL \> 1998), method = "lm")+                                                                     geom_smooth(data = stats::filter(percent_female, DOGUM_YIL \<= 1998), method = "lm")+
geom_smooth(data = stats::filter(percent_female, DOGUM_YIL \> 1998), method = "lm") +
geom_vline(xintercept = 1998) +
labs(x = "birth year", y = "percent at least highschool graduate (Male & Female)")

其中 df 是一个数据框,如下:

df = tibble::tribble( ~DOGUM_YIL,   ~percent_male, ~percent_female,
                      1987, 75.95,  86.29,
                      1988, 76.45,  81.87,
                      1989, 78.74,  85.99,
                      1990, 80.72,  88.75,
                      1991, 73.70,  87.74,
                      1992, 72.48,  82.53,
                      1993, 73.59,  85.27,
                      1994, 71.97,  83.94,
                      1995, 67.04,  78.92,
                      1996, 76.45,  70.16,
                      1997, 46.59,  59.05,
                      1998, 39.74,  59.09,
                      1999, 35.34,  49.55,
                      2000, 30.31,  39.73,
                      2001, 28.4,   36.74,
                      2002, 20.57,  24.29,
                      2003, 10.59,  8.66,
                      2004, 5.03,   4.62,
                      2005,     0,     0)

当我运行代码时,我不断收到

Error in `fortify()`:
! `data` must be a <data.frame>, or an object coercible by `fortify()`, or a valid <data.frame>-like object coercible by
  `as.data.frame()`.
Caused by error in `.prevalidate_data_frame_like_object()`:
! `dim(data)` must return an <integer> of length 2.
Backtrace:
  1. ggplot2::geom_smooth(...)
  2. ggplot2::layer(...)
  4. ggplot2:::fortify.default(data)
 11. ggplot2:::validate_as_data_frame(model)
 12. ggplot2:::.prevalidate_data_frame_like_object(data)

我想要在同一张图表上实现男性和女性的两个散点图,以及适合 1998 年截止值两侧的线性模型。

我还尝试使用管道运算符并将代码转换为:

plot <- df %>% ggplot() + 
geom_point(aes(x=df$DOGUM_YIL, y=df$percent_male), color="red") +
geom_point(aes(x=df$DOGUM_YIL, y=df$percent_female), color="blue") +
geom_smooth(data = stats::filter(df$percent_male, df$DOGUM_YIL <= 1998), method = "lm")+ 
geom_smooth(data = stats::filter(df$percent_male, df$DOGUM_YIL > 1998), method = "lm")+                           geom_smooth(data = stats::filter(df$percent_female, df$DOGUM_YIL <= 1998), method = "lm")+
geom_smooth(data = stats::filter(df$percent_female, df$DOGUM_YIL > 1998), method = "lm") +
geom_vline(xintercept = 1998) +
labs(x = "birth year", y = "percent at least highschool graduate (Male & Female)")

但这并没有帮助:((

没有 geom_smooth 层,代码可以正常工作,但没有安装线性模型。

提前致谢!

ggplot2 fortify
2个回答
0
投票

通过这样做,您应该能够实现您正在寻找的结果。

library(tidyverse)
                      

long_data = df |> 
  pivot_longer(cols = c(percent_female, percent_male),
               names_to = "gender",
               values_to = "percent") |> 
  mutate(gender = case_when(gender == "percent_female" ~ "Female",
                            gender == "percent_male" ~ "Male"))


ggplot(long_data, aes(x = DOGUM_YIL, y = percent, color = gender)) +
  geom_point() +
  geom_smooth(method = 'lm') +
  geom_vline(xintercept = 1998)
#> `geom_smooth()` using formula = 'y ~ x'

创建于 2024-05-10,使用 reprex v2.1.0


0
投票

ggplot2
通常最适合长结构的数据。您可以
subset
旋转数据来添加单独的线性模型。

library(tidyverse)

df2 <- df |>
  pivot_longer(-DOGUM_YIL, names_to = 'sex', values_to = 'percent') |>
  mutate(sex = factor(sex, labels = c('Female', 'Male')))
  
df2 |> ggplot(aes(x = DOGUM_YIL, y = percent, color = sex)) +
  geom_point() +
  geom_smooth(data = subset(df2, DOGUM_YIL <= 1998), method = "lm") +
  geom_smooth(data = subset(df2, DOGUM_YIL > 1998), method = "lm") +
  geom_vline(xintercept = 1998) +
  scale_x_continuous(breaks = scales::extended_breaks(n = 8)) +
  labs(x = 'birth year',
       y = "percent at least highschool graduate (Male & Female)") +
  theme(legend.position = 'bottom')

© www.soinside.com 2019 - 2024. All rights reserved.