作者:-寒小兮_991 | 来源:互联网 | 2023-02-12 15:36
在ggplot2中,coord_fixed()
坐标系确保数据的宽高比保持在给定值.因此,面板的形状会发生变化,以保持数据的形状.同时coord_flip()
交换图的轴.但是,ggplot2中的绘图必须只有一个坐标系,因此这些功能无法组合.
我的问题是:
是否存在一种方法来的行为结合coord_fixed()
和coord_flip()
,从而导致与所述x和y轴的坐标系交换和数据的固定纵横比?
这是一个很受欢迎的问题,但常见的答案是错误的:
如何修复宽高比并在ggplot2中应用coord_flip?
在ggplot2中翻转和维护图表的宽高比
常用认为答案是使用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)
Axeman..
5
我同意该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)
我可能会在实践中使用的解决方案是在ggstance
包装中使用水平几何体(尽管这可能并不总是可行的)。
注意:这只会为两个连续的标度(具有相同的乘法extend
参数)(即默认值)给出准确的正确答案。
1> Axeman..:
我同意该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)
我可能会在实践中使用的解决方案是在ggstance
包装中使用水平几何体(尽管这可能并不总是可行的)。
注意:这只会为两个连续的标度(具有相同的乘法extend
参数)(即默认值)给出准确的正确答案。