目标图
![](https://img.haomeiwen.com/i1802917/33448542f5793123.png)
最终实现过程
目的:得到一个数据框,第一列为cluster类型,第二列为基因,后面两列为该基因在该cluster的计算值。
思路:
- 第一步,获得初始数据框,行为cluster类别,列为基因,值为其表达量,注意有大量为0.
- 第二步,分两步对该数据框进行分组汇总,分别计算某一基因在某一特定cluster中的平均表达量,不包括0;再计算在该cluster中,有多少个细胞表达了该基因。
- 第三步,将以上两个数据框进行轴转换,得到一个nx3列数据框,前两列分别为cluster 类别和基因名,最后一列为对应值。
- 第四步,将以上两个数据框进行合并,得到最终的数据框。
- 第五步,根据该数据框,进行点图绘制,设置点的大小和点的颜色。
实现代码
count_n_cell_per_gene <- function(x){
return(sum(x>0))
}
mean_exp_per_gene <- function(x){
n_cell <- sum(x>0)
return(sum(x)/n_cell)
}
dotPlot <- function(df){
df_sum_exp <- group_by(df,ident) %>% summarise_each(funs(sum))
df_n_cell <- group_by(df,ident) %>% summarise_each(funs(count_n_cell_per_gene)) %>%
pivot_longer(cols = -ident, names_to = "features",values_to = "n_cells_gene")
df_mean_exp <- group_by(df,ident) %>% summarise_each(funs(mean_exp_per_gene)) %>%
pivot_longer(cols = -ident, names_to = "features",values_to = "mean_exp_gene")
df_mean_exp[is.na(df_mean_exp)] <- 0
df_sum <- merge(df_mean_exp,df_n_cell,by = c("ident","features"))
p <- ggplot(df_sum,aes(x = ident,y = features)) +
geom_point(aes(size = n_cells_gene, color = mean_exp_gene)) +
scale_color_gradient(low = "#FFFFFF",high = "#990000") +
labs(x = '',y = '',color = "mean exp per gene", size = "numbers of cells")+
theme_classic()
return(p)
}
![](https://img.haomeiwen.com/i1802917/1edc36bcc8558df2.png)
小结
一开始,尝试直接用初始数据框获得size,和color 的数值,应该是不行的(至少现在没想通)。回顾看来,其实实现的关键是,依次根据分组得到相应计算值,然后进行轴转换,最后合并得到最终数据框。所以,绘图展示,也是需要前期的数据清洗和整理!整个过程也是各个函数的综合运用了,尤其是tidyverse包!
网友评论