Я пытаюсь построить гистограмму данных взаимодействия по всему геному для набора генов. Кадр данных отображается правильно, когда я печатаю его или сохраняю в csv, но когда я пытаюсь создать гистограмму, биннинг неверен, а значения отображаются некорректно. Еще многое нужно сделать, чтобы сделать его более эффективным, поскольку я просто пытаюсь заставить его работать прямо сейчас, но я уверен, что вы можете увидеть мою неопытность в коде, поскольку это не самая элегантная вещь в мире.
def plot_data():
args = parse_args(sys.argv[1:])
genes = csv.reader(open(args.genes, 'r'), delimiter='\t')
out = csv.reader(open(args.output, 'r'), delimiter='\t')
arr1 = []
arr2 = []
for x in out: # create two separate lists to drop duplicates and create a single ordered coordinate column in Dataframe
arr1.append(str(x[0]) + "\t" + str(x[2]) + "\t" + str(x[3]))
arr2.append(str(x[1]) + "\t" + str(x[2]) + "\t" + str(x[3]))
df1 = pd.DataFrame([x.split('\t') for x in arr1], columns=['c1', 'contacts', 'gene']).drop_duplicates(('gene', 'c1'), keep=False)
df2 = pd.DataFrame([x.split('\t') for x in arr2], columns=['c2', 'contacts', 'gene']).drop_duplicates(('gene', 'c2'), keep=False)
dfm = df1.merge(df2, left_on=['contacts','gene'], right_on = ['contacts','gene'], how='outer').fillna(0)
dfm[['c1', 'c2']] = dfm[['c1', 'c2']].apply(pd.to_numeric) # change 'c1' and 'c2' values to int64 numeric values
dfm['c'] = dfm['c1'] + dfm['c2'] # create index by summing 'c1' and 'c2' indices
dfm = dfm[['c', 'contacts', 'gene']] # drop 'c1' and 'c2' columns and keep the merged 'c' column
dfm = dfm.pivot(index='c', columns='gene', values='contacts').fillna(0).reindex(dfm.index, fill_value=0).apply(pd.to_numeric) # re-arranges dataframe so that 'gene' is the column name and 'c' is the row index
dfm = dfm[dfm.index <= 2337] # remove rows with 'c' greater than 2337
dfm = dfm[dfm.index > 0] # remove 0 row from 'c'
num_bins = len(dfm.index)
dfm.hist(bins=num_bins, sharex=True, sharey=True)
plt.xlabel("Bin number", fontsize=12)
plt.ylabel("Interaction count", fontsize=12)
plt.yscale('log')
plt.show()
plot = plot_data()
Это просто фрагмент, но выходные данные Dataframe из этого кода выглядят примерно так (фактический Dataframe имеет 2337 строк плюс строку заголовка):
gene1 gene2 gene3
1 2498.44 741.13 78.07
2 0.0 799.87 113.44
3 1463.36 1715.41 83.52
4 799.83 0.0 140.63
5 476.46 1138.58 105.91
6 353.92 667.51 125.78
7 349.17 335.82 114.90
8 0.0 0.0 0.0
9 179.30 287.71 126.03
10 139.17 207.05 67.16
11 95.32 94.28 69.63
12 64.50 66.24 25.24
13 38.83 67.29 28.50
14 27.85 48.96 29.81
15 37.86 51.28 17.29
16 18.80 42.25 16.09
17 39.28 29.57 21.91
18 22.02 37.41 13.73
19 17.02 38.08 10.41
20 27.27 20.55 14.17
По какой-то причине, когда Я запускаю это, я получаю вывод, который не показывает 0 значений (из Dataframe) в правильных местоположениях, а другие значения кажутся неправильными. Биннинг нечетный, учитывая, что должно быть 2337 бинов, но ось x проходит далеко за 2500. Вот пример одной такой гистограммы (извините, только что создал учетную запись):
https://i.stack.imgur.com/Wo0qC.png
Возможно, мне не хватает очевидной ошибки в коде, но я застрял на этом со вчерашнего дня.