10X單細胞(10X空間轉錄組)畫圖操作之二維colorbar

之前一些同學一直問一個問題,如何在一張TSNE或者UMAP展示兩個基因的表達情況官疲,但是最直觀的思考就是一個點(cell)如果展示兩個基因的表達量,那必將填充兩種顏色亮隙,這明顯是不可行的途凫,結果將是兩種顏色的疊加,當然這種情況又是必須的溢吻,因為我們在做細胞通訊的時候希望一張圖上直接展示配體和受體的分布及表達情況维费,那么今天就給大家?guī)硪环N方法,設置二維colorbar促王,以下圖為例:

圖片.png

圖上展示的就是將配體和受體同時在一張圖上展示的現(xiàn)象犀盟,設置了二維的colorbar,今天我們借助python畫圖的力量蝇狼,來實現(xiàn)這張圖阅畴,以后我們就可以按照這個方法來繪制我們的配受體圖了,很贊Q冈拧贱枣!~~

這里我用python實現(xiàn)并完善成一個方便使用的函數(shù)colorbar2d,在這里做簡要介紹并提供源碼颤专。

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()
圖片.png

這個時候換成我們的配受體表達值掉冶,套用這個方法,就可以實現(xiàn)我們一開始說的功能脐雪。

生活很好厌小,有你更好

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市战秋,隨后出現(xiàn)的幾起案子璧亚,更是在濱河造成了極大的恐慌,老刑警劉巖脂信,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癣蟋,死亡現(xiàn)場離奇詭異,居然都是意外死亡狰闪,警方通過查閱死者的電腦和手機疯搅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埋泵,“玉大人幔欧,你說我怎么就攤上這事±錾” “怎么了礁蔗?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雁社。 經(jīng)常有香客問我浴井,道長,這世上最難降的妖魔是什么霉撵? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任磺浙,我火速辦了婚禮,結果婚禮上喊巍,老公的妹妹穿的比我還像新娘屠缭。我一直安慰自己,他們只是感情好崭参,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布呵曹。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奄喂。 梳的紋絲不亂的頭發(fā)上铐殃,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音跨新,去河邊找鬼富腊。 笑死,一個胖子當著我的面吹牛域帐,可吹牛的內(nèi)容都是我干的赘被。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼肖揣,長吁一口氣:“原來是場噩夢啊……” “哼民假!你這毒婦竟也來了?” 一聲冷哼從身側響起龙优,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤羊异,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彤断,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體野舶,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年宰衙,在試婚紗的時候發(fā)現(xiàn)自己被綠了平道。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡菩浙,死狀恐怖巢掺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劲蜻,我是刑警寧澤陆淀,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站先嬉,受9級特大地震影響轧苫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜疫蔓,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一含懊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衅胀,春花似錦岔乔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘿歌。三九已至,卻和暖如春茁影,著一層夾襖步出監(jiān)牢的瞬間宙帝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工募闲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留步脓,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓浩螺,卻偏偏與公主長得像靴患,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子要出,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容