You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ggplot2中混合表达式、纯文本与换行的实现问题

Solution: Mixing Bold, Plain Text, and Line Breaks in ggplot2 Labels

Got it, let's solve this problem of mixing bold text, plain text, and line breaks in your ggplot2 labels. The key here is correctly combining formatted (bold) and plain lines into expressions that ggplot can parse, while preserving the line breaks from your strwrap step. Here's how to do it step by step:

Step 1: Fix Text Wrapping (Preserve Pairings)

First, your original strwrap call flattens all lines into a single vector, which breaks the pairing between your labtxt1 and labtxt2 entries. Instead, use lapply to keep each wrapped text as a list element corresponding to the original string:

labtxt1 <- c("This text should be bold", "This text should also be bold", "Another text to be bold")
labtxt2 <- c("This text should not be bold", "This text should also not be bold", "Another text to be plain")

# Wrap each string into lines, keeping them as list elements
labtxt1_wrapped <- lapply(labtxt1, strwrap, width = 20)
labtxt2_wrapped <- lapply(labtxt2, strwrap, width = 20)

Step 2: Build Parsable Expressions for Each Label

Next, create a function that converts each pair of bold/plain wrapped lines into an expression string. This string will tell ggplot to render bold lines with bold() and separate all lines with newlines:

create_label_expr <- function(bold_lines, plain_lines) {
  # Escape single quotes in text to avoid expression errors
  escape_quotes <- function(x) gsub("'", "\\'", x)
  
  # Format bold lines as bold("line")
  bold_parts <- paste0("bold('", escape_quotes(bold_lines), "')")
  # Format plain lines as quoted text
  plain_parts <- paste0("'", escape_quotes(plain_lines), "'")
  
  # Combine all parts into a single paste expression with newlines
  paste0("paste(", paste(c(bold_parts, plain_parts), collapse = ", "), ", sep = '\\n')")
}

# Generate expression strings for each label pair
label_expr_strings <- mapply(create_label_expr, labtxt1_wrapped, labtxt2_wrapped, SIMPLIFY = FALSE)
# Parse the strings into actual R expressions
label_exprs <- lapply(label_expr_strings, parse, text = .)

Step 3: Plot with ggplot2

Now, create a data frame with positions for each label (adjust x/y as needed) and the parsed expressions. Use geom_text or geom_label with parse = TRUE to render the formatted text:

library(ggplot2)

# Create a data frame with label positions and expressions
label_data <- data.frame(
  x = c(1, 2, 3),  # Adjust x positions
  y = c(1, 1, 1),  # Adjust y positions
  label = unlist(label_exprs)
)

# Plot
ggplot(label_data, aes(x = x, y = y, label = label)) +
  geom_text(parse = TRUE, size = 4, hjust = 0.5) +
  # Optional: Add labels with boxes using geom_label instead
  # geom_label(parse = TRUE, size = 4, hjust = 0.5) +
  theme_minimal() +
  xlim(0, 4) + ylim(0.5, 1.5)

How It Works

  • The create_label_expr function constructs an expression that uses paste(..., sep = '\n') to combine bold and plain lines with newlines.
  • parse = TRUE in geom_text tells ggplot to interpret the label as an R expression, which renders bold() text in bold and respects the newline separators.
  • We escaped single quotes to prevent syntax errors in the parsed expressions—this is important if your text contains apostrophes.

内容的提问来源于stack exchange,提问作者Crops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:10:29