Как создать точечную диаграмму для сравнения двух вложенных словарей с другим вложенным словарем с такими же ключами - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть три вложенных словаря: data_geo1, data_geo2, data_ali, которые все состоят из двух ключей и одного значения. Цель состоит в том, чтобы сравнить ценности друг с другом. Первый ключ словарей такой же, но для второго 30 из них используются в первом словаре, а 20 - во втором словаре! К сожалению, ориентация клавиши не совпадает друг с другом. Цель состоит в том, чтобы создать точечную диаграмму с помощью matplotlib и numpy array для сравнения первого и второго словаря с данными в 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_20: 460_2: S3: 460: 2: S3: 460: 2: S3: 460: v2: S3: 460: v2: S3: 460: v2: S0: 460: v2: S3: 460: v2: S3: 460: v2: S3: 460, v2: S3, S0, S2: S6, S3, S2, S2: S6, N0, S2, S3, S2: 6: 6, leish_015_2, S2: 6 , '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, «282», образец S282 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_3_0_0_0_0_2_2_2_2_2_2_2_2_2_2_2-le_0_2_2_0, 285 : 590, 'Sample_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_021_v2' S0: 8: 834: 8: 8 }

data_geo2: {'ENSG00000110514': {'Sample_19': 518, 'Sample_10': 468, 'Sample_20': 517, 'Sample_9': 431, 'Sample_8': 522, 'Sample_7': 437, 'Sample_6' : 491, «Образец_5»: 461, «Образец_4»: 442, «Образец_3»: 667, «Образец_2»: 438, «Образец_1»: 378, «Образец_14»: 345, «Образец_13»: 424, «Образец_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_6-lev_125: 593, Sample_6-le_101: 5 -leish_018_v3 ': 661,' Sample_22-leish_024_v3 ': 539,' Sample_23-leish026_v2 ': 710,' Sample_25-leish027_v2 ': 689,' Sample_18-leish_022_v3 ': 681,' Sample_14 '011: 341: 341: 341: 341: 341: 341: 341: 341: 341 ": S1_14_3_1: 341: 341", S1_14_3_1: 341: S1_1_3_1: 341 ", S1_3_1": 341 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_v3', S7: 637: 637: 737: 637: 737: 637: 737: 637: 737: 737: 637: 737: 637: 737: 637: 737: 637: 737: 637: 737: 637: 737: 637: 737: 637: 737: 637: 737: 637: 737: 6: 737: 6: 637: 6: 637: 6: 637: 6: 6: 6: 6: 6: 6: 6: 6: 6: 6: 6: 6 «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 »_271: 521, Sample -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': 67 0, «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_14-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} * 101 *

1 Ответ

0 голосов
/ 29 апреля 2019

Вы должны быть в состоянии "развернуть" словари, как это:

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()

, а другой вариант просто использует вышеприведенные диктанты для построения графика:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...