【问题标题】:Force ggplot2 scatter plot to be square shaped强制 ggplot2 散点图为方形
【发布时间】:2012-11-18 23:33:53
【问题描述】:

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

方形是指两个要求:

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

【问题讨论】:

  • “方形”是否意味着您希望x 方向上的一个单元的长度与y 方向上的长度相同(意思是如果x 从0 变为5 和 y 从 0 变为 6 y 尺寸将长一个单位),还是您的意思是您希望整个 x 轴的长度与 y 轴相同(所以在前面的示例中,y 的每个单位都比x 的每个单位短,但整个图形看起来是方形的)?
  • @baptiste:我认为您应该将其发布为答案。它似乎是基础绘图中asp=1 的 ggplot 类似物。
  • @DWin 似乎没有一个建议的答案使绘图呈方形,它们都使 x 和 y 比例相同。
  • 如果形状很重要,请选择theme(aspect.ratio=1)
  • 但要回答您的问题,我认为 ggplot2 中没有这样做的功能。您可以使用expand_limits,但我相信您必须以一种或另一种方式手动计算数据的最小值和最大值。

标签: r ggplot2 scatter-plot


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,它使 x 和 y 轴的比例相同,但不会强制绘图为方形 - 即x和y轴的长度可以不同
【解决方案2】:

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

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

【讨论】:

  • 这会强制绘图背景区域为正方形,而不是(必须)绘图数据区域。此外,ggsave 可能不会(几乎肯定不会)输出正方形图像,但会用白色填充它,这样如果您的背景颜色是白色,您保存的图形将不会显示为正方形(如果您的背景是彩色,它将被白色填充包围)。根据您的目的,此选项应与其他选项一起使用。您可以随时调整ggsave 中的widthheight 选项。
【解决方案3】:

可能是您今天看到的最丑陋的代码,但它确实可以解决问题。

您的 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))

【讨论】:

    【解决方案4】:

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

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

    @Gerhard Burger 在linked 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))
    

    【讨论】:

      【解决方案5】:

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

      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 变量是在“错误”的环境中定义的。

      【讨论】:

      • 我喜欢这个主意,但这不适用于我的 ggplot 对象。我得到的最接近的是ggplot_build(qq)$plot$scales$scales,但它仍然无法正常工作。所以我最终手动计算了限制并按 1.3 缩放...
      • ggplot_build 一直在变化,我认为目前this 是首选方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 2023-03-09
      • 2016-08-28
      • 1970-01-01
      • 2015-11-13
      • 2010-12-21
      相关资源
      最近更新 更多