我试图创建一个带有翻转坐标的刻面图,其中一个且只有一个轴可以为每个面改变:
require(ggplot2)
p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl, scales = "free_y") + coord_flip()
Run Code Online (Sandbox Code Playgroud)
这个图对我来说并不令人满意,因为每个图都会重复出现错误的刻度线和刻度标签.我希望每个水平轴上都有刻度线,而不是每个垂直轴上.
这是出乎意料的行为,因为该图表示顶部面板的水平轴刻度标记与底部面板相同,但它们不是.要查看此运行:
p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl, scales = "fixed") + coord_flip()
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:有没有办法去除右刻面的垂直轴刻度线,并在顶面添加水平轴刻度线和标签?
正如保罗在下面深刻指出的那样,我给出的例子可以通过在qplot()中交换x和y并避免coord_flip()来解决,但是这并不适用于所有的geoms,例如,如果我想要一个免费的水平多面条形图水平轴我可以运行:
c <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
c + facet_wrap(~cut, scales = "free_y") + coord_flip()
Run Code Online (Sandbox Code Playgroud)
这些面具有可变的水平轴,但是重复的垂直轴刻度标记而不是重复的水平轴刻度标记.我不认为保罗的伎俩会在这里起作用,因为与散点图不同,条形图不是旋转对称的.
我很想听听任何部分或完整的解决方案.
使用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")
Run Code Online (Sandbox Code Playgroud)
这是我第二次或第三次遇到这个问题.我发现我可以通过定义自定义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"
})
Run Code Online (Sandbox Code Playgroud)
这只是从ggplot2 github复制geom_bar代码,然后切换x和y引用以在标准笛卡尔坐标系中创建水平条形图.
请注意,您必须使用position='identity'
并且可能也可以stat='identity'
使用此功能.如果你需要使用身份以外的位置,那么你必须编辑碰撞功能才能使其正常工作.