2014-09-05 50 views
2

我想知道是否可以在GGLPOT2(或其他圖形包;我只是喜歡ggplot)中製作分層/分段軸。ggplot中的分層軸?

我想要做的就是取下面的數據,製作一個堆疊的條形圖,其中x軸上有Period,但是在每個週期內,每個動物也是如此。然後,每個動物內的條形的顏色將是「顏色」可變

set.seed(1234) 
data <- data.frame(
    animal = sample(c('bear','tiger','lion'), 50, replace=T), 
    color = sample(c('black','brown','orange'), 50, replace=T), 
    period = sample(c('first','second','third'), 50, replace=T), 
    value = sample(1:100, 50, replace=T)) 

然後把這個成堆積條形圖:

library(ggplot2) 
plot <- ggplot(data, aes(x=period, y=value, fill=color)) + 
    geom_bar(stat='identity') 

將會產生這樣的:

enter image description here

但我真正想要的是,在每個酒吧的時期內,每個動物有三個單獨的堆疊酒吧(按顏色堆疊)。

我有一種感覺,我失去了一段簡單的語法在這裏的,但「明顯」的事情似乎並沒有工作,比如,

plot <- ggplot(data, aes(x=c(period,animal), y=value, fill=color)) + 
    geom_bar(stat='identity') 

回答

4

兩個步驟來這樣做:

  1. 添加group=animal審美情節(動物就告訴組)

  2. 添加position="dodge"geom_bar層(告訴它酒吧應該是獨立的)

這樣:

ggplot(data, aes(x=period, y=value, fill=color, group=animal, color=animal)) + 
     geom_bar(stat="identity", position="dodge") 

這看起來像:

enter image description here

這裏的一個問題是,它並沒有描述哪些動物是其中:有沒有一種特別簡單的方法來解決這個問題。這就是爲什麼我可能會通過刻面使這個情節:

ggplot(data, aes(x=animal, y=value, fill=color)) + geom_bar(stat="identity") + 
    facet_wrap(~ period) 

enter image description here

+0

由於大衛;第一種解決方案就是我在尋找的東西,但考慮到標籤方面的問題,方面包裝效果不錯 – 2014-09-05 17:07:14

+0

@MarcTulla這很好。另一種選擇是'ggplot(data,aes(x = period:animal,y = value,fill = color))+ geom_bar(stat =「identity」)':即將交互項放在x軸上。那是你尋找的更多嗎?如果是的話,我會將其添加到答案中。 – 2014-09-05 17:22:20

2

即使已經有一個很好的答案,我想補充我的解決方案。如果我有3個分類變量,並且我不想使用分面或類似的可視化,我總是使用這種可視化。

這個圖表是由以下代碼製作,即使代碼看起來雜亂,我已經習慣了:-)

基本上我只是用geom_rect畫出我的條形圖

enter image description here

這裏是我的代碼

library(data.table) 
library(ggplot2) 

數據

set.seed(1234) 
data <- data.frame(
animal = sample(c('bear','tiger','lion'), 50, replace=T), 
color = sample(c('black','brown','orange'), 50, replace=T), 
period = sample(c('first','second','third'), 50, replace=T), 
value = sample(1:100, 50, replace=T)) 

只是爲了方便,我更熟悉的data.table與基本data.frame

dt <- as.data.table(data) 

分組的基本數據

groups <- c("period", "animal", "color") 
thevalue <- c("value") 
dt.grouped <- dt[,lapply(.SD, sum), by = groups, .SDcols = thevalue] 

內組

xaxis.inner.member <- unique(dt.grouped$animal) 
xaxis.inner.count <- length(unique(xaxis.inner.member)) 
xaxis.inner.id <- seq(1:xaxis.inner.count) 
setkey(dt.grouped, animal) 
dt.grouped <- dt.grouped[J(xaxis.inner.member, inner.id = xaxis.inner.id)] 

外組

xaxis.outer.member <- unique(dt.grouped$period) 
xaxis.outer.count <- length(unique(xaxis.outer.member)) 
xaxis.outer.id <- seq(1:xaxis.outer.count) 
setkey(dt.grouped, period) 
dt.grouped <- dt.grouped[J(xaxis.outer.member, outer.id = xaxis.outer.id)] 

圖表參數

xaxis.outer.width <- 0.9 
xaxis.inner.width <- (xaxis.outer.width/xaxis.inner.count) 
xaxis.inner.width.adjust <- 0.01/2 

dt.ordered <- dt.grouped[order(outer.id,inner.id, color),] 
dt.ordered[,value.cum := cumsum(value), by = list(period, animal)] 
dt.ordered[,xmin := (outer.id - xaxis.outer.width/2) + xaxis.inner.width * (inner.id - 1) +  xaxis.inner.width.adjust] 
dt.ordered[,xmax := (outer.id - xaxis.outer.width/2) + xaxis.inner.width * inner.id - xaxis.inner.width.adjust] 
dt.ordered[,ymin := value.cum - value] 
dt.ordered[,ymax := value.cum] 

建設data.table爲x軸內

dt.text <- data.table(
period = rep(xaxis.outer.member, each = xaxis.inner.count) 
,animal = rep(xaxis.inner.member, times = xaxis.inner.count) 
) 
setkey(dt.text, animal) 
dt.text <- dt.text[J(xaxis.inner.member,inner.id = xaxis.inner.id),] 
setkey(dt.text, period) 
dt.text <- dt.text[J(xaxis.outer.member,outer.id = xaxis.outer.id),] 
dt.text[, xaxis.inner.label := animal] 
dt.text[, xaxis.inner.label.x := (outer.id - xaxis.outer.width/2) + xaxis.inner.width * inner.id - (xaxis.inner.width/2) ] 

的文本標籤繪圖這裏開始

p <- ggplot() 
p <- p + geom_rect(data = dt.ordered, 
aes(
,x = period 
,xmin = xmin 
,xmax = xmax 
,ymin = ymin 
,ymax = ymax 
,fill = color) 
) 

添加值標籤

p <- p + geom_text(data = dt.ordered, 
aes(
label = value 
,x = (outer.id - xaxis.outer.width/2) + xaxis.inner.width * inner.id - (xaxis.inner.width/2) 
,y = value.cum 
) 
,colour = "black" 
,vjust = 1.5    
) 

添加標籤內x軸

p <- p + geom_text(data = dt.text, 
aes(
label = xaxis.inner.label 
,x = xaxis.inner.label.x 
,y = 0 
) 
,colour = "darkgrey" 
,vjust = 1.5 
) 

最後繪製圖表

p 
+0

這是嚴重的代碼! – geotheory 2015-01-19 16:40:59