【问题标题】:Force scatter plot grid to be square in ggpot2在ggplot2中强制散点图网格为正方形
【发布时间】:2019-07-08 18:44:49
【问题描述】:

我试图强制散点图的网格由正方形组成,xy 值具有不同的范围。

我尝试将整个图强制为正方形(aspect.ratio=1),但这并不能解决不同范围的问题。然后我试图改变我的轴值的限制。

1)这是我首先尝试的:

p + theme(aspect.ratio = 1) +
    coord_fixed(ratio=1, xlim = c(-0.050,0.050),ylim = c(-0.03,0.03))

2) 我通过使用每个轴的值范围来更改比率:

p + coord_fixed(ratio=0.06/0.10, xlim = c(-0.050,0.050), ylim = c(-0.03,0.03))

3)然后我更改了 y 的限制以匹配 x 的限制:

p + theme(aspect.ratio = 1) +
          coord_fixed(ratio=1, xlim = c(-0.050,0.050),ylim = c(-0.05,0.05))

1) 背景上的网格由矩形组成。

2) 我希望这会自动更改刻度线的位置,以便给我一个由正方形组成的网格。还是三角形。

3) 它显然有效,因为我匹配了 xy 的范围。但是图中有很多空白。

还有什么我应该尝试的吗?

提前致谢。

【问题讨论】:

  • 您不需要更改绘图的纵横比才能使其正常工作吗?
  • 为什么不直接生成一个带有方形网格的空图,将其保存为图像,并将其作为背景应用到图上?
  • 您缺少几个代码块中的代码
  • 谢谢。我最终调整了类似比例的 Y 轴和 X 轴的范围。有时图形看起来有点空,但至少所有内容都以相同的方式缩放。

标签: r ggplot2 pca


【解决方案1】:

如果您希望绘图是方形的并且您希望网格是方形的,您可以通过将 y 变量重新调整为与 x 变量相同的比例(反之亦然)进行绘图,然后反转重新缩放为重新缩放的轴生成正确的轴值标签。

这是一个使用mtcars 数据框的示例,我们将使用scales 包中的rescale 函数。

首先让我们创建一个mpghp 的图,但将hp 的值重新调整为与mpg 相同的比例:

library(tidyverse)
library(scales)
theme_set(theme_bw())

p = mtcars %>% 
  mutate(hp.scaled = rescale(hp, to=range(mpg))) %>% 
  ggplot(aes(mpg, hp.scaled)) +
  geom_point() +
  coord_fixed() +
  labs(x="mpg", y="hp")

现在我们可以反转重新缩放来为hp 生成正确的值标签。我们在下面通过为scale_y_continuouslabels 参数提供反相函数来做到这一点:

p + scale_y_continuous(labels=function(x) rescale(x, to=range(mtcars$hp)))

但请注意,重新缩放回原来的 hp 比例会导致不漂亮的中断。我们可以通过在hp 刻度上生成漂亮的中断来解决这个问题,将它们重新缩放到mpg 刻度以获得我们想要刻度线的位置,然后将其反转以获得标签值。但是,在这种情况下,如果我们想保持整个绘图面板为方形,我们将不会得到方形网格:

p + scale_y_continuous(breaks = rescale(pretty_breaks(n=5)(mtcars$hp), 
                                        from=range(mtcars$hp), 
                                        to=range(mtcars$mpg)),
                       labels = function(x) rescale(x, from=range(mtcars$mpg), to=range(mtcars$hp)))

【讨论】:

    【解决方案2】:

    我不确定您使用的是什么代码,第 1 块和第 3 块中缺少它。但是使用 mtcars 数据集可以实现以下工作:

    library(ggplot2)
    
    ggplot(mtcars, aes(mpg, wt)) + 
      geom_point() +
      coord_fixed(ratio = 1) +
      scale_x_continuous(breaks = seq(10, 35, 1)) +
      scale_y_continuous(breaks = seq(1, 6, 1))
    

    最后两行清楚地表明 x 轴上的 1 个点等于 y 轴上的 1 个点。

    在文档中,您将进一步找到以下建议:

    确保轴的范围等于指定的比率 调整地块纵横比

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2018-02-02
      • 2014-09-18
      • 2019-07-19
      相关资源
      最近更新 更多