在2d矩阵中绘制要素的存在

时间:2017-09-15 15:45:21

标签: python python-3.x matplotlib plot

我有一个字典(在python中),其中键是动物名称,值是包含基因名称的集合。并非所有动物都拥有所有基因。 大约有108个基因(我有一个列表)和15个种类。所有动物共有28种基因。

我想在动物中为每种动物和基因绘制一个基因的存在。 例如:

d = {'dog': {'tnfa', 'tlr1'}, 'cat': {'myd88', 'tnfa', 'map2k2'}}

我想要的情节看起来像这样:

        dog    cat
tnfa     x      x
myd88           x
tlr1     x
map2k2          x

如果我能将具有最多基因的动物分组在一起,那将是很好的。但这是可选的。

您对我可以采取的方法有什么建议吗?

3 个答案:

答案 0 :(得分:1)

使用pandas crosstab将获得您正在寻找的矩阵

d = {'dog': ['tnfa', 'tlr1'], 'cat': ['myd88', 'tnfa']}

#data munging
df = pd.DataFrame(d).stack()
df.index = df.index.droplevel(0)

#create and format crosstab
ct = pd.crosstab(df.index, df.values)
ct.index.name = "animal"
ct.columns.name= "gene"
ct = ct.replace([0, 1], ["" , "x"])
ct = ct.T

print(ct)

结果

animal cat dog
gene          
myd88    x    
tlr1         x
tnfa     x   x

不确定分组 - 您的意思是基因数量还是常见基因?可能还需要一些更多的例子。

答案 1 :(得分:1)

我们试试这个:

axios({
  method: 'post',
  url: '/graphql',
  // payload is the payload above
  data: payload,
});

输出:

d = {'dog': {'tnfa', 'tlr1'}, 'cat': {'myd88', 'tnfa'}}

df = pd.DataFrame.from_dict(d, orient='index')

df.stack().reset_index()\
  .drop('level_1',axis=1).assign(Value='x')\
  .set_index([0,'level_0'])['Value']\
  .unstack().rename_axis('gene')\
  .rename_axis('animal', 1)

答案 2 :(得分:1)

一个纯python解决方案:

我的解决方案只使用一些简单的pandasfor-loops方法来打印整齐的表格,而不是使用.ljust

我不太习惯在dictionaries中使用python,但使用.keys()似乎还有很长的路要走。代码loops通过每只动物获得动物的基因。然后对于表中到目前为止的每一行,如果该行的第一个值在基因中,那么只需在该行的末尾添加'x'以标记该动物具有该基因,同时删除该基因所以它最后没有创建自己的行。否则,如果该行的第一个元素不是动物的基因之一,那么只需附加一个空字符串来填充表格中的那个单元格。

最后,对于所有剩余的基因,如果它们尚未从表中删除,则在表格中创建一个新的row,其中包含以下细胞:该基因,之前已见过的动物数量( ['']*index)然后最后是' x'表明当前的动物确实有那个基因。

最后,最后一步是在开头插入一行,只是从dict获得动物名称。

以下是代码:

d = {'dog': {'tnfa', 'tlr1'}, 'cat': {'myd88', 'tnfa', 'map2k2'}}
table = []
cellWidth = 0
for index, animal in enumerate(d.keys()):
   cellWidth = max(cellWidth, len(animal))
   genes = d[animal]
   for row in table:
      if row[0] in genes:
         row.append('x')
         genes.remove(row[0])
      else:
         row.append('')
   for gene in genes:
      cellWidth = max(cellWidth, len(gene))
      table.append([gene] + ['']*index + ['x'])

table.insert(0, [''] + list(d.keys()))
[print(''.join([c.ljust(cellWidth + 1) for c in r])) for r in table]

结果是想要的:

        cat     dog
map2k2  x
tnfa    x       x
myd88   x
tlr1            x

更新

我添加了variablecellWidth,它将存储最长的动物或基因。为此,使用max()函数来最小化代码长度。在最后的print中,单元格打印的空格比max多一个,因此有一些空间。