Как построить гистограмму, используя номера строк в качестве бинов? - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь построить гистограмму данных взаимодействия по всему геному для набора генов. Кадр данных отображается правильно, когда я печатаю его или сохраняю в 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

Возможно, мне не хватает очевидной ошибки в коде, но я застрял на этом со вчерашнего дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...