ggplot中的分层轴?

时间:2014-09-05 16:25:15

标签: r ggplot2

我想知道是否可以在GGLPOT2(或其他图形包中制作分层/分段轴;我只是喜欢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')

2 个答案:

答案 0 :(得分:5)

执行此操作的两个步骤:

  1. group=animal美学添加到情节中(告诉它按动物分组)

  2. position="dodge"添加到您的geom_bar图层(告诉它应该是独立的条形图)

  3. 因此:

    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

答案 1 :(得分: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]

为内部xaxis

的文本标签构建data.table
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