【问题标题】:ggplot2: Drop unused factors in a faceted bar plot but not have differing bar widths between facetsggplot2:在分面条形图中删除未使用的因子,但在分面之间没有不同的条形宽度
【发布时间】:2012-07-02 21:57:54
【问题描述】:
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 的底部刻面,条形的宽度与顶部刻面的宽度相同,因此刻面的整体垂直尺寸会减小。

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

赏金更新:

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

【问题讨论】:

  • 对于奖励点:可能是小写的y 而不是Y,以及stat = "identity"
  • 谢谢!不过,不需要身份 arg。
  • facet_wrapspace='free' 参数可能是您正在寻找的。之前有一个完美的问题,但用户删除了它......
  • 不幸的是,space="free" 不适用于 facet_wrap 根据文档以及 joran 的回答的 cmets。

标签: r ggplot2


【解决方案1】:

这个怎么样:

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()

不确定我的算术是否正确,但你明白了。

【讨论】:

  • 聪明!从视觉上看,这看起来是正确的,我正在关注你所做的事情。我看到的问题是,条形的宽度是手动调整的,以补偿刻面之间不同数量的因素。然而,一旦差异更大,这似乎是有问题的,例如,当它的 7 个方面与 2 个方面会发生什么?在这种情况下,我想象底部刻面将有两个宽度合适的条,但有很多空白。这意味着想要调整整体方面的大小,但这似乎是不可能的。
  • @mindless.panda 是的,听起来您正在寻找 space 参数,但我认为 facet_wrap 不存在(目前)。
  • 谢谢 - 现在可以手动调整,希望 facet_wrap 得到 spacelabeller。为了完美起见,我可能会生成单独的图并对齐它们(我假设是通过网格或inkscape,因为我从未真正这样做过)。
【解决方案2】:

如果你对竖线没问题,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)
       )

【讨论】:

    【解决方案3】:

    自最初的问题以来已有五年多的时间,因此认为它应该提供一个更新和更清洁的版本来执行此操作。这大致遵循此处给出的建议: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))
    

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      相关资源
      最近更新 更多