2

我正在尝试生成一个条形图,其中条形图根据第三个变量垂直淡化,并且我正在使用 geom_tile 来启用它。但是,对于 x 轴上的给定类别,我有多个条形图,我想避开它们的位置以将相同的 x 值放在不重叠的条形组中。

是否可以使用position='dodge'或类似geom_tile,如果可以,我的语法有什么问题?

a <- data.frame(x = factor(c(rep('a',5), rep('a',5), rep('b',5), rep('c',5))),
                y = c(1:5, 1:5, 1:5, 1:5),
                z = c(5:1, c(5,4,4,4,1), 5:1, 5:1)
                )

ggplot(a, aes(x = x, y = y, group = x)) +
  geom_tile(aes(alpha = z, fill = x, width = 1),
            position = 'dodge')

示例数据框a如下所示:

x y z
1  a 1 5
2  a 2 4
3  a 3 3
4  a 4 2
5  a 5 1
6  a 1 5
7  a 2 4
8  a 3 4
9  a 4 4
10 a 5 1
11 b 1 5
12 b 2 4
13 b 3 3
14 b 4 2
15 b 5 1
16 c 1 5
17 c 2 4
18 c 3 3
19 c 4 2
20 c 5 1

...并且当前代码的结果图在 x 值之间没有间隙,并且 x 为 a 的两个值彼此叠加:

在此处输入图像描述

我希望将 x 为“a”的那两个条绘制为单独的条。

这是我希望结果看起来像的模型。任一 a 列的数据都不正确,但它显示了所需的 x 轴上的分组:

在此处输入图像描述

4

1 回答 1

1

编辑 2

要获得您想要的效果,请使用geom_bar()但一定要更改y数据以指示条形高度,在本例中为 1。原因是条形堆叠,因此无需指定 y 轴位置,而是指定高度。_

尝试这个:

library(ggplot2)
a <- data.frame(x = factor(c(rep('a',5), rep('a',5), rep('b',5), rep('c',5))),
                y = 1,
                z = c(5:1, c(5,4,4,4,1), 5:1, 5:1)
)

a$bar <- rep(1:4, each=5)

ggplot(a, aes(x = factor(bar), y=y, fill=x, alpha=z)) + 
  geom_bar(stat="identity") +
  facet_grid(~x, space="free", scale="free")

你应该得到:

在此处输入图像描述


编辑 1

您可以通过以下方式接近您所描述的内容:

  • 显式添加另一列来区分同一类别中的不同条形
  • 使用刻面

例如:

a$bar <- rep(1:4, each=5)

ggplot(a, aes(x = factor(bar), y = y, fill=x, alpha=z)) + 
  geom_bar(stat="identity", position="dodge") +
  facet_grid(~x, space="free", scale="free")

在此处输入图像描述


原来的

您可以通过geom_bar()以下方式使用stat="identity"

ggplot(a, aes(x = x, y = y, fill=x, alpha=z)) + 
  geom_bar(stat="identity", position="dodge")

在此处输入图像描述

于 2013-07-04T13:28:35.890 回答