如何使用 expression() 在 R 绘图标题中显示 LaTeX 样式表达式

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

我正在 R 中进行一项模拟研究,其中绘制不同估计量的偏差和方差曲线。我希望子图的标题包含格式正确的数学表达式,特别是 eta_0 和 eta_1,在

expression()
函数的
main
参数中使用
plot()

这是我的绘图代码的相关部分:

# Define plotting parameters
pch_values <- c(3, 4, 18, 20)  # Symbols for different cases
colors <- c("red", "blue", "gray60")  # Colors for different noises
plot_titles <- c("Bias Curves", "Variance Curves")
coeff_labels <- c(expression(beta[0]), expression(beta[1]))


par(mfrow = c(2, 2), mar = c(4, 4, 2, 1))  # 2x2 layout

for (plot_type in c("bias", "variance")) {
  for (coef_idx in seq_along(coeff_labels)) {
    coef_name <- ifelse(coef_idx == 1, "beta_0", "beta_1")
    
    # Compute y-axis range
    ylim_range <- range(sapply(results_coef, function(noise_list) {
      sapply(noise_list, function(case_list) {
        y_values <- abs(case_list[[plot_type]][[coef_name]])  # Absolute for bias
        return(y_values)
      })
    }), na.rm = TRUE)
    
    # Initialize the plot
    plot(NULL, log = "x", xlim = range(sample_sizes), ylim = ylim_range,
         xlab = "Sample Size (T)", ylab = str_to_title(plot_type),
         main = paste(plot_titles[ifelse(plot_type == "bias", 1, 2)], " (", coeff_labels[coef_idx], ") ", sep = ""))
    
    
    for (noise_idx in seq_along(noise_types)) {
      noise <- noise_types[noise_idx]
      case_counter <- 1
      
      for (scale in unique(unlist(lapply(cases, `[[`, noise)))) {
        y_values <- abs(results_coef[[noise]][[as.character(scale)]][[plot_type]][[coef_name]])  # Absolute for bias
        
        lines(sample_sizes, y_values, col = colors[noise_idx], lty = noise_idx, lwd = 1)
        points(sample_sizes, y_values, col = colors[noise_idx], pch = pch_values[case_counter])
        case_counter <- case_counter + 1
      }
    }
    
    # Add legends
    legend("topright", legend = str_to_title(noise_types), col = colors,
           lty = 1:length(noise_types), lwd = 1, bty = "n", inset = c(.2, 0))
    legend("topright", legend = paste("Case", seq_along(pch_values)),
           pch = pch_values, col = "black", bty = "n")
  }
}

但是,

main
文本不会在绘图标题中显示数学表达式 eta_0 和 eta_1,而是以纯文本形式显示
beta[0]
beta[1]

问题:

如何正确设置绘图标题的格式以包含文本(例如“偏差曲线”)和 LaTeX 风格的数学表达式,例如 eta_0 和 eta_1 在

main
plot()
参数中?

任何建议或替代方法将不胜感激。

编辑:

这是一个最小的工作示例:

# Define plotting parameters
coeff_labels <- c(expression(beta[0]), expression(beta[1]))
plot_titles <- c("Bias Curves", "Variance Curves")

# Attempting to plot with combined text and expressions
plot(NULL, xlim = c(1, 10), ylim = c(1, 10), 
     main = paste(plot_titles[1], " (", coeff_labels[1], ")", sep = ""))

虽然我不确定它是否正确传达了问题。

r plot expression mathematical-expressions
2个回答
2
投票

您的

coeff_labels
变量是可以自行正确格式化的表达式,但您使用
c()
将它们与字符串组合,因此所有内容都会转换为字符串,并且不起作用。

如果您愿意对标签进行硬编码,那就很容易了。 使用

# Attempting to plot with combined text and expressions
plot(NULL, xlim = c(1, 10), ylim = c(1, 10), 
 main = expression(paste("Bias Curves (", beta[0], ")")))

所以你需要做的就是用变量构造一个像这样的表达式。 有很多方法可以做到这一点;

substitute
可能是最简单的。 例如,

plot(NULL, xlim = c(1, 10), ylim = c(1, 10), 
 main = substitute(paste(title, " ", (label)), 
          list(title = plot_titles[1], 
               label = coeff_labels[[1]])))

1
投票

grDevices:plotMath
一起工作可能会更容易。 引用,

如果将文本参数传递给文本绘制函数之一(文本、 R中的mtext, axis, legend)是一个表达式,参数是 解释为数学表达式,输出将是 根据类似 TeX 的规则进行格式化。也可以使用表达式 对于标题、副标题以及 x 和 y 轴标签(但不适用于轴 透视图上的标签)。

在大多数情况下,其他语言对象(名称和呼叫,包括 公式)被强制转换为表达式,因此也可以使用。

© www.soinside.com 2019 - 2024. All rights reserved.