我的代码结果有问题:
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 层,代码可以正常工作,但没有安装线性模型。
提前致谢!
通过这样做,您应该能够实现您正在寻找的结果。
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
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')