我正在try 编辑gglot2对象中不同元素的大小,例如使点更大.我需要处理已构造的对象:即,给我一个ggplot2对象test_lot,我想要创建一个函数,使我能够zoom 点大小并返回new个ggplot2对象.我需要两个地块对象:原始地块(带有未zoom 元素)和新地块(带有zoom 元素).

然而,我在下面的try 似乎同时zoom 了原始和新的绘图--在多次调用时会导致递归zoom .我不太熟悉R.

我认为函数中的所有内容都是局部作用域,不会触及全局环境中的原始情节.

library(ggplot2)
test_plot = ggplot(mtcars) +
  geom_point(aes(y = mpg, x = hp), col = "black")

adjust_point_size <- function(gg_plot,element_size_adjust = 1) {
  build_data =  ggplot_build(gg_plot)$data
  point_size = unique(build_data[[1]]$size)

  gg_plot$layers[[1]]$aes_params$size <- point_size*element_size_adjust
  gg_plot
}

adjust_point_size(gg_plot = test_plot, element_size_adjust = 2) # ok

adjust_point_size(gg_plot = test_plot, element_size_adjust = 2) # why doubled

adjust_point_size(gg_plot = test_plot, element_size_adjust = 2) # why doubled again

test_plot # why different?

创建于2023-04-08年第reprex v2.0.2

我try 将绘图对象作为新的临时对象保存在函数中,例如,test_plot2=test_plot,然后处理test_plot2.我没想到这会奏效(而且它也没有).

我使用的是ggplot2 v3.4.1.

谢谢!

推荐答案

这是怎么回事?

adj_pt_size <- function(ggplot, size_adj) {
  ggplot$layers[[1]]$aes_params$size <- 1*size_adj
  return(ggplot)
}

test_plot = ggplot(mtcars) +
  geom_point(aes(y = mpg, x = hp), col = "black")

adj_pt_size(test_plot, 2)

R相关问答推荐

在Julia中调用R函数

从具有随机模式的字符串中提取值

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

R根据条件进行累积更改

将包含卷的底部25%的组拆分为2行

有没有办法使用ggText,<;Sub>;&;<;sup>;将上标和下标添加到同一元素?

在保留列表元素属性的同时替换列表元素

为左表中的所有行使用值Fill滚动左连接

将箭头绘制在图形外部,而不是图形内部

将全局环境变量的名称分配给列表中的所有元素

为什么函数toTitleCase不能处理english(1),而toupper可以?

无法将条件case_when()应用于使用!!创建的新变量Mutations

数值型数据与字符混合时如何进行绑定

是否有可能从边界中找到一个点值?

快速合并R内的值

使用ggplot2绘制具有边缘分布的坡度图

排序R矩阵的行和列

在鼠标悬停时使用Plotly更改geom_point大小

真实世界坐标的逆st_变换

从data.table列表中提取特定组值,并在R中作为向量返回