Very good / ¡Muy bien!
Hi All,
My data frame has two columns: Gene names and Z scores. I am using ggplot2 package to make a scatter plot. I was able to create the plot but I don't know how to show only specific gene names on the plot and also how to change the color of the gene names shown.
Here is what I am using:
library(ggplot2)
Data <- read.csv("Data.csv", header = TRUE)
ggplot(Data, aes(x = Count, y = Z_Score))
Lets say I want to show genenames "Gene1", "Gene2", "Gene3" on the plot and in "red", "blue", "green" respectively.
Many Thanks, Hamid
3 answers
I think that Hamid needs to use subset(). A reproducible example, here:
df <- data.frame(
gene = c('a', 'b', 'c', 'd', 'e'),
Count = c(1,2,3,4,5),
Zscore = scale(c(1,2,3,4,5)))
df$genecolour <- rep('black', nrow(df))
df$genecolour[df$gene == 'b'] <- 'firebrick1'
df$genecolour[df$gene == 'c'] <- 'royalblue'
df$genecolour[df$gene == 'e'] <- 'forestgreen'
df
gene Count Zscore genecolour
a 1 -1.2649111 black
b 2 -0.6324555 firebrick1
c 3 0.0000000 royalblue
d 4 0.6324555 black
e 5 1.2649111 forestgreen
require(ggplot2)
require(ggthemes)
ggplot(data = df, aes(x = Count, y = Zscore, label = gene), colour = gene) +
geom_point(size = 15.0, colour = df$genecolour) +
geom_label(data = subset(df, gene %in% c('b','c','e'))) +
theme(legend.position = 'none') +
theme_wsj()
Snooker (billiards), anyone?
Kevin
Using the dataset (without predefined colours) of my master and life coach @Kevin you could do this adding extra geom_point layers anytime you want. It just depends on how many genes you want to highlight...
library(tidyverse)
library(ggrepel)
df <- data.frame(gene = c('a', 'b', 'c', 'd', 'e'),
Count = c(1,2,3,4,5),
Zscore = scale(c(1,2,3,4,5)))
df %>%
ggplot(aes(Count, Zscore,label = gene)) +
geom_point() +
geom_point(data = df %>% filter(gene == "a"), color = "red") +
geom_point(data = df %>% filter(gene == "b"), color = "blue") +
geom_point(data = df %>% filter(gene == "c"), color = "green") +
geom_text_repel()

You can also color based on a specific or a range of values in your Z-score column like here:
df %>%
ggplot(aes(Count, Zscore,label = gene)) +
geom_point() +
geom_point(data = df %>% filter(gene == "a"), color = "red") +
geom_point(data = df %>% filter(Zscore >= 0), color = "green") +
geom_text_repel()

ooh I literally did this last night!
You need to include the name of the labels in your data set eg.
newcolumn <- c(rep("Lympho",100),rep("Epithel",100),rep("Erythr",100),rep("Fibro",101))
once you have done this you can set colour of your plot with that column and this will be the legend. Not sure how you specify the actual colours though.
mynewdata <- data.frame(myolddata, newcolumn)
p <- ggplot() +
geom_point(data = mynewdata,
mapping = aes(x = comp1,
y = comp2,
colour = newcolumn,
))
print(p)
or if you already have a column in your data set then just replace 'newcolumn' with that
Log in to answer this question.

This is definitely a https://stackoverflow.com/ kind of question. By the way, you should bring a concrete example dataset. Your information is not enough.
You can find various generic solutions on stackoverflow (as pointed below) or stdha.com. Basically, you would have to have Gene names as factors and
colorinaesascolor=Gene. However, if you have 1000 genes and you want to give each of them a specific color, you will run into problem of color scale! You will end up choosing some sort of gradient, which will make it harder to understand if you are trying to display specific gene or some sort of continuous (gene expression) information!!