【问题标题】:How to fix the aspect ratio in ggplot?如何修复ggplot中的纵横比?
【发布时间】:2011-10-26 18:37:51
【问题描述】:

我正在尝试调整绘图的大小以适合我的文档,但我无法让绘制的图表成为正方形。

例子:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

虽然 x 和 y 的限制相同,但结果中的图不是正方形的。我猜 R 使封闭面板 5x5" 但不关心实际图表大小。

我如何解压我的图表?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    基于baptiste的建议和Graipheranswer,因为它优雅实用。

    df <- data.frame(
      x = runif(100, 0, 5000),
      y = runif(100, 0, 5))
    aspect.ratio <- 4/3
    ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
    plot <- ggplot(df, aes(x=x, y=y)) + geom_point() + theme(aspect.ratio=4/3)
    

    【讨论】:

      【解决方案2】:

      为了完整起见: 如果您想考虑非常不同的轴限制:

      df <- data.frame(
        x = runif(100, 0, 5000),
        y = runif(100, 0, 5))
      ratio.display <- 4/3
      ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
      plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
      plot + coord_fixed(ratio.values / ratio.display)
      

      导致:

      【讨论】:

      • 这比plot + theme(aspect.ratio=4/3) 好多少? ggplot 可能有多个层,具有多个数据集,并且轴可能具有任意扩展因子,因此从一个数据源计算 y/x 的比率似乎非常脆弱。
      • 因为这显然不容易被发现。事实证明,这里有三个答案,但没有人提到它。你应该把它放在一个答案中,这绝对是更好的解决方案。
      【解决方案3】:

      为了确保特定的纵横比,例如对于正方形,使用theme(aspect.ratio=1)

      Andrie 的回答没有给出完整的图片,因为该示例提供了可能不自然的数据,其中 x 的范围等于 y 的范围。但是,如果数据是:

      df <- data.frame(
        x = runif(100, 0, 50),
        y = runif(100, 0, 5))
      ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()
      

      那么情节将如下所示:

      coord_fixed() 函数还有一个参数来调整轴的比例:

      ratio纵横比,表示为y/x

      这样情节就可以与:

      ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)
      

      但是您需要使用变量或绘图区域的限制进行调整(并非所有限制都可以像这些示例一样被整数很好地整除)。

      【讨论】:

      • 这是最好的答案,因为它不一定假设 xy 轴上的单位范围相同!
      【解决方案4】:

      ggplot 中,保持绘图纵横比的机制是在绘图中添加coord_fixed() 层。这将保留绘图本身的纵横比,而不管实际边界框的形状如何。

      (我还建议您使用ggsave 将结果图保存到pdf/png/etc,而不是pdf(); print(p); dev.off() 序列。)

      library(ggplot2)
      df <- data.frame(
          x = runif(100, 0, 5),
          y = runif(100, 0, 5))
      
      ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()
      

      【讨论】:

      • 你知道为什么ggplot坚持把y轴标签放在左边吗?我很想知道如何防止这种情况...
      • @chase 一个笨拙的解决方法是修改标题的hjust 位置-尝试opts(axis.title.y=theme_text(hjust=10))。但是,很遗憾,似乎没有。有关 ggplot 邮件列表讨论和 @Baptiste 的回答,请参阅 groups.google.com/group/ggplot2/browse_thread/thread/…
      • 该行为在开发版本中已修复。
      • 有了更笼统的问题标题,您是否还可以添加有关如何计算比率的信息(coord_fixed 的参数),假设一个人不在两个轴上使用相同的限制?跨度>
      • 关于@htorque 的评论;如果 y 改为定义为y=runif(100, 0, 50),则绘图的方面不再是正方形。 coord_fixed() 导致每个轴的比例只是看起来相等?
      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 2023-04-03
      • 2017-05-03
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2017-04-04
      • 2012-03-04
      相关资源
      最近更新 更多