59

xlim()我可以使用and强制 ggplot2 散点图为方形,具有相同的 x 和 y 缩放比例ylim(),但它需要手动计算限制。有没有更方便的方法呢?

方形我的意思是两个要求:

  1. x 和 y 轴上的比例相同。
  2. x 和 y 轴的长度相等。
4

5 回答 5

66

如果要使距离刻度点相同,请使用coord_fixed()

p <- ggplot(...)
p <- p + coord_fixed() # ratio parameter defaults to 1 i.e. y / x = 1

如果要确保结果图是正方形的,则还需要将 x 和 y 限制指定为相同(或至少具有相同的范围)。xlim并且ylim都是coord_fixed. 因此,您可以使用这些参数手动执行此操作。或者您可以使用函数从数据中提取限制。

于 2012-11-19T01:18:20.623 回答
64

注意:对于正方形(与绘制的数据无关),

ggplot() + theme(aspect.ratio=1)

在此处输入图像描述

于 2016-03-10T09:29:20.887 回答
7

可能是您今天看到的最丑陋的代码,但它确实有效。

您的 x 和 y 轴的范围可从以下位置访问ggplot_build

r<-max(abs(ggplot_build(your_plot)$panel$ranges[[1]]$x.range))
s<-max(abs(ggplot_build(your_plot)$panel$ranges[[1]]$y.range))
t<-round(max(r,s),1)
your_plot<-your_plot+coord_equal(xlim=c(-t,t),ylim=c(-t,t))
于 2016-01-28T22:55:38.123 回答
4

之前答案中提供的所有解决方案都不适用于我的 R 版本:R 版本 3.6.1。

ggplot_build(pot)$panel$ranges[[1]]$x.range # return NULL value

@Gerhard Burger 在链接 URL中提到的解决方案适用于我的情况:

r<-max(abs(layer_scales(plt)$x$range$range))
s<-max(abs(layer_scales(plt)$y$range$range))
t<-round(max(r,s),1)
plt<-plt+coord_equal(xlim=c(0,t),ylim=c(0,t))
于 2019-11-07T14:31:21.300 回答
1

基于拉蒙斯的回答,这个函数对我来说很好用,我认为它并不难看,因为可以隐藏函数定义......

squarePlot <- function(plt){
    return(plt+coord_equal()+
            expand_limits(x=ggplot_build(plt)$panel$ranges[[1]]$y.range,
                          y=ggplot_build(plt)$panel$ranges[[1]]$x.range))
}

只是将 Ramon 的代码包装在一个函数中对我来说不起作用,因为 t 变量是在“错误”环境中定义的。

于 2016-10-26T12:01:08.640 回答