rggplot2ggtern

Add variable function label to ternary plot in R


I would like to plot my data as a ternary plot, where genes go up or down under one of the three conditions, ie. closer to the condition for which shows higher values.

  1. Are values normalised for each variable independently of the values?
  2. Can I add a label to a selected "gene" variable which states variable "func2"?

here is a reproducible example of what I obtain (top) and what I want (bottom)

gene <- c("Gene1", "Gene2", "Gene3", "Gene4","Gene5", "Gene6")
func1 <- c("A", "B", "C", "D", "C", "A")
func2 <- c("A1", "B1", "C1", "D1", "C2", "A2")
Cond1 <- c(0.007623561, 0.004639893, 0.000994121, 0.017494429, 0.000366445, 0.006663334)
Cond2 <- c(0.011299941, 0.009994388, 0.001012428, 0.013695669, 0.000299771, 0.010287904)
Cond3 <- c(0.005055458, 0.016826251, 0.001311254, 0.016115009, 0.000242897, 0.004583889)
df <- data.frame(gene, func1, func2, Cond1, Cond2, Cond3)


library(ggplot2) 
library(ggtern) 
ggtern(data=df,aes(x=Cond1,y=Cond2,z=Cond3,color=func1)) +
theme_bw() +
geom_point() +
labs(x="Cond1",y="Cond2",z="Cond3") +
scale_T_continuous(breaks=unique(df$x))+ 
scale_L_continuous(breaks=unique(df$y))+ 
scale_R_continuous(breaks=unique(df$z))

enter image description here enter image description here


Solution

  • We store the original plot first:

    library(ggtern)
    
    g = ggtern(data=df,aes(x=Cond1,y=Cond2,z=Cond3,color=func1)) +
    theme_bw() +
    geom_point() +
    labs(x="Cond1",y="Cond2",z="Cond3") +
    scale_T_continuous(breaks=unique(df$x))+ 
    scale_L_continuous(breaks=unique(df$y))+ 
    scale_R_continuous(breaks=unique(df$z))
    

    A simple annotated plot will look like this, using the geom_label_viewport() option:

    g + geom_text(aes(label=func2),hjust=-0.2,vjust=-0.2,size=3)
    

    enter image description here

    You can subset the points to label like this:

    g + geom_text(data=~subset(.,func2 %in% c("C2","B1")),
    aes(label=func2),hjust=-0.2,vjust=-0.2,size=3)