Untitled

 avatar
unknown
plain_text
a year ago
2.6 kB
2
Indexable
library(ggplot2)
library(scales)

# Sample data
df <- data.frame(names = c('MEP', 'HSC', 'Cycling', 'GMP'),
                 NES = c(1.789621, -1.750293, -1.274638, -1.460457),
                 number = c(230, 225, 2205, 219),
                 p_value = c(0.000001, 0.00001, 0.00004, 0.00270))

df$p_value = -log10(df$p_value)
limit = c(-max(df$p_value), max(df$p_value))
# Adjust p-value for negative NES
df$p_value <- ifelse(df$NES < 0, -df$p_value, df$p_value)

# Create categorical variable for the number column
df$category <- cut(df$number,
                   breaks = c(0, 200, 500, 2000, Inf),
                   labels = c("0-200", "200-500", "500-2000", ">2000"),
                   include.lowest = TRUE)

# Define color gradient for p-value
color_gradient <- c("#0077b6", "#90e0ef", "white", "#FC4A50", "#9d0208")

# Create the plot
p <- ggplot(df, aes(x = NES, y = reorder(names, NES))) +
  geom_segment(aes(xend = 0, yend = reorder(names, NES)), size = .25, color = "black") +
  geom_point(aes(size = category, fill = p_value), shape = 21) +  # Use p_value for fill
  scale_fill_gradientn(colors = color_gradient, limits = limit, name = "p-value Intensity") +
  scale_size_manual(values = c("0-200" = 3, "200-500" = 5, "500-2000" = 7, ">2000" = 9), name = "Number Category") +
  geom_vline(xintercept = 0, linetype = "dashed") +
  geom_vline(xintercept = c(-2, -1, 1, 2), linetype = "solid", color = "grey", alpha = 0.25) +
  theme_minimal() +
  labs(x = "NES", y = "", title = "GSEA") +
  theme(
    axis.text.y = element_text(color = "black", margin = margin(t = -5)),  # Adjust y-axis text spacing
    axis.ticks.y = element_blank(),
    legend.position = "right",
    plot.title = element_text(hjust = 0.5),
    panel.grid.major.y = element_blank(),
    panel.grid.minor.y = element_blank(),
    legend.text = element_text(size = 11),  # Adjust legend text size
    legend.box.margin = margin(10, 10, 10, 10),  # Add margin around legend box
    plot.margin = margin(t = 10, r = 10, b = 10, l = 10)  # Reduce plot margin
  ) +
  guides(size = guide_legend(override.aes = list(fill = "grey")), fill = guide_colorbar(order = 2)) +  # Control legend order
  
  # Custom X axis delimiter
  annotate("text", x = 0, y = -0.5, label = "|", size = 10, color = "grey", vjust = 0, hjust = 0.5) +
  
  # Adjust the spacing between points and segments
  scale_y_discrete(expand = expansion(mult = c(0.05, 0.05))) +
  
  # Move the legend outside the plot
  theme(
    legend.margin = margin(0, 0, 0, 10)  # Margin around legend
  )

# Print the plot
print(p)
Editor is loading...
Leave a Comment