12

我正在尝试创建一个带有翻转坐标的多面图,其中一个且只有一个轴允许为每个方面变化:

require(ggplot2)
p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl, scales = "free_y") + coord_flip()

在此处输入图像描述

这个图对我来说并不满意,因为每个图都重复了错误的刻度线和刻度线标签。我想要每个水平轴上的刻度线而不是每个垂直轴上的刻度线。

这是出乎意料的行为,因为该图暗示顶部面板的水平轴刻度线与底部面板的水平轴刻度线相同,但事实并非如此。要查看此运行:

p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl, scales = "fixed") + coord_flip()

所以我的问题是:有没有办法删除右侧刻面的垂直轴刻度线并将水平轴刻度线和标签添加到顶部刻面?

正如 Paul 在下面有见地指出的那样,我给出的示例可以通过在 qplot() 中交换 x 和 y 并避免 coord_flip() 来解决,但是这不适用于所有几何图形,例如,如果我想要一个免费的水平刻面条形图我可以运行的水平轴:

c <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
c + facet_wrap(~cut, scales = "free_y") + coord_flip()

图片

这些构面具有可变的水平轴,但重复的垂直轴刻度线而不是重复的水平轴刻度线。我认为 Paul 的技巧在这里不会奏效,因为与散点图不同,条形图不是旋转对称的。

我很想听到任何部分或完整的解决方案。

4

3 回答 3

8

coord_flip结合使用是facet_wrap问题所在。首先,您将某个轴定义为自由轴(x轴),然后交换轴,使y轴自由。现在这在 ggplot2 中没有很好地再现。

在您的第一个示例中,我建议不要使用coord_flip,而只是在您的调用中交换变量qplot,并使用free_x

p <- qplot(hwy, displ, data = mpg)
p + facet_wrap(~ cyl, scales = "free_x")

在此处输入图像描述

于 2012-09-24T07:53:08.950 回答
6

这是我自己第二次或第三次遇到这个问题。我发现我可以通过定义自定义几何来破解自己的解决方案。

geom_bar_horz <- function (mapping = NULL, data = NULL, stat = "bin", position = "stack", ...) {
  GeomBar_horz$new(mapping = mapping, data = data, stat = stat, position = position, ...)
}

GeomBar_horz <- proto(ggplot2:::Geom, {
  objname <- "bar_horz"

  default_stat <- function(.) StatBin
  default_pos <- function(.) PositionStack
  default_aes <- function(.) aes(colour=NA, fill="grey20", size=0.5, linetype=1, weight = 1, alpha = NA)

  required_aes <- c("y")

  reparameterise <- function(., df, params) {
    df$width <- df$width %||%
      params$width %||% (resolution(df$x, FALSE) * 0.9)
    OUT <- transform(df,
              xmin = pmin(x, 0), xmax = pmax(x, 0),
              ymin = y - .45, ymax = y + .45, width = NULL
    )
    return(OUT)
  }

  draw_groups <- function(., data, scales, coordinates, ...) {
    GeomRect$draw_groups(data, scales, coordinates, ...)
  }
  guide_geom <- function(.) "polygon"
})

这只是从 ggplot2 github 复制 geom_bar 代码,然后切换xy引用以在标准笛卡尔坐标系中制作水平条形图。

请注意,您必须使用position='identity'并且可能还stat='identity'为此工作。如果您需要使用身份以外的位置,则必须编辑碰撞功能才能使其正常工作。

于 2014-07-10T21:19:35.770 回答
2

我一直在尝试做一个水平条形图,并在我想要的地方遇到了这个问题scales = "free_x"。最后,创建常规(垂直)条形图似乎更容易,旋转文本,这样如果你把头向左倾斜,它看起来就像你想要的图。然后,一旦你的情节完成,旋转 PDF/图像输出(!)

ggplot(data, aes(x, y)) +
  geom_bar(stat = "identity") +
  facet_grid(var ~ group, scale = "free", space = "free_x", switch = "both") +
  theme(axis.text.y  = element_text(angle=90), axis.text.x = element_text(angle = 90),
                     strip.text.x = element_text(angle = 180))

执行此操作的主要键是 to switch = "both",它将分面标签移动到另一个轴,以及element_text(angle=90)旋转轴标签和文本。

于 2015-10-23T01:39:14.457 回答