我有這張表,其中包含三個分類變數和一個數值變數:
df <- structure(list(Q = c("q_pol", "q_wh", "q_pol", "q_wh"),
median_all = c(0.667362125626559, 0.624735641188929, 0.548153075210995, 0.398574206026083),
median_half = c(-0.350314785114947,1.42461790732669, 0.372537880024059, 0.44085155122463),
median_third = c(-0.93389146143506,0.236025246988988, -1.02912771930043, 0.0361894830862238),
median_quart = c(-0.112157689065904, 0.704777764871505, -0.848709176683769, 1.24452019211073),
Partcpt = c("Not_Answerer", "Not_Answerer", "Answerer", "Answerer")),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L))
我想可視化median*列中的值如何分布在三個分類變數上,使用geom_smooth. 為了到達那里,我一直在這樣做:
library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)
df %>%
# cast all `median*`variables longer:
pivot_longer(-c(Q, Partcpt)) %>%
# rename:
rename(slope_range = name) %>%
# simplify labels:
mutate(slope_range = str_replace(slope_range, ".*_(.*)$", "\\1")) %>%
# convert slope_range to numerical variable:
mutate(slope_range_N = case_when(
slope_range == "all" ~ 1,
slope_range == "half" ~ 2,
slope_range == "third" ~ 3,
TRUE ~ 4)
) %>%
# plot:
ggplot(
aes(x = slope_range_N, y = value, color = Q))
geom_smooth(method = "loess")
這里有兩個問題:首先,轉換slope_range為數字似乎不專業;其次,更重要的是,生成的圖沒有顯示valueby的分布Partcpt。如何將其作為情節中的第四個變數包含在內?

編輯:
也許以下內容有助于解決方案,基本思想是將Q值和Partcpt值轉換為單個列(而不是兩個不同的列):
# df with `Q`:
df_Q <- df1 %>%
select(Q, slope_range, value, slope_range_N) %>%
rename(Cat = Q)
# df with `Partcpt`
df_Partcpt <- df1 %>%
select(Partcpt, slope_range, value, slope_range_N) %>%
rename(Cat = Partcpt)
# bind:
plot_df <- bind_rows(df_Q, df_Partcpt)
# plot:
ggplot(plot_df,
aes(x = slope_range_N, y = value, color = Cat))
geom_smooth(method = "loess", span = 0.4, se = FALSE)
Just how to have merely two colors for the two Qvalues and two line types for the two Partcptvalues, I don't know.

uj5u.com熱心網友回復:
這部分只是對資料爭論的改進。看起來您過度考慮/過度設計了您的流程。當您重塑資料時,從斜率變數的因子水平中獲取數字,您可以在pivot_longer. 然后映射到線型。需要注意的一點是,每個斜率-參與者-Q 組合只有一個觀察結果,因此您的 LOESS 模型在觀察結果如此之少的情況下并不完全合適(您會收到大量關于此的警告)。如果需要,您可以改為使用樣條曲線。
library(dplyr)
library(tidyr)
library(ggplot2)
df_long <- df %>%
pivot_longer(c(-Q, -Partcpt), names_to = "slope_range",
names_transform = list(slope_range = ~as.numeric(as.factor(.))))
ggplot(df_long, aes(x = slope_range, y = value, color = Q, linetype = Partcpt))
geom_smooth(method = loess, se = FALSE)
guides(linetype = guide_legend(override.aes = list(color = "black")))

loess如果需要,您可以將引數傳遞給。但是,通常對于這樣的事情,我通常更喜歡自己在更大的范圍內進行建模。我認為這類似于geom_smooth引擎蓋下的操作,但直接訪問它可能很有用。在這里,我將為每個 Q 參與者組合制作 LOESS 模型,然后使用這些模型來預測slope_range. 然后geom_line直接使用。geom_smooth和之間的默認線寬不同geom_line,但您可以輕松調整。
df_modeled <- df_long %>%
group_by(Q, Partcpt) %>%
nest() %>%
mutate(loess_mod = purrr::map(data, ~loess(value ~ slope_range, data = .)),
x = purrr::map(data, ~seq(min(.$slope_range), max(.$slope_range), by = 0.1)),
pred = purrr::map(loess_mod, ~predict(., newdata = unlist(x)))) %>%
unnest(pred, x)
head(df_modeled)
#> # A tibble: 6 × 6
#> # Groups: Q, Partcpt [1]
#> Q Partcpt data loess_mod x pred
#> <chr> <chr> <list> <list> <dbl> <dbl>
#> 1 q_pol Not_Answerer <tibble [4 × 2]> <loess> 1 0.667
#> 2 q_pol Not_Answerer <tibble [4 × 2]> <loess> 1.1 0.598
#> 3 q_pol Not_Answerer <tibble [4 × 2]> <loess> 1.2 0.496
#> 4 q_pol Not_Answerer <tibble [4 × 2]> <loess> 1.3 0.373
#> 5 q_pol Not_Answerer <tibble [4 × 2]> <loess> 1.4 0.236
#> 6 q_pol Not_Answerer <tibble [4 × 2]> <loess> 1.5 0.0949
ggplot(df_modeled, aes(x = x, y = pred, color = Q, linetype = Partcpt))
geom_line()
guides(linetype = guide_legend(override.aes = list(color = "black")))

uj5u.com熱心網友回復:
在編輯之前,我可以通過 Partcpt 映射線型來獲得兩種顏色的四條線和虛線與實線。我所做的只是添加linetype=Partcpt到aes()通話中。
library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)
df %>%
# cast all `median*`variables longer:
pivot_longer(-c(Q, Partcpt)) %>%
# rename:
rename(slope_range = name) %>%
# simplify labels:
mutate(slope_range = str_replace(slope_range, ".*_(.*)$", "\\1")) %>%
# convert slope_range to numerical variable:
mutate(slope_range_N = case_when(
slope_range == "all" ~ 1,
slope_range == "half" ~ 2,
slope_range == "third" ~ 3,
TRUE ~ 4)
) %>%
# plot:
ggplot(
aes(x = slope_range_N, y = value, color = Q, linetype=Partcpt))
geom_smooth(method = "loess", se=FALSE)
scale_color_manual(values = c("black", "grey")) # Line changes colours
繪圖輸出如下所示:

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/407010.html
標籤:
上一篇:ggplot2沒有繪制所有點
