首页 > 解决方案 > 在ggpot2中强制散点图网格为正方形

问题描述

我试图强制散点图的网格由正方形组成,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的范围。但是图中有很多空白区域。

正方形但丑陋

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

提前致谢。

标签: rggplot2pca

解决方案


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

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

首先让我们创建一个mpgvs.的图,hp但将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。我们在下面通过为 的labels参数提供反相函数来做到这一点scale_y_continuous

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

在此处输入图像描述


推荐阅读