如何修复ggplot中的纵横比?

问题描述 投票:0回答:6

我正在尝试调整绘图大小以适合我的文档,但我很难将绘制的图表变成正方形。

示例:

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
6个回答
134
投票

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

enter image description here


109
投票

为了确保特定的纵横比,例如对于正方形,请使用

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

那么情节将如下所示:

enter image description here

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

ratio
纵横比,表示为 y / x

这样绘图就可以与:

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

enter image description here

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


21
投票

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

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)

结果:


7
投票

基于 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
投票

我看到这篇文章并想添加更多信息。如果您计划将图像插入 RMD 文档中,则可以从 r 块中处理

aspect.ratio
。根据您的布局,有 3 种方法可以更改图像的纵横比(取决于您的工作流程)。

#1。创建图形时

myPlot <- ggplot(data = iris,
aes(x=Species, y = Sepal.Length)) +
geom_point() +
theme(aspect.ratio = 6.5/11)

#2。使用

ggsave

保存图像时
ggsave("images/plot1.png", myPlot, width=11, height=6.5, dpi=400)

#3。在 rmd 文档本身中。如果您计划使用

officedown
(并创建 docx 作为文档输出),那么我发现 6.5/11 的宽高比与 9.4 的
fig.width
相结合是使用横向页面的最佳选择。

  <!---BLOCK_LANDSCAPE_START--->
    ```{r fig.id="my-fig", fig.cap="", fig.width=9.4, fig.asp = 6.5/11}
    myPlot
    ```
 <!---BLOCK_LANDSCAPE_STOP--->

应该注意的是,如果您打算将 ggplot 插入 Rmd 文档中,您可以跳过 #1 和 #2,仅使用选项 #3。


0
投票

尝试添加

a_r <- 2.5
theme(aspect.ratio = a_r) 

这是例子:

ggplot(corr_df_0, aes(x = corr_df_0_sp, y = corr_df_0_sc))+
theme(aspect.ratio=2.5) 
© www.soinside.com 2019 - 2024. All rights reserved.