R 强制散点图网格在ggpot2中为正方形

R 强制散点图网格在ggpot2中为正方形,r,ggplot2,pca,R,Ggplot2,Pca,我试图强制散点图的网格由正方形组成,x和y值具有不同的范围 我试图强制整个绘图为正方形(纵横比=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,

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

我试图强制整个绘图为正方形(纵横比=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的极限:

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

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

3) 这很明显是有效的,因为我匹配了x和y的范围。但图表中有很多空白

还有什么我应该试试的吗


提前感谢。

我不确定您使用的是什么代码,它在块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点

在文件中,您将进一步发现以下建议:

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


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

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

首先,让我们创建一个
mpg
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
生成正确的值标签。下面我们通过向
scale\u y\u continuous
labels
参数提供反转函数来实现这一点:

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

但请注意,重新缩放回原始的
hp
scale会导致不美观的中断。我们可以通过在
hp
scale上生成漂亮的断点,将这些断点重新缩放到
mpg
scale,以获得需要记号的位置,然后将其反转以获得标签值来解决这个问题。但是,在这种情况下,如果要使整个绘图面板保持方形,我们将无法获得方形网格:

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

如果要使其工作,您不需要更改绘图的纵横比吗?为什么不生成一个带有方形网格的空绘图,将其保存为图像,并将其作为绘图的背景?在一对代码块中缺少代码谢谢。我最终调整了类似比例的Y轴和X轴的范围。有时图形看起来有点空,但至少所有内容都以相同的方式缩放。
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)))