Python: venn3_circles: как получить значения пересечения в круговой диаграмме Венна 3 - PullRequest
0 голосов
/ 05 мая 2018

Работа в python с matplotlib, venn3 и venn3_circles.

Я пытаюсь получить список элементов каждого пересечения на диаграмме Венна из 3 кругов.

Я буду использовать пример здесь

from matplotlib import pyplot as plt
import numpy as np
from matplotlib_venn import venn3, venn3_circles


A = set(['DPEP1', 'CDC42BPA', 'GNG4', 'RAPGEFL1', 'MYH7B', 'SLC13A3', 'PHACTR3', 'SMPX', 'NELL2', 'PNMAL1', 'KRT23', 'PCP4', 'LOX', 'CDC42BPA'])
B = set(['ABLIM1','CDC42BPA','VSNL1','LOX','PCP4','SLC13A3'])
C = set(['PLCB4', 'VSNL1', 'TOX3', 'VAV3'])

v = venn3([A,B,C], ('GCPromoters', 'OCPromoters', 'GCSuppressors'))

ppp=v.get_label_by_id('100').set_text('\n'.join(A-B-C))
v.get_label_by_id('110').set_text('\n'.join(A&B-C))
v.get_label_by_id('011').set_text('\n'.join(B&C-A))
v.get_label_by_id('001').set_text('\n'.join(C-A-B))
v.get_label_by_id('010').set_text('')
plt.annotate(',\n'.join(B-A-C), xy=v.get_label_by_id('010').get_position() +
             np.array([0, 0.2]), xytext=(-20,40), ha='center',
             textcoords='offset points', 
             bbox=dict(boxstyle='round,pad=0.5', fc='gray', alpha=0.1),
             arrowprops=dict(arrowstyle='->',              
                             connectionstyle='arc',color='gray'))

В этом примере они могут показать на графической диаграмме Венна содержимое каждого пересечения enter image description here

Как я могу сохранить в переменной / перечислить содержимое каждого пересечения?

Я хочу получить что-то вроде этого:

A:[MYH7B, PHACTR3,...,DPEP1]
AB: [LOX,...,PCP4]
B: [ABLIM1]
ABC: empty
B: empty
BC: [VSNL1]
C: [TOX3,VAV3,PLCB4]

Где A, AB, ABC, C, ... списки в Python

Ответы [ 2 ]

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

Не уверен, что если после составления диаграммы Венна вы можете отозвать данные, как вы предлагали. Это было бы неплохо, и, надеюсь, кто-нибудь из разработчиков библиотеки ответит.

Сказал это. Что вы можете сделать, так это воспользоваться логической операцией, которую вы можете использовать с python sets .

Operation   Equivalent  Result
len(s)      number of elements in set s (cardinality)
x in s      test x for membership in s
x not in s      test x for non-membership in s
s.issubset(t)   s <= t  test whether every element in s is in t
s.issuperset(t)     s >= t  test whether every element in t is in s
s.union(t)  s | t   new set with elements from both s and t
s.intersection(t)   s & t   new set with elements common to s and t
s.difference(t)     s - t   new set with elements in s but not in t
s.symmetric_difference(t)   s ^ t   new set with elements in either s or t but not both
s.copy()        new set with a shallow copy of s

Например, чтобы получить AB, ABC и т. Д., Вы должны сделать:

AB = A.intersection(B).difference(C)

ABC = A.intersection(B).intersection(C)

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

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

почему бы вам не сохранить его как массив, используя буквенно-цифровой 'токен' в качестве индекса и массив из 3 целочисленных флагов [A, B, C]

, поэтому вы должны иметь элементы, перечисленные как

 - ['MYH7B', [ 1, 0, 0 ]],
 - ['LOX',   [ 1, 1, 0 ]],
 - ['ABLIM1',[ 0, 1, 0 ]],
 - ['VSNL1', [ 0, 1, 1 ]],
 - ['TOX3',  [ 0, 0, 1 ]]

в качестве примеров, а затем вы нарезаете массив, чтобы найти совпадения с образцом.

Он понятен, лаконичен и минимизирует объем хранилища при максимальной универсальности.

Если вы действительно хотите представить раздел «B» как 2 подраздела «B1» и «B2», то вам просто нужно добавить один дополнительный столбец ... [A, B1, B2, C]

 - ['MYH7B', [ 1, 0, 0, 0 ]],
 - ['LOX',   [ 1, 1, 0, 0 ]],
 - ['ABLIM1',[ 0, 1, 0, 0 ]],
 - ['VSNL1', [ 0, 1, 0, 1 ]],
 - ['TOX3',  [ 0, 0, 0, 1 ]]
...