如何测试绘图在R中是否具有固定的纵横比
我想知道是否有一种方法可以问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
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