在R的matplot中实现重复样本间线条打断的技术问询
Great question! To get lines broken between your replicate groups (a and b) while keeping everything in one plot, the key is to restructure your data into tidy format and create a grouping variable that tells ggplot not to connect points across replicates. Here's how to do it step by step:
Step 1: Prepare your data
First, we'll convert your matrix into a tidy data frame, split the column names into replicate and time point, and create a grouping variable that combines each row ID with its replicate group:
library(tidyverse) # Your original data set.seed(1) data <- matrix(rnorm(10*4), ncol = 10) colnames(data) <- c(paste0("a_", 1:5), paste0("b_", 1:5)) # Convert to tidy format data_tidy <- data %>% as.data.frame() %>% # Add a unique ID for each row (each line in your plot) mutate(row_id = factor(row_number())) %>% # Reshape to long format pivot_longer(-row_id, names_to = "col_name", values_to = "value") %>% # Split column names into replicate and time separate(col_name, into = c("sample", "time"), sep = "_", convert = TRUE) %>% # Create a group variable: each row + replicate combination mutate(group = interaction(row_id, sample)) %>% # Keep track of original column positions for x-axis mutate(x_pos = match(paste0(sample, "_", time), colnames(data)))
Step 2: Plot with broken lines (no visible x-axis gap)
This version keeps the x-axis in your original column order, but lines won't connect between the last point of replicate a and first point of replicate b:
ggplot(data_tidy, aes(x = x_pos, y = value, group = group, color = row_id)) + geom_line() + # Set x-axis ticks to original column names scale_x_continuous( breaks = 1:ncol(data), labels = colnames(data), expand = c(0.05, 0) ) + labs(x = "", y = "tmp") + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
Step 3: Optional: Add a visible gap between replicates
If you want a clear visual gap on the x-axis between a and b, adjust the x positions to leave space between the two groups:
# Adjust x positions to add a gap data_tidy_gap <- data_tidy %>% mutate(x_pos = ifelse(sample == "a", x_pos, x_pos + 1)) # Shift b samples right by 1 ggplot(data_tidy_gap, aes(x = x_pos, y = value, group = group, color = row_id)) + geom_line() + scale_x_continuous( breaks = c(1:5, 7:11), # Skip position 6 for the gap labels = colnames(data), expand = c(0.05, 0), limits = c(0, 12) ) + labs(x = "", y = "tmp") + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
Both approaches keep all your data in a single plot, with lines broken between the two replicate groups. The second version adds a visual gap to make the separation even clearer.
内容的提问来源于stack exchange,提问作者lmsimp

