之前一些同學一直問一個問題,如何在一張TSNE或者UMAP展示兩個基因的表達情況官疲,但是最直觀的思考就是一個點(cell)如果展示兩個基因的表達量,那必將填充兩種顏色亮隙,這明顯是不可行的途凫,結果將是兩種顏色的疊加,當然這種情況又是必須的溢吻,因為我們在做細胞通訊的時候希望一張圖上直接展示配體和受體的分布及表達情況维费,那么今天就給大家?guī)硪环N方法,設置二維colorbar促王,以下圖為例:
圖上展示的就是將配體和受體同時在一張圖上展示的現(xiàn)象犀盟,設置了二維的colorbar,今天我們借助python畫圖的力量蝇狼,來實現(xiàn)這張圖阅畴,以后我們就可以按照這個方法來繪制我們的配受體圖了,很贊Q冈拧贱枣!~~
這里我用python實現(xiàn)并完善成一個方便使用的函數(shù),在這里做簡要介紹并提供源碼颤专。
colorbar2d 可選擇輸入以下參數(shù):
- list1:(必須)一維數(shù)組纽哥,將轉換為色相信息;
- list2:(必須)一維數(shù)組栖秕,將轉換為明度信息春塌;
- minColor:字符串,表示起始色相簇捍,默認minColor = None(注)只壳;
- maxColor:字符串,表示終止色相垦写,默認minColor = None(注)吕世;
- maxv:0-1之間的浮點數(shù)或整數(shù),表示最暗的明度梯投,默認maxv = 1命辖,即純黑色;
- s:0-1之間的浮點數(shù)或整數(shù)分蓖,表示飽和度尔艇,默認s = 1,即飽和度最大么鹤;
- step:colormap的繪制方式為矩陣排列的散點疊加而成终娃,該參數(shù)用于控制散點的間隔;默認step = 0.05蒸甜;
colorbar2d 實例化后棠耕,可選擇返回以下輸出:
- colorbar2d.rgb():返回 n×3 數(shù)組余佛,n 為輸入的一維數(shù)組的長度值,即樣本數(shù)窍荧;3 為R辉巡、G、B信息蕊退;
- colorbar2d.hsv():返回 n×3 數(shù)組郊楣,即各樣本的H、S瓤荔、V信息(不常用)净蚤;
- colorbar2d.colorbar(),返回兩個一維數(shù)組(x输硝、y軸散點坐標)和一個 n×3 數(shù)組(散點的RGB信息)今瀑;
上述信息用于繪制二維colorbar;注:顏色可選擇紅(red腔丧,r)放椰、橙(orange,o)愉粤、黃(yellow砾医,y)、綠(green衣厘,g)如蚜、青(cyan,c)影暴、藍(blue错邦,b)、紫(purple型宙,m)撬呢;若輸入中沒有顏色范圍指示,colorbar默認繪制從紅至紫的所有色相妆兑。
分享一下源碼
from matplotlib import colors
import numpy as np
class colorbar2d:
def __init__(self, list1, list2, minColor = None, maxColor = None, maxv = 1, s = 1, step = 0.05):
self.list1_max, self.list1_min = max(list1), min(list1)
self.list2_max, self.list2_min = max(list2), min(list2)
self.maxv = maxv
self.maxs = s
# 將所選特征0-1化
if minColor == None and maxColor == None:
self.h = (list1 - self.list1_min) / (self.list1_max - self.list1_min)
self.limit_color = False
else:
color_dic = {'red':0, 'orange':18, 'yellow':30, 'green':56,
'cyan':88, 'blue':112, 'purple':140, 'r':0,
'o':18, 'y':30, 'g':56, 'c':88,
'b':112, 'm':140}
self.mincolor = color_dic.get(minColor)/180.0
self.maxcolor = color_dic.get(maxColor)/180.0
self.h = (list1 - self.list1_min) / (self.list1_max - self.list1_min) * (self.maxcolor - self.mincolor) + self.mincolor
self.limit_color = True
self.v = (list2 - self.list2_min) / (self.list2_max - self.list2_min) * self.maxv + (1- self.maxv)
self.s = [self.maxs for i in range(len(list1))]
self.hsv = np.zeros(shape=(len(list1),3))
self.hsv[:,0] = self.h
self.hsv[:,1] = self.s
self.hsv[:,2] = self.v
def rgb(self):
self.rgb = colors.hsv_to_rgb(self.hsv)
return self.rgb
def hsv(self):
return self.hsv
def colorbar(self):
h = 0.05
xx, yy = np.meshgrid(np.arange(self.list1_min, self.list1_max, h),
np.arange(self.list2_min, self.list2_max, h))
xx, yy = xx.ravel(), yy.ravel()
if self.limit_color == False:
colorbar_h = (xx - self.list1_min) / (self.list1_max - self.list1_min)
colorbar_v = (yy - self.list2_min) / (self.list2_max - self.list2_min)
else:
colorbar_h = (xx - self.list1_min) / (self.list1_max - self.list1_min) * (self.maxcolor - self.mincolor) + self.mincolor
colorbar_v = (yy - self.list2_min) / (self.list2_max - self.list2_min) * self.maxv + (1- self.maxv)
colorbar_s = [self.maxs for i in range(len(xx))]
hsv = np.zeros(shape=(len(xx),3))
hsv[:,0] = colorbar_h
hsv[:,1] = colorbar_s
hsv[:,2] = colorbar_v
rgb = colors.hsv_to_rgb(hsv)
return xx, yy, rgb
以鳶尾花數(shù)據(jù)集為例繪制題圖魂拦。該數(shù)據(jù)集中每個樣本(鳶尾花)有四個屬性:花萼長度(Sepal Length),花萼寬度(Sepal Width)搁嗓,花瓣長度(Petal Length)芯勘,花瓣寬度(Petal Width)。數(shù)據(jù)集共150個樣本腺逛,包含三種鳶尾花:Setosa(山鳶尾)荷愕、Versicolour(雜色鳶尾),Virginica(維吉尼亞鳶尾)。
我們選擇Sepal Length安疗、Sepal Width以散點圖的x抛杨、y軸表示,Petal Length茂契、Petal Width分別以colorbar顏色屬性中的色相蝶桶、明度表示。代碼及結果如下:
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
iris = load_iris()
mycolorbar = colorbar2d(iris.data[:,2], iris.data[:,3], 'b', 'r', maxv = 0.8)
mycolorbar_rgb = mycolorbar.rgb()
colorbar_x, colorbar_y, xy_color = mycolorbar.colorbar()
fig = plt.figure(figsize=(8,6))
fig.subplots_adjust(wspace = 0.5, hspace = 0.5)
plt.subplot2grid((1,4),(0,0),colspan=3)
plt.scatter(iris.data[:50,0], iris.data[:50,1],
s = 30, marker = '^', c = mycolorbar_rgb[:50,:],
label = 'Setosa')
plt.scatter(iris.data[50:100,0], iris.data[50:100,1],
s = 30, marker = 'o', c = mycolorbar_rgb[50:100,:],
label = 'Versicolour')
plt.scatter(iris.data[100:,0], iris.data[100:,1],
s = 30, marker = '*', c = mycolorbar_rgb[100:,:],
label = 'Virginica')
plt.xlabel("sepal length")
plt.ylabel("sepal width")
plt.title("sepal length and width scatter")
plt.legend(loc = "upper right")
plt.subplot2grid((1,4),(0,3))
plt.scatter(colorbar_y, colorbar_x, c = xy_color)
plt.xlim(colorbar_y.min(), colorbar_y.max())
plt.ylim(colorbar_x.min(), colorbar_x.max())
plt.xlabel("petal width")
plt.ylabel("petal length")
plt.title('colormap')
plt.show()
這個時候換成我們的配受體表達值掉冶,套用這個方法,就可以實現(xiàn)我們一開始說的功能脐雪。
生活很好厌小,有你更好