繁体   English   中英

在ggplot2中使用coord_flip()和facet_wrap(scales =“free_y”)似乎给出了意想不到的facet轴刻度标记和刻度标签

[英]Using coord_flip() with facet_wrap(scales = “free_y”) in ggplot2 seems to give unexpected facet axis tick marks and tick labels

我试图创建一个带有翻转坐标的刻面图,其中一个且只有一个轴可以为每个面改变:

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

所以我的问题是:有没有办法去除右刻面的垂直轴刻度线,并在顶面添加水平轴刻度线和标签?

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

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

图片

这些面具有可变的水平轴,但是重复的垂直轴刻度标记而不是重复的水平轴刻度标记。 我不认为保罗的伎俩会在这里起作用,因为与散点图不同,条形图不是旋转对称的。

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

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

在你的第一个例子中,我建议不要使用coord_flip ,而只是在调用qplot和使用free_x交换变量:

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

在此输入图像描述

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

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'来实现此功能。 如果你需要使用身份以外的位置,那么你必须编辑碰撞功能才能正常工作。

我刚刚尝试做一个水平的条形图,遇到这个问题我想要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))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM