Сделать субплоты гистограммы в pandas dataframe с помощью библиотеки matpolot? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть следующие данные, разделенные по вкладкам:

CHROM   ms02g:PI    num_Vars_by_PI  range_of_PI total_haplotypes    total_Vars
1   1,2 60,6    2820,81 2   66
2   9,8,10,7,11 94,78,10,69,25  89910,1102167,600,1621365,636   5   276
3   5,3,4,6 6,12,14,17  908,394,759,115656  4   49
4   17,18,22,16,19,21,20    22,11,3,16,7,12,6   1463,171,149,256,157,388,195    7   77
5   13,15,12,14 56,25,96,107    2600821,858,5666,1792   4   284
7   24,26,29,25,27,23,30,28,31  12,31,19,6,12,23,9,37,25    968,3353,489,116,523,1933,823,2655,331  9   174
8   33,32   53,35   1603,2991338    2   88


Я использую этот код для построения графиков гистограммы сподзаговоры для каждого CHROM:

with open(outputdir + '/' + 'hap_size_byVar_'+ soi +'_'+ prefix+'.png', 'wb') as fig_initial:
    fig, ax = plt.subplots(nrows=len(hap_stats), sharex=True)
    for i, data in hap_stats.iterrows():

        # first convert data to list of integers
        data_i = [int(x) for x in data['num_Vars_by_PI'].split(',')]
        ax[i].hist(data_i, label=str(data['CHROM']), alpha=0.5)
        ax[i].legend()

    plt.xlabel('size of the haplotype (number of variants)')
    plt.ylabel('frequency of the haplotypes')
    plt.suptitle('histogram of size of the haplotype (number of variants) \n'
                 'for each chromosome')
    plt.savefig(fig_initial)


Все хорошо, кроме двух проблем:

  1. Y-метка frequency of the haplotypes не настроена должным образом на этом графике вывода.

enter image description here



Когда данные содержат только одну строку (см. Данные ниже), подзаговор невозможен, и я получаю TypeError, даже если он сможет создать подгруппу только с одним индексом.

Кадр данных только с одной строкой данных:

 CHROM  ms02g:PI    num_Vars_by_PI  range_of_PI total_haplotypes    total_Vars
 2  9,8,10,7,11 94,78,10,69,25  89910,1102167,600,1621365,636   5   276

TypeError :

Traceback (most recent call last):
  File "phase-Extender.py", line 1806, in <module>
    main()
  File "phase-Extender.py", line 502, in main
    compute_haplotype_stats(initial_haplotype, soi, prefix='initial')
  File "phase-Extender.py", line 1719, in compute_haplotype_stats
    ax[i].hist(data_i, label=str(data['CHROM']), alpha=0.5)
TypeError: 'AxesSubplot' object does not support indexing


Как я могу исправить эти две проблемы?

1 Ответ

0 голосов
/ 24 мая 2018

Ваша первая проблема связана с тем, что вы используете plt.ylabel() в конце цикла.Функции pyplot действуют на текущий объект активных осей, который в данном случае является последним, созданным subplots().Если вы хотите, чтобы ваша метка была центрирована над вашими вспомогательными участками, проще всего было бы создать текстовый объект с центрированием по вертикали на рисунке.найдите положение, которое вас устраивает.Координаты указаны в координатах фигуры, (0,0) слева внизу (1,1) вверху справа.Использование 0,5 в качестве позиции y обеспечивает центрирование метки на рисунке.

Вторая проблема связана с тем, что, когда numrows=1 plt.subplots() возвращает непосредственно объект осей, а не список осей.Есть два варианта решения этой проблемы:

1 - проверьте, есть ли у вас только одна строка, а затем замените ax списком:

fig, ax = plt.subplots(nrows=len(hap_stats), sharex=True)
if len(hap_stats)==1:
    ax = [ax]
(...)

2 - используйте параметр squeeze=False в вашем звонке на plt.subplots(). Как объяснено в документации , использование этой опции заставит subplots() всегда возвращать массив 2D .Поэтому вам придется немного изменить способ индексации осей:

fig, ax = plt.subplots(nrows=len(hap_stats), sharex=True, squeeze=False)
    for i, data in hap_stats.iterrows():
        (...)
        ax[i,0].hist(data_i, label=str(data['CHROM']), alpha=0.5)
        (...)
...