【问题标题】:how to create a scatter plot for comparing 2 nested dictionaries with another nested dictionary with same keys如何创建散点图以将 2 个嵌套字典与另一个具有相同键的嵌套字典进行比较
【发布时间】:2019-04-29 15:58:50
【问题描述】:

我有三个嵌套字典:data_geo1、data_geo2、data_ali,它们都由两个键和一个值组成。目标是相互比较这些值。字典的第一个键是一样的,但第二个,其中 30 个与第一个字典共享,其中 20 个与第二个字典共享!不幸的是,键的方向彼此不同。目标是使用 matplotlib 和 numpy 数组创建散点图,以将第一个和第二个字典与 data_ali 中的数据进行比较。有点复杂,不知道从何说起!下面是我写的用于创建字典的内容:

import os
import numpy as np

path = "/home/ali/Desktop/data/"
root = "/home/ali/Desktop/SAMPLES/"



data_geo1={}
with open(path+"GSE98212_H_DE_genes_count.txt","rt") as fin: #data for sample 1-30
    h = fin.readline()
    sample1 = h.split()
    sample_names = [s.strip('"') for s in sample1[1:31]]
    for l in fin.readlines():
        l = l.strip().split()
        if l:
            gene= l[0].strip('"')
            data_geo1[gene] = {}
            for i, x in enumerate(l[1:31]):
                data_geo1[gene][sample_names[i]] = int(x)

#print(data_geo1)

data_geo2={}
with open (path+"GSE98212_L_DE_genes_count.txt","rt") as fin:
        h= fin.readline()
        sample2=h.split()
        sample_names=sample2[1:21]
        for l in fin.readlines():
            l = l.strip().split()
            if l:
                gene= l[0].strip()

            data_geo2[gene]={}
            for i,x in enumerate (l[1:21]):
                data_geo2[gene][sample_names[i]]= int(x)

#print(data_geo2)

data_ali={}

for sample_name in os.listdir(root):
    with open(os.path.join(root, sample_name, "counts.txt"), "r") as fin:
        for line in fin.readlines():
            gene, reads = line.split()
            reads = int(reads)
            if gene.startswith('ENSG'):
                data_ali.setdefault(gene, {})[sample_name] = reads

#print(data_ali)

每个字典结构的例子:

data_geo1:{'ENSG00000110514':{'Sample_19-leish_023_v2':709,'Sample_4-leish_012_v3':501,'Sample_25-leish027_v2':690,'Sample_6-leish_015_v3':27070,'Sample_6-leish_015_v3':27070 , 'Sample_20-leish_023_v3': 619, 'Sample_18-leish_022_v3': 678, 'Sample_10-leish_017_v3': 477, 'Sample_13-leish_019_v2': 460, 'Sample_1-Leish_011_v2': 574, 'Sample_11-leish_018_v2': 566, ' Sample_3-leish_012_v2': 632, 'Sample_2-leish_011_v3': 388, 'Sample_29-leish032_v2': 661, 'Sample_8-leish_016_v3': 372, 'Sample_28-leish028_v3': 533, 'Sample_27-leish028_v2': 582, 'Sample_26- leish027_v3': 624, 'Sample_12-leish_018_v3': 653, 'Sample_5-leish_015_v2': 421, 'Sample_16-leish_021_v3': 376, 'Sample_21-leish_024_v2': 668, 'Sample_9-leish_017_v2': 583, 'Sample_24-leish026_v3' :590,'sampe_22-leish_024_v3':537,'sample_14-leish_019_v3':438,'sample_30-leish032_v3':494,'sample_7-leish_016_v2':518,sample_15-leish_15-leish_15-leish_17.17; }

data_geo2:{'ENSG00000110514': {'Sample_19': 518, 'Sample_10': 468, 'Sample_20': 517, 'Sample_9': 431, 'Sample_8': 522, 'Sample_7': 437, 'Sample_6' :491,'Sample_5':461,'Sample_4':442,'Sample_3':667,'Sample_2':438,'Sample_1':378,'Sample_14':345,'Sample_13':424,'Sample_18':570 , 'Sample_15': 492, 'Sample_16': 486, 'Sample_12': 401, 'Sample_17': 489, 'Sample_11': 464}

data_ali: 'ENSG00000110514': {'Sample_19-leish_023_v2': 710, 'Sample_16-leish_021_v3': 380, 'Sample_20': 517, 'Sample_24-leish026_v3': 593, 'Sample_16-leish_01': 593, 'Sample_16-leish_01' -leish_018_v3':661,'sample_22-leish_024_v3':539,'sample_23-leish026_v2':710,'sample_25-leish027_v2':689:689,'sample_18-leish_18-leish_0222_v3'sample_________3':681':681,14.14'' 394, 'Sample_13-leish_019_v2': 464, 'Sample_1-Leish_011_v2': 574, 'Sample_11-leish_018_v2': 571, 'Sample_20-leish_023_v3': 625, 'Sample_3-leish_012_v2': 637, 'Sample_10-leish_017_v3': 479, 'Sample_7':436,'Sample_29-leish032_v2':659,'Sample_8-leish_016_v3':375,'Sample_6':492,'Sample_7-leish_016_v2':517,'Sample_9':432,'Sample_8_2':52 -leish028_v2':584,'Sample_26-leish027_v3':629,'Sample_5':460,'Sample_4':441,'Sample_3':668,'Sample_19':516,'Sample_1':378,'Sample_2':437, 'Sample_9-leish_017_v2':582,'Sample_5-leish_015_v2':421,'Sample_4-leish_012_v3':502,'Sample_21-leish_024_v2':670, 'Sample_18':573,'Sample_13':426,'Sample_12':403,'Sample_11':463,'Sample_10':466,'Sample_17':488,'Sample_16':487,'Sample_15':490,'Sample_1 -leish_019_v3':441,'Sample_30-leish032_v3':497,'Sample_28-leish028_v3':542,'Sample_15-leish_021_v2':837,'Sample_17-leish_022_v2':747}

【问题讨论】:

    标签: python numpy dictionary matplotlib nested


    【解决方案1】:

    您应该能够像这样“解包”字典:

    main_key=u'ENSG00000110514'
    
    geo1_labels = data_geo1[main_key].keys() 
    geo1_ys = [data_geo1[main_key][x] for x in geo1_labels]
    ali_geo1_ys = [data_ali[main_key][x] for x in geo1_labels]
    
    geo2_labels = data_geo2[main_key].keys() 
    geo2_ys = [data_geo2[main_key][x] for x in geo2_labels]
    ali_geo2_ys = [data_ali[main_key][x] for x in geo2_labels]
    

    然后你可以例如散点图用于比较的值,例如:

    import matplotlib.pyplot as plt
    
    fig,ax=plt.subplots()
    
    ax.scatter(range(len(geo1_labels)),geo1_ys,facecolors="None",edgecolors="b",marker="o")
    ax.scatter(range(len(geo1_labels)),ali_geo1_ys,facecolors="None",edgecolors="r",marker="s")
    
    ax.set_xticks(range(len(geo1_labels)) )
    ax.set_xticklabels(geo1_labels,rotation=90)
    
    plt.tight_layout()
    plt.show()
    

    更新: 有几种方法可以得到你描述的图,一种方法是使用模块pandas;在这种特定情况下,这似乎需要更多的努力,但它很受欢迎:

    import matplotlib.pyplot as plt
    import pandas as pd
    
    main_key=u'ENSG00000110514'
    
    compare1=pd.DataFrame.from_dict({
        'data_geo2':data_geo1[main_key],
        'data_ali':{k:data_ali[main_key][k] for k in data_geo1[main_key].keys()}
    },orient='index')
    
    compare2=pd.DataFrame.from_dict({
        'data_geo2':data_geo2[main_key],
        'data_ali':{k:data_ali[main_key][k] for k in data_geo2[main_key].keys()}
    },orient='index')
    
    compare1['Sample_19-leish_023_v2'].plot.bar()
    
    plt.tight_layout()
    plt.show()
    
    

    另一种选择是直接使用上面的dicts进行绘图:

    import matplotlib.pyplot as plt
    
    main_key=u'ENSG00000110514'
    sample_key=u'Sample_19-leish_023_v2'
    
    fig,ax=plt.subplots()
    
    xs=[0,1]
    ys=[ data_geo1[main_key][sample_key], data_ali[main_key][sample_key] ]
    
    ax.bar(xs,ys)
    ax.set_xticks(xs)
    ax.set_xticklabels(['data_geo1','data_ali'])
    
    plt.tight_layout()
    plt.show()
    

    【讨论】:

    • 感谢您的建议,但您只为一个键编写主键,但我的键是可变的,如下所示:'ENSG00000268358'、'ENSG00000254148'、'ENSG00000254148'、'ENSG00000254148'等。我该如何解决这个问题以通过这些键中的每一个?这些键在 3 个字典之间都是相互的!它们是我在上面创建的 3 个字典中的基因 1 和基因 2 和基因!
    • 啊,这在你原来的问题中并不清楚。这些其他字典是否仍然包含第二级的“统一”键,即您是否有像 Sample_19Sample_19-leish_023_v2 这样的键?最后,您是否想加入所有一种类型(例如,使用“leish" in the key) 在一个大情节中?另外,您是否需要以某种方式跟踪主键,或者它们可以被删除?
    • 很抱歉,我无法准确地澄清自己。我在上面写了字典是如何构建的代码,你可以注意到每个字典我都有与其他人共同的“基因”键。我想将“data_geo1”和“data_geo2”值与“data_ali”值进行比较。对于第二级键,“data_geo1”有 30 个键,“data_geo2”有 20 个键,data_ali 有 50 个键,这意味着“data_geo1”和“data_geo2”中存在的所有键,我们在“data_ali”中有它们!所以最好将它们与一级键进行比较。
    • 我只需要比较这些值,但要与另一个值进行比较!例如,将 data_geo1 'ENSG00000110514' 'Sample_19-leish_023_v2 与 data_ali 'ENSG00000110514' 'Sample_19-leish_023_v2' 进行比较。清楚吗?目的是将data_geo1和data_geo2与data_ali进行比较
    • 要明确一点:您有一个带有 'ENSG00000110514' 之类主键的字典列表,并且希望能够绘制特定样本的值,例如Sample_19-leish_023_v2 [可能是@987654330 @ plot in matplotlib?] 来自两个字典 data_geo1data_ali 的同一个主键?在上面的示例中,您只想在一个图中绘制 y 值:[709,710] 和 x-values["data_geo1","data_ali"]?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2012-02-10
    • 2019-01-09
    • 2021-05-22
    相关资源
    最近更新 更多