18
df <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L), .Label = c("1", 
"2", "3", "4", "5", "6", "7"), class = "factor"), TYPE = structure(c(1L, 
2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 
1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 
5L, 6L, 1L, 2L, 3L), .Label = c("1", "2", "3", "4", "5", "6", 
"7", "8"), class = "factor"), TIME = structure(c(2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L), .Label = c("1", "5", "15"), class = "factor"), VAL = c(0.937377670081332, 
0.522220720537007, 0.278690102742985, 0.967633064137772, 0.116124767344445, 
0.0544306698720902, 0.470229141646996, 0.62017166428268, 0.195459847105667, 
0.732876230962574, 0.996336271753535, 0.983087373664603, 0.666449476964772, 
0.291554537601769, 0.167933790013194, 0.860138458199799, 0.172361251665279, 
0.833266809117049, 0.620465772924945, 0.786503327777609, 0.761877260869369, 
0.425386636285111, 0.612077651312575, 0.178726130630821, 0.528709076810628, 
0.492527724476531, 0.472576208412647, 0.0702785139437765, 0.696220921119675, 
0.230852259788662, 0.359884874196723, 0.518227979075164, 0.259466265095398, 
0.149970305617899, 0.00682218233123422, 0.463400925742462, 0.924704828299582, 
0.229068386601284)), .Names = c("ID", "TYPE", "TIME", "VAL"), row.names = c(NA, 
-38L), class = "data.frame")

如果我创建以下情节:

ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
  facet_wrap(~ TIME, ncol=1) +
  geom_bar(position="stack") +
  coord_flip()

阴谋

然后,我决定理想情况下我希望禁止在没有任何数据的方面显示任何因素。我已经引用了各种问题和答案,这些问题和答案说该scale="free"方法是要走的路(而不是drop=TRUE会丢弃与 中未使用的值相对应的空方面TIME),所以接下来:

ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
  facet_wrap(~TIME, ncol=1, scale="free") +
  geom_bar(position="stack") +
  coord_flip()

阴谋

我的问题是如何防止对具有 4 个条形的刻面与具有 3 个条形的刻面发生条形的重新缩放。在这个人为的例子中效果很微妙,我的实际数据更糟。理想的输出将在垂直轴上具有 ID 因子 1、4 和 6 的底部刻面,条形的宽度与顶部刻面的宽度相同,因此刻面的整体垂直尺寸会减小。

如果你能帮助我解释为什么计数而不是数值是堆叠的,那么奖励积分(现在已修复)

赏金更新:

正如我在后续问题中提到的,看起来更好的解决方案可能涉及使用ggplot_buildggplot_table修改 gtable 对象。我很确定我可以在给定时间的情况下解决这个问题,但我希望赏金可能会激励其他人帮助我。Koshke 已经发布了一些这样的例子

4

3 回答 3

16

这个怎么样:

df$w <- 0.9
df$w[df$TIME == 5] <- 0.9 * 3/4
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
   facet_wrap(~TIME, ncol=1, scale="free") +
   geom_bar(position="stack",aes(width = w),stat = "identity") +
   coord_flip()

在此处输入图像描述

不确定我是否掌握了算术,但你明白了。

于 2012-07-02T22:40:49.037 回答
12

如果您对垂直条没问题, facet_grid 可以完美运行:

ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
  facet_grid(.~TIME, scale="free_x", space = "free_x") +
  geom_bar(position="stack")

在此处输入图像描述

更进一步,您可以旋转图表的所有元素。现在,如果您将头转动 90°,您就会得到您想要的 :-)

ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
  facet_grid(.~TIME, scale="free_x", space = "free_x") +
  geom_bar(position="stack") +
  opts(legend.text = theme_text(angle=90),
       legend.title = theme_text(angle=90),
       strip.text.x = theme_text(angle=90),
       axis.text.x = theme_text(angle=90),
       axis.text.y = theme_text(angle=90),
       axis.title.x = theme_text(angle=90)
       )

在此处输入图像描述

于 2012-07-24T07:55:16.363 回答
7

自最初的问题以来已有五年多的时间,因此认为它应该提供一个更新和更清洁的版本。这大致遵循此处给出的建议:http: //ggplot2.tidyverse.org/reference/facet_grid.html

两个关键参数是space="free_y"允许每个面板的高度与比例尺的长度成比例,scales="free_y"并且允许比例尺针对每一列而变化。

coord_flip()允许水平绘制条形图,并且作为个人喜好,刻面的标签在theme选项中旋转。

ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
  geom_bar(stat="identity") +
  coord_flip() +
  facet_grid(TIME~., scales = "free_y", space = "free_y") +
  theme(strip.text.y = element_text(angle = 0))

在此处输入图像描述

于 2017-10-29T17:20:38.550 回答