Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试绘图在R中是否具有固定的纵横比_R_Ggplot2_Aspect Ratio - Fatal编程技术网

如何测试绘图在R中是否具有固定的纵横比

如何测试绘图在R中是否具有固定的纵横比,r,ggplot2,aspect-ratio,R,Ggplot2,Aspect Ratio,我想知道是否有一种方法可以问R一个地块是否有固定的纵横比。以下是两个示例图: library (ggplot2) plot_a <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) + geom_point()+ theme (aspect.ratio = 1) plot_b <- ggplot(iris, aes(Sepal.Length, Sepal.Width

我想知道是否有一种方法可以问R一个地块是否有固定的纵横比。以下是两个示例图:

library (ggplot2)

plot_a <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
          geom_point()+
          theme (aspect.ratio = 1)

plot_b <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
          geom_point()

有没有办法做到这一点?

编辑以检查任何纵横比

> !is.null(plot_a$theme$aspect.ratio)
[1] TRUE
> !is.null(plot_b$theme$aspect.ratio)
[1] FALSE

我不确定是否有函数,但有一种“快速且肮脏”的方法来检查它。如果展开“打印”子窗口,则没有固定纵横比的打印将拉伸并展开,而具有固定纵横比的打印将保持相同的宽度

您还可以直接使用ggsave指定绘图的比例、宽度和高度,例如

ggsave("figure.png", plot = last_plot(),
   scale = 1, width = 20, height = 15, units = "cm",
   dpi = 300)

你能不能具体说明一下你想怎样检查你的图

处理此类问题的一个非常好的方法是使用
purr
包中的
map
。这样,您就不必手动在列表中搜索:

is_fixed_ratio <- function(plot){
  purrr::map(plot, "aspect.ratio") %>% 
    unlist() %>% 
    is.null() %>% 
    !.
}
is_fixed_ratio(plot_a)
is_fixed_ratio(plot_b)
是否为固定比率%
取消列表()%>%
is.null()%>%
!.
}
是固定比率(地块a)
是固定比率(地块b)

假设我们有以下曲线图:

library (ggplot2)

plot_a <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
          geom_point()+
          theme (aspect.ratio = 1)

plot_b <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
          geom_point()

plot_c <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
          geom_point() +
          coord_equal()
然而,
plot_c
有一个固定的纵横比,只是没有通过主题指定

要检查这一点,您可以检查绘图的gtable:

is_fixed_ratio2 <- function(plot) {
  ggplotGrob(plot)$respect
}

查询主题的答案是不可靠的,因为无论主题设置如何,绘图都可以有固定的纵横比,这仅仅是因为coord这样做。例如,基于
geom_sf()
的任何绘图将具有固定的纵横比。正确的方法是查询ggplot生成的grob

库(tidyverse)
p_var[1]错误
这也适用于问题中给出的示例:

plot_a[1]错误
还有一个例子:

nc[1]错误

好的,如果
纵横比正好为1,则该选项可以正常工作。但是,如果有一个固定的纵横比偏离1,
isTRUE(_plot$theme$aspect.ratio==1)
我想它会返回FALSE(我只想测试是否有固定的纵横比)。我可以尝试使用一个相当小的值,在大多数情况下,我认为:
isTRUE(the_plot$theme$aspect.ratio>=.0001)
测试是否存在纵横比同样简单。只需检查
aspect.ratio
列表元素是否存在。这就是解决方案。非常感谢。我知道:)但是,我需要R“知道”一个绘图是否有固定的
纵横比,因为我想在一个更大的函数中实现答案(
TRUE
FALSE
),这确实是一个非常好的选择。由于人性化的可读性,我非常喜欢通过专用功能进行测试的想法。这是一个比公认的答案好得多的答案,未来可能不会有太大的变化。在发布了基本上很好的消息后,我注意到了这个答案,至少知道它是正确的,但我想说,你的解释更切题。
is_fixed_ratio <- function(plot){
  purrr::map(plot, "aspect.ratio") %>% 
    unlist() %>% 
    is.null() %>% 
    !.
}
> is_fixed_ratio(plot_a)
[1] TRUE
> is_fixed_ratio(plot_b)
[1] FALSE
> is_fixed_ratio(plot_c)
[1] FALSE
is_fixed_ratio2 <- function(plot) {
  ggplotGrob(plot)$respect
}
> is_fixed_ratio2(plot_a)
[1] TRUE
> is_fixed_ratio2(plot_b)
[1] FALSE
> is_fixed_ratio2(plot_c)
[1] TRUE