問題。我的資料集有一個共享的基線(時間點1),有兩個重復測量。后續的點是在2個不同的條件下重復的(即交叉)。在繪圖時,結果、誤差條和資料點會重疊。
library(tidyverse)
set.seed(11)
df_test <-
tibble(group = factor(rep(c("A"。 "B")。 每個= 3)),
時間點 = factor(rep(1。 3, 2)),,
y = c(0。 rnorm(2。 平均= 0, sd = . 2), 0。 rnorm(2, mean = . 7, sd = 0. 35)) %>;%
mutate(ymax =y .2,
ymin = y - .2)
# plot_nododge <-
df_test %> %
ggplot(aes(timepoint, y,)
組 =組,
shape = group,
填充 = group))
geom_linerange(linetype = 1,
aes(ymin = ymin,)
ymax = ymax))
geom_point()
geom_line()

使用position_dodge()的解決方案:該解決方案解決了重疊問題,但 "基線 "點實際上是一個單一的措施。我希望這是一個單一的點,以避免混淆,但仍然要躲避后續的點。
是否有一個單一的點?
是否有一個我所遺漏的簡單解決方案? 我想為每個點使用一個自定義的閃避(例如scale_position_dodge_identity),但位置不被接受為一種美學。 解決方案和擴展*。
也許將來會有更好的東西被開發出來,但現在手動調整位置似乎是最好的。由于點的形狀和顏色也應該反映出不同的 "基線 "測量,而且X軸確實應該有漂亮的標簽,我編輯了一下,以顯示更多的修飾。
最初,我試著設定 uj5u.com熱心網友回復: 一個解決方案是直接在資料集中改變原始點的位置以達到繪圖的目的:
標籤:# plot1 <-
df_test %>%
ggplot(aes(timepoint, y,)
組 =組,
shape = group,
填充 = group))
geom_linerange(linetype = 1,
position= position_dodge(.2),
aes(ymin = ymin,)
ymax = ymax))
geom_point(position = position_dodge(. 2))
geom_line(position = position_dodge(. 2))

df_test %>%
mutate(shape_var =case_when(timepoint == 1 ~ 22。
組 == "A" ~ 21,
group == "B" ~ 24),
fill_var = case_when(timepoint = 1 ~ "black"。
組 == "A" ~ "紅色",
組 == "B" ~ "藍色"),
timepoint2 = as.numeric(as. character(timepoint)),
timepoint2 = timepoint2 0。 05*(timepoint2 > 1 & 組== "B"),
timepoint2 = timepoint2 - 0。 05*(timepoint2 > 1 &。 組 == "A")) %>%
ggplot(aes(timepoint2, y,
組 =組,
shape = shape_var,
fill = fill_var)
geom_linerange(aes(ymin = ymin,)
ymax = ymax))
geom_line()
geom_point(size = 2)
scale_x_continuous(breakaks = 1。 3, # 限制在選定的時間點。
標簽 = c("baseline"。 "時間1"。 "時間2"), #標簽像一個離散的尺度。
limits = c(.75, 3。 25)) # give it some room
scale_shape_identity(guide = "legend"/span>,
名稱 = "處理",
休息 = c(21。 24), # 也定義了傳奇順序。只標注治療組
labels = c("A"。 "B" ) #這部分很棘手 - 可以很容易地將它們顛倒過來。
scale_fill_identity(guide = "legend">,
名稱 = "處理",
突破 = c("red"。 "blue"),#也定義了圖例順序。只標注治療組
labels = c("A"/span>。 "B" ) #這部分很棘手--可以很容易地將它們顛倒過來。
labs(x=NULL)

width = c(0, 0.2, 0.2),但這沒有達到預期的效果:?position_dodge沒有明確解釋使用一串數值作為躲避的寬度,所以我不知道為什么當你使用0作為寬度時它不作業。一個0.000001的值 "足夠接近 "零,以至于你無法通過看圖來判斷,所以希望這就足夠了。
df_test %>%
mutate(timepoint = as.numeric(as. character(timepoint)) %>%
突變(時間點=時間點 0。 1*(時間點> 1 & 組 == "B")) %>%
ggplot(aes(timepoint, y,)
組 =組,
shape = group,
填充 = group))
geom_linerange(linetype = 1,
aes(ymin = ymin,)
ymax = ymax))
scale_x_continuous(breaks = unique(as. 數字(as. character(df_test$timepoint))))
geom_point()
geom_line()



