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

8
在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个回答

6

我同意主题解决方案并不是一个真正的解决方案。这里提供了一个通过计算图表对象中存储的实际轴范围来计算宽高比并能够工作的解决方案,但需要几行代码:

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包中的水平几何图形解决问题(尽管这可能并不总是可行的)。

注意:这只适用于具有相等乘法extend参数的两个连续比例尺的精确正确答案(即默认值)。

编辑:在许多情况下,我建议使用coord_equalggstance包相结合,而不是使用此解决方案。


谢谢,我认为这个解决方案是目前最好的。 (但是关于你的第一句话 - “主题”解决方案是错误的,不需要任何资格。我正在查看空间数据,了解数据是否以其真实形状显示非常重要。 “主题”解决方案可能会产生相反的效果并进一步扭曲数据。) - mb7744
@mb7744,我只是在指出对于“许多”人来说(但肯定不是所有人),原始解决方案是可以的。我并不反对你(这就是为什么我回答了这个问题)。 - Axeman
当然可以——但我的理解是,这种方法只适用于那些没有注意到差异并误解了他们的情节的人。我认为这就是为什么关于此问题的最后两个SO问题有错误的被接受答案的原因。但这只是我吹毛求疵。我很感激你的解决方案! - mb7744

1

我最终只是在 aes 规范中翻转了xy参数。例如,代替:

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

我做了:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接