ggplot2:翻转轴并保持数据的纵横比

时间:2017-02-08 14:19:51

标签: r plot ggplot2

在ggplot2中,coord_fixed()坐标系确保数据的宽高比保持在给定值。因此,面板的形状会发生变化,以保持数据的形状。同时coord_flip()交换图的轴。但是,ggplot2中的绘图必须只有一个坐标系,因此这些功能无法组合。

我的问题是:

  

是否存在将coord_fixed()coord_flip()的行为结合起来的方法,从而产生交换了x轴和y轴的坐标系以及数据的固定纵横比?

这是一个很受欢迎的问题,但常见的答案是错误的:

通常建议的答案是将coord_flip()theme(aspect.ratio = 1)一起使用,而不是coord_fixed()。但是,根据ggplot2文档,此设置指的是“面板的宽高比”。因此,数据将改变形状以保持面板的形状。

我怀疑这是ggplot2中目前不存在的功能。但更重要的是,我认为应该记录正确的解决方案或至少回答这个问题。

问题的快速最小示例:

library(ggplot2)
x <- 1:100; data <- data.frame(x = x, y = x * 2)
p <- ggplot(data, aes(x, y)) + geom_point()

p # by default panel and data both fit to device window
p + coord_fixed() # panel changes shape to maintain shape of data
p + theme(aspect.ratio = 1) # data changes shape to maintain shape of panel
p + coord_fixed() + coord_flip() # coord_flip() overwrites coord_fixed()

# popular suggested answer does not maintain aspect ratio of data:
p + coord_flip() + theme(aspect.ratio = 1)

2 个答案:

答案 0 :(得分:4)

我同意theme解决方案不是真正正确的解决方案。这是一个通过计算绘图对象中存储的实际轴范围的方面以编程方式工作的解决方案,但需要几行代码:

ranges <- ggplot_build(p)$layout$panel_ranges[[1]][c('x.range', 'y.range')]
sizes <- sapply(ranges, diff)
aspect <- sizes[1] / sizes[2]

p + coord_flip() + theme(aspect.ratio = aspect)

enter image description here

我可能在实践中使用的解决方案是使用ggstance包中的水平geoms(虽然这可能并不总是可行)。

注意:这只会给出两个连续音阶的精确正确答案,并且具有相等的乘法extend参数(即默认值)。

答案 1 :(得分:0)

我最终只是翻转了 x 规范中的 yaes 参数。例如,而不是:

ggplot(mtcars,aes(x=wt,y=drat))+geom_point()+coord_fixed()

我做到了:

ggplot(mtcars,aes(x=drat,y=wt))+geom_point()+coord_fixed()