热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ggplot2:翻转轴并保持数据的纵横比》经验,为你挑选了1个好方法。

在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参数)(即默认值)给出准确的正确答案。


推荐阅读
author-avatar
-寒小兮_991
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有