我有一個包含 3 列的資料框,我想使用 geom_raster 顯示其中的 x 軸、y 軸和填充都包含分類值。我的原始資料集的目標是顯示帶有填充的重疊資料,并顯示 x 軸沒有保存資料的位置。對于 x 和 y 的某些組合,可能會應用多個填充,但是,geom_raster 僅在最后一次填充時填充單元格。相反,我想堆疊類似于百分比堆疊條形圖的所有填充,如果只應用一個填充,則用該顏色填充整個單元格。但是,如果應用了 3 個填充值,則在所有三種顏色中平均填充其堆疊,即每種顏色 33%。
對于我的示例資料集,我模擬了 26 人之間的 2 場鐵人三項比賽,他們被分配了第一、最后或第二的速度(156 個人事件 = 26 人 x 3 事件 x 2 比賽)。然后我通過將 NA 值分配給 26 個隨機位置來隨機分配非完成。然后,我創建一個柵格,顯示每個人在組合比賽的每個事件中的位置,并根據他們完成“第一”、“第二”或“最后”來著色。如果它們沒有為事件放置,這也會導致空(白色)單元格。將 x 軸作為人,將 y 軸作為鐵人三項中的 3 個事件,這將創建一個包含 78 個像元的柵格。對于這個最小示例,我的目標是根據每場比賽的完成情況來堆疊每個單元格的填充。由于該資料集包含 2 場鐵人三項比賽,因此每個單元格有 2 次可能的填充。如果一個人為給定的事件放置相同的位置,那么它應該是相同的顏色。如果它們的位置不同,則應將單元格分成 2 部分,每個位置使用一種顏色。目前,代碼根據最后出現的值填充整個單元格(例如,它們在第二場比賽中的位置)。例如,“A”在第一場比賽中騎自行車排名第二,但在第二場比賽中沒有完成,在第一場比賽中排名第一,在第二場比賽中排名最后,在第一場比賽中游泳排名第二,但沒有完成在最后一場比賽中的位置。但是,光柵顯示人 A 沒有完成游泳,排在最后,沒有完成騎自行車。如何為 geom_raster 中的單元格堆疊填充?如果它們的位置不同,則應將單元格分成 2 部分,每個位置使用一種顏色。目前,代碼根據最后出現的值填充整個單元格(例如,它們在第二場比賽中的位置)。例如,“A”在第一場比賽中騎自行車排名第二,但在第二場比賽中沒有完成,在第一場比賽中排名第一,在第二場比賽中排名最后,在第一場比賽中游泳排名第二,但沒有完成在最后一場比賽中的位置。但是,光柵顯示人 A 沒有完成游泳,排在最后,沒有完成騎自行車。如何為 geom_raster 中的單元格堆疊填充?如果它們的位置不同,則應將單元格分成 2 部分,每個位置使用一種顏色。目前,代碼根據最后出現的值填充整個單元格(例如,它們在第二場比賽中的位置)。例如,“A”在第一場比賽中騎自行車排名第二,但在第二場比賽中沒有完成,在第一場比賽中排名第一,在第二場比賽中排名最后,在第一場比賽中游泳排名第二,但沒有完成在最后一場比賽中的位置。但是,光柵顯示人 A 沒有完成游泳,排在最后,沒有完成騎自行車。如何為 geom_raster 中的單元格堆疊填充?第一場自行車賽第二,第二場沒有完賽,第一場跑步第一,第二場最后,第一場游泳第二,最后一場沒有。但是,光柵顯示人 A 沒有完成游泳,排在最后,沒有完成騎自行車。如何為 geom_raster 中的單元格堆疊填充?第一場自行車賽第二,第二場沒有完賽,第一場跑步第一,第二場最后,第一場游泳第二,最后一場沒有。但是,光柵顯示人 A 沒有完成游泳,排在最后,沒有完成騎自行車。如何為 geom_raster 中的單元格堆疊填充?
我想要在代碼中的一個重要部分是確保單元格的大小都是相同的。因此,如果有人參加了 10 場比賽,他們的單元格將有 10 個可能的填充,而參加 3 場比賽的人只有 3 個。但他們的單元格的整體大小應該相同。或者例如對于上面的資料集,如果我們洗掉了沒有完成的地方,df %>% drop_na(),具有 2 個值的單元格應該與具有 1 個值的單元格大小相同。
可重現的代碼
#num races
num_races = 2
#create fake data
#make the random speed below reproducible
set.seed(001)
df <- data.frame(
person = rep(LETTERS,3*num_races),
event = rep(c('swim','run','bike'),26*num_races),
place = sample(rep(c('first','second','last'),26*num_races)))
#set some random did not finish
set.seed(001)
df$place[sample(1:156,26)] <- NA
#Person A had multiple speeds for running, raster colors by the final occurng place
df %>%
filter(person == 'A') %>%
arrange(event)
#create the raster
df %>%
ggplot(aes(x=person, y=event))
geom_raster(aes(fill=place))
scale_x_discrete(position="top")
scale_y_discrete(expand = c(0,0))
geom_hline(yintercept = c(1:2 0.5), size=0.7)
scale_fill_manual(values = c("first"="green","second"="blue",
"last"="red"),
na.value = "white")
labs(x="Person", y="Event")
theme_classic()
theme(axis.text.y=element_text(size=9),
axis.title = element_text(size=18),
panel.border = element_rect(fill=NA, size=0.7))
當前圖表

在 Photoshop 中修改圖表以顯示我想要的人 A
但是以編程方式為所有人執行此操作。我降低了其他所有內容的不透明度,以專注于我手動修改的人 A。

類似問題
我發現
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462769.html
上一篇:如何在不硬編碼正方形的情況下在三角形的每一邊制作正方形?
下一篇:使用ggplot2反轉輔助y軸圖
