3 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
最簡(jiǎn)單的方法是補(bǔ)充數(shù)據(jù)集,以便每個(gè)組合都存在,即使它具有NA其值。舉一個(gè)更簡(jiǎn)單的例子(因?yàn)槟愕挠泻芏嗖恍枰墓δ埽?/p>
dat <- data.frame(a=rep(LETTERS[1:3],3),
b=rep(letters[1:3],each=3),
v=1:9)[-2,]
ggplot(dat, aes(x=a, y=v, colour=b)) +
geom_bar(aes(fill=b), stat="identity", position="dodge")
這顯示了您要避免的行為:在組“B”中,沒有組“a”,因此條形更寬。補(bǔ)充dat用的所有組合一個(gè)數(shù)據(jù)幀a,并b:
dat.all <- rbind(dat, cbind(expand.grid(a=levels(dat$a), b=levels(dat$b)), v=NA))
ggplot(dat.all, aes(x=a, y=v, colour=b)) +
geom_bar(aes(fill=b), stat="identity", position="dodge")

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
ggplot2 3.0.0中引入的一些新選項(xiàng)position_dodge()和新選項(xiàng)可以提供幫助。position_dodge2()
您可以使用preserve = "single"in position_dodge()來(lái)將寬度基于單個(gè)元素,因此所有條形的寬度將相同。
ggplot(data = d, aes(x = Month, y = Quota, color = "Quota")) +
geom_line(size = 1) +
geom_col(data = d[c(-1:-5),], aes(y = Sepal.Width, fill = Species),
position = position_dodge(preserve = "single") ) +
scale_fill_manual(values = colours)
使用position_dodge2()事物居中的方式進(jìn)行更改,將每組條形圖集中在每個(gè)x軸位置。它有一些padding內(nèi)置,所以padding = 0用來(lái)刪除。
ggplot(data = d, aes(x = Month, y = Quota, color = "Quota")) +
geom_line(size = 1) +
geom_col(data = d[c(-1:-5),], aes(y = Sepal.Width, fill = Species),
position = position_dodge2(preserve = "single", padding = 0) ) +
scale_fill_manual(values = colours)

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
我有同樣的問(wèn)題,但正在尋找一個(gè)適用于pipe(%>%)的解決方案。使用tidyr::spread和tidyr::gather來(lái)自tidyverse訣竅。我使用與@Brian Diggs相同的數(shù)據(jù),但是當(dāng)轉(zhuǎn)換為寬時(shí),大寫變量名稱不會(huì)以雙變量名結(jié)尾:
library(tidyverse)
dat <- data.frame(A = rep(LETTERS[1:3], 3),
B = rep(letters[1:3], each = 3),
V = 1:9)[-2, ]
dat %>%
spread(key = B, value = V, fill = NA) %>% # turn data to wide, using fill = NA to generate missing values
gather(key = B, value = V, -A) %>% # go back to long, with the missings
ggplot(aes(x = A, y = V, fill = B)) +
geom_col(position = position_dodge())
編輯:
實(shí)際上,與管道結(jié)合的問(wèn)題實(shí)際上有一個(gè)更簡(jiǎn)單的解決方案。使用tidyr::complete在一行中給出相同的結(jié)果:
dat %>%
complete(A, B) %>%
ggplot(aes(x = A, y = V, fill = B)) +
geom_col(position = position_dodge())
- 3 回答
- 0 關(guān)注
- 790 瀏覽
添加回答
舉報(bào)