Выделите часть диаграммы рассеяния, содержащую указанные c точек в python - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать график Манхэттена, который будет вертикально выделен в определенных частях графика с учетом списка значений, соответствующих точкам на графике рассеяния. Я просмотрел несколько примеров, но не знаю, что делать дальше. Я думаю, что использование axvspan или ax.fill_between должно работать, но я не уверен, как это сделать. Приведенный ниже код был взят непосредственно из Как создать график Манхэттена с помощью matplotlib в python?

from pandas import DataFrame
from scipy.stats import uniform
from scipy.stats import randint
import numpy as np
import matplotlib.pyplot as plt

# some sample data
df = DataFrame({'gene' : ['gene-%i' % i for i in np.arange(10000)],
'pvalue' : uniform.rvs(size=10000),
'chromosome' : ['ch-%i' % i for i in randint.rvs(0,12,size=10000)]})

# -log_10(pvalue)
df['minuslog10pvalue'] = -np.log10(df.pvalue)
df.chromosome = df.chromosome.astype('category')
df.chromosome = df.chromosome.cat.set_categories(['ch-%i' % i for i in range(12)], ordered=True)
df = df.sort_values('chromosome')

# How to plot gene vs. -log10(pvalue) and colour it by chromosome?
df['ind'] = range(len(df))
df_grouped = df.groupby(('chromosome'))

fig = plt.figure()
ax = fig.add_subplot(111)
colors = ['red','green','blue', 'yellow']
x_labels = []
x_labels_pos = []
for num, (name, group) in enumerate(df_grouped):
    group.plot(kind='scatter', x='ind', y='minuslog10pvalue',color=colors[num % len(colors)], ax=ax)
    x_labels.append(name)
    x_labels_pos.append((group['ind'].iloc[-1] - (group['ind'].iloc[-1] - group['ind'].iloc[0])/2))
ax.set_xticks(x_labels_pos)
ax.set_xticklabels(x_labels)
ax.set_xlim([0, len(df)])
ax.set_ylim([0, 3.5])
ax.set_xlabel('Chromosome')

с учетом списка значений точки, pvalues, например,

lst = [0.288686, 0.242591, 0.095959, 3.291343, 1.526353]

Как выделить на графике область, содержащую эти точки, как показано зеленым цветом на изображении ниже? Что-то похожее на:

Text](https://stackoverflow.com/image.jpg)[![enter image description here] 1

1 Ответ

0 голосов
/ 28 мая 2020

Было бы полезно, если бы у вас есть образец вашего фрейма данных для справки.

Предполагая, что вы хотите сопоставить свои lst значения со значениями Y, вам нужно перебрать каждое значение Y вы строите график и проверяете, находятся ли они в пределах lst.

for num, (name, group) in enumerate(df_grouped):

group Переменные в вашем коде, по сути, являются частичными фреймами данных вашего основного фрейма данных, df . Следовательно, вам нужно ввести еще один l oop, чтобы просмотреть все значения Y для lst совпадений

region_plot = []
for num, (name, group) in enumerate(a.groupby('group')):
    group.plot(kind='scatter', x='ind', y='minuslog10pvalue',color=colors[num % len(colors)], ax=ax)
    #create a new df to get only rows that have matched values with lst
    temp_group = group[group['minuslog10pvalue'].isin(lst)] 
    for x_group in temp_group['ind']:
        #If condition to make sure same region is not highlighted again
        if x_group not in region_plot:
            region_plot.append(x_group)
            ax.axvspan(x_group, x_group+1, alpha=0.5, color='green')
            #I put x_group+1 because I'm not sure how big of a highlight range you want

Надеюсь, это поможет!

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