R:函数中使用的 ggplot2 未反映字体大小变量的变化

2024-05-05

我经常需要将多个不同大小的相同 ggplot2 图表输出到 png 文件。通过使用输出高度和宽度(以像素为单位)的变量,可以轻松生成每个 png 文件的大小。对于 ggplot2 部分,我使用字体大小和某些其他元素的变量,并设置一个简单的循环来在每次传递中更改这些变量。这一切都按预期工作,并且是对 R 和 ggplot2 灵活性的致敬。

大多数时候,我都会创建少数图表类型之一,其中大多数都没有变化。因此,我认为创建一个简单的函数来处理样板代码并从列表中返回 ggplot2 的绘图是有意义的。我需要做的就是将数据框、我想要在图表中使用的列的名称以及其他几个变量传递给函数。该循环为绘图创建一个名称,调用 ggplot 并将结果分配给列表中的元素。在第二遍中,它更改字体大小变量,但其他方面的行为相同。

然而,字体大小似乎没有被 ggplot 拾取。具体来说,我使用变量来控制 geom_text() 的大小、x 轴和 y 轴文本的大小以及绘图的标题。当我在从函数返回后打印列表的内容时,geom_text() 大小正如人们所期望的那样发生变化,但其他两个元素在它们应该不同时却没有变化。 (请注意,在下面的代码中,我使用两个具有相同像素大小的“中”和“大”png 文件,但通常一个文件的大小是另一个文件的两倍 - 这仅用于说明目的。)

第二张图片的标题和轴文本大小应与第一张图片不同,但事实并非如此:

因为这种方法在“内联”用作正常代码块的一部分时工作正常,所以我只能假设我调用或刷新导致问题的函数的方式存在一些简单的问题。非常感谢任何帮助。

我以前没有在 R 中使用过命名函数,而且我是一个临时程序员而不是专业人士,所以提前对下面的不可靠代码表示歉意。

# create test data
set.seed(12345)
mydf <- data.frame(passdate=seq(as.Date("1995/1/1"), by="month", length.out=204),passval=runif(204, min=25, max=100),ignoreval=runif(204, min=-21, max=-2))

myplots <- list()
myplots <- chart_high_mom(mydf,'passdate','passval','1995-02-01','2011-12-31',"My title here")

# first chart
mywidth = 700
myheight = 600
png(filename = "chart1.png", width = 700, height = 600, units = "px", res = NA)
print(myplots[[1]])
dev.off()
# second chart - this intended to be twice as large when bugs fixed
png(filename = "chart2.png", width = 700, height = 600, units = "px", res = NA)
print(myplots[[2]])
dev.off()
# end of calling code

chart_high_mom <- function(
    x = NULL, # a data frame containing the data to plot
    datecol, # name of column holding yyyy-mm-dd date series
    valcol, # name of column holding value to use for calculation
    fstartdate, # date in yyyy-mm-dd format specifying first date to plot
    fenddate, # date in yyyy-mm-dd format specifying last date to plot
    ftitle # title to add to plot
    )
    {

    require(gdata)
    require(xts)
    require(ggplot2)
    require(lubridate)    
    # strip the data frame down
    x <- subset(x,select = c(datecol,valcol))
    colnames(x) <- c('mydate','myval')
    # create year and month columns
    x$year <- as.numeric(format(as.Date(x$mydate), format="%Y"))
    x$month <- as.numeric(format(as.Date(x$mydate), format="%m"))
    # create month-on-month change column
    mydata.xts <- xts(x$myval,order.by=x$mydate)
    x$myvalmom <- diff(mydata.xts,lag=1)/lag(mydata.xts,1)

    plotlist <- list()

    for (i in 1:2) { # loop to create plot with two different sets of font sizes

        plotname <- paste("myplot", i, sep = "")

        if (i == 1) {
            fontsize <- 8
            titlesize <- 16
            geomtextsize <- 4
            ftitle <- "medium"
        }
        if (i == 2) {
            fontsize <- 24
            titlesize <- 28
            geomtextsize <- 5
            ftitle <- "large"
        }

        print(paste("i = ",i," and fontsize = ",fontsize," and plot = ",plotname,sept=""))

        plotlist[[plotname]] <- ggplot(x[x$mydate>=fstartdate & x$mydate<=fenddate,], 
            aes(x=month(mydate,label=TRUE),y=year(mydate), fill = myvalmom, label = sprintf("%1.1f%%", 100*myvalmom))) + 
          scale_y_date(major="years", format="%Y") +
          geom_tile() + 
          geom_text(data=x[x$mydate>=fstartdate & x$mydate<=fenddate,],size = geomtextsize,colour = "black") +
          scale_fill_gradient2(low = "blue", high = "red",midpoint=0) +
          scale_x_discrete(expand=c(0,0)) +
          scale_y_reverse(breaks=1980:2012, labels=1980:2012, expand=c(0,0) ) +

          opts(

          axis.text.y = theme_text(size = fontsize, colour = "grey50"),
          axis.text.x = theme_text(size = fontsize, colour = "grey50"),
          plot.title = theme_text(size = titlesize),
          title = ftitle,
          panel.grid.minor = theme_blank(),
          axis.ticks = theme_blank(),
          panel.grid.major = theme_blank(),
          axis.title.y = theme_blank(),
          axis.title.x = theme_blank(),
          panel.background = theme_rect(fill = "transparent",colour = NA),
          legend.position = "none"
          )

    }

return(plotlist)

}

首先定义绘图函数(以便它们可以接受您将要更改的参数:

chart_high_mom <- function(fontsize, titlesize, geomtextsize, ftitle,
    x = NULL, # a data frame containing the data to plot
    datecol, # name of column holding yyyy-mm-dd date series
    valcol, # name of column holding value to use for calculation
    fstartdate, # date in yyyy-mm-dd format specifying first date to plot
    fenddate # date in yyyy-mm-dd format specifying last date to plot
                         ) {


    # strip the data frame down
    x <- subset(x,select = c(datecol,valcol))
    colnames(x) <- c('mydate','myval')
    # create year and month columns
    x$year <- as.numeric(format(as.Date(x$mydate), format="%Y"))
    x$month <- as.numeric(format(as.Date(x$mydate), format="%m"))
    # create month-on-month change column
    mydata.xts <- xts(x$myval,order.by=x$mydate)
    x$myvalmom <- diff(mydata.xts,lag=1)/lag(mydata.xts,1)

    plotlist <- list()


        print(paste("i = ",i," and fontsize = ",fontsize," and titlesize = ",titlesize,sep=""))

        thisplot <- ggplot(x[x$mydate>=fstartdate &
                                             x$mydate<=fenddate,], 
            aes(x=month(mydate,label=TRUE),y=year(mydate), 
             fill = myvalmom, label = sprintf("%1.1f%%", 100*myvalmom))) + 
                    scale_y_date(major="years", format="%Y") +
                    geom_tile() + 
                    geom_text(data=x[x$mydate>=fstartdate &
                         x$mydate<=fenddate,],size = geomtextsize, 
                         colour = "black") +
          scale_fill_gradient2(low = "blue", high = "red",midpoint=0) +
          scale_x_discrete(expand=c(0,0)) +
      scale_y_reverse(breaks=1980:2012, labels=1980:2012, expand=c(0,0) ) +
          force(opts(axis.text.y = 
                  theme_text(size = force(fontsize), colour = "grey50"),
               axis.text.x = theme_text(size = force(fontsize), colour = "grey50"),
          plot.title = theme_text(size = titlesize),
          title = ftitle,
          panel.grid.minor = theme_blank(),
          axis.ticks = theme_blank(),
          panel.grid.major = theme_blank(),
          axis.title.y = theme_blank(),
          axis.title.x = theme_blank(),
          panel.background = theme_rect(fill = "transparent",colour = NA),
          legend.position = "none"
          ))
return(thisplot)

    }

....然后打电话给他们。并使用您想要的参数值调用它们:

set.seed(12345)
mydf <- data.frame(passdate=seq(as.Date("1995/1/1"), by="month", length.out=204),passval=runif(204, min=25, max=100),ignoreval=runif(204, min=-21, max=-2))

myplots <- list()

for (i in 1:2) { # loop to create plot with two different sets of font sizes
              if (i == 1) {
            print(fontsize <- 8)
            print(titlesize <- 32)
            print(geomtextsize <- 4)
            print(ftitle <- "medium");  
     myplots[[1]] <-chart_high_mom(fontsize= fontsize , titlesize= titlesize , geomtextsize= geomtextsize , ftitle= ftitle , x=mydf, 'passdate', 'passval', '1995-02-01', '2011-12-31')
      png(filename = "chart1.png", width = 700, height = 600, units = "px", res = NA)
print(myplots[[1]])
dev.off()             }
        if (i == 2) {
            fontsize <- 24
            titlesize <- 12
            geomtextsize <- 5
            ftitle <- "large"; 
     myplots[[2]] <-chart_high_mom(fontsize= fontsize , titlesize= titlesize , geomtextsize= geomtextsize , ftitle= ftitle , x=mydf, 'passdate', 'passval', '1995-02-01', '2011-12-31')
      png(filename = "chart2.png", width = 700, height = 600, units = "px", res = NA)
print(myplots[[2]])
dev.off()      }       }
# end of calling code
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:函数中使用的 ggplot2 未反映字体大小变量的变化 的相关文章

  • 如何生成向量的所有组合[重复]

    这个问题在这里已经有答案了 假设我有 3 个绿球 2 个橙球和 8 个黄球 我想订购它们 鉴于所有相同颜色的球都是相同的 如何生成所有可能的序列 在 R 中 使用gregmisc 我可以 balls lt c orange orange g
  • 分离并重新附加“tools:rstudio”

    又名玩火 以下不起作用 rstd obj lt as environment tools rstudio detach tools rstudio attach rstd obj name tools rstudio 好吧 它似乎有效 但随
  • 在 mac (iMac OSX ) 终端中远程运行脚本(r 脚本)到其他计算机

    我有一个小示例脚本 script p r 如下所示 打算在终端中运行 usr bin Rscript sink output capture txt mn lt mean 1 10 and so on much longer list of
  • 如何使用 R 中带引号的字符值内的序列读取 CSV?

    这是一个包含两个字符列的 CSV 文件 key value a 所有字符值都用双引号引起来 并且有一个顺序 在值之一内 转义引号加分隔符 我无法通过 read csv readr 中的 read csv 或 data table 中的 fr
  • 查找数据帧列表中同一列中的所有重复值并将其转换为 NULL

    我有一个清单BELGIAN COAST list包含数百个数据帧 df1 df2 15 列 X 1000 行 每个数据帧的最后一列称为Chemicals并包含一些字符 例如Sulfate or Ammonia 但是这一列有很多行Chemic
  • R.matlab/readMat:readTag(this) 中出错

    我正在尝试使用 R matlab 将 matlab 文件读入 R 但遇到此错误 require R matlab r lt readMat file mat verbose T Trying to read MAT v5 file stre
  • 将 sf voronoi 多边形裁剪到边界框时出错

    我正在尝试将 voronoi polygons 使用 sf package 创建 剪辑 到边界框 但它引发了我无法定义的错误 我对 R 的空间世界不太有经验 感谢所有帮助 样本数据 stations lt structure list ST
  • 如何更改 Shiny 中 navbarPage 折叠的断点

    我想用shiny navbarPage collapsible TRUE 当在小屏幕上查看我的 Shiny 应用程序时 将导航元素折叠到菜单中 默认情况下 当浏览器宽度小于 940 像素时会触发折叠 有什么方法可以改变这一点 以便在稍大的浏
  • R 更改小数位且不四舍五入

    gt signif 1 89 digits 2 1 1 9 我想要1 8 这有点笨拙 但它会起作用并保持所有数字 x lt 1 829380 trunc dec lt function x n floor x 10 n 10 n Resul
  • 如何按 data.table 中的十分位数组计算统计数据

    我有一个 data table 想按组计算统计数据 R set seed 1 R DT data table a rnorm 100 b rnorm 100 这些组应该定义为 R quantile DT a probs seq 1 9 1
  • 如何将此“for”循环转换为向量解

    这个问题与 将嵌入其他文本的长州名称转换为两个字母的州缩写 https stackoverflow com questions 25582518 convert long state names embedded with other te
  • 使用outer代替expand.grid

    我正在寻找尽可能快的速度并留在基地做该做的事expand grid做 我用过outer为过去类似的目的创建一个向量 像这样的东西 v lt outer letters LETTERS paste0 unlist v lower tri v
  • 如何计算嵌套函数中的粘合表达式?

    我正在尝试嵌套一个函数 该函数将两个字符串粘合在一起 该函数使用组合字符串来命名数据帧的列 然而 问题似乎是粘合表达式没有足够早地评估为字符串 我可以 并且应该 强制在将表达式作为参数传递给另一个函数之前对其进行求值吗 library ti
  • R:将 JSON 时间格式转换为 POSIX

    我有一个 JSON 字符串 并将其放入数据框中 我能够做到这一点 但我在使用 apply 函数之一将所有时间字符串转换为 POSIX 格式时遇到问题 See here https stackoverflow com questions 90
  • ggplot散点图中的图例问题

    我想使用 ggplot 创建显示方法比较数据的散点图 绘图应包含原始数据 理想线和带误差的拟合线 图例应显示理想线和拟合线的线型 线宽 线颜色 我可以获得大部分我想要的东西 但是图例存在以下问题 图例显示每种线型有 2 条线 为什么 如何解
  • 在 R 中使用 Huggingface Transformer 模型

    我正在尝试在 R 中使用不同的 Huggingface 模型 这是通过 reticulate 导入 Transformer 包来实现的 谢谢 https rpubs com eR ic transfoRmers https rpubs co
  • 使用 dplyr::filter 的整洁方式是什么?

    使用下面的函数调用foo c b 输出以内联方式显示 正确的写作方式是什么df gt filter x gt x 我已经包含了一个使用的示例mutate以整洁的风格与之对比filter foo lt function variables x
  • 16 位以上整数的计算

    我有两个大整数 两者都超过 16 位 确切地说是 20 位 而且我知道由于双精度浮点运算 我在使用这些数字进行计算甚至将它们存储在变量中 独立于编程语言 时受到限制 不过 我想也许gmp图书馆应该处理它们 但不幸的是它没有 可以计算更大的整
  • 使用predictNLS围绕R中的拟合值创建置信区间?

    我想使用 R 中 propogate 包中的 PredictNLS 围绕一大组拟合值构建置信区间 作为示例 我将使用它们在函数描述中引用的数据集 https rdrr io github anspiess propagate man pre
  • ggplot2、R 中的单条形条形图

    我有以下数据和代码 gt ddf var1 var2 1 aa 73 2 bb 18 3 cc 9 gt gt dput ddf structure list var1 c aa bb cc var2 c 73L 18L 9L Names

随机推荐