计算x,y坐标的频率,以2D和绘图显示

时间:2016-01-09 20:59:11

标签: python pandas plot

我试图绘制病毒生物序列组合分离年份差异和核苷酸差异的频率。我试图找到一个优雅的方法来做它有麻烦。

所以我有一个对齐,我将每个序列相互比较,得到一个整数值,它们是多么不同。我还要检查他们的隔离年数有多么不同。因此,对于一组相隔两年隔离并具有三个差异的序列,您将获得坐标(2,3)。我想计算发生了多少次(2,3)以及所有其他组合并绘制它(并得到绘图数据)。我一直试图将频率列表转换为数据帧无效,我想知道是否有更好的方法来做到这一点。

我可以展示一些代码,但我不确定这是最好的方式,所以我想听听其他想法。

一个问题是如何在开始时表示频率。我可以创建所有事件的列表或创建事件的字典并增加计数器。

示例数据: (年差,序列残基差异): (1,2),(2,5),(1,2),(5,5),(4,5)

输出显示在图片中,但它不必是表格结构。 CSV是首选。 output

2 个答案:

答案 0 :(得分:1)

假设您的(年份,差异)元组位于名为 samples 的列表中,如下例所示

import random
samples = [(random.randint(0,10), random.randint(0,10)) for i in range(100) ]

您可以按照此其他stackoverflow帖子How to count the frequency of the elements in a list?

中的说明获取每对的频率
import collections
counter=collections.Counter(samples)

要显示此频率表,您可以将其转换为numpy矩阵并使用matplotlib中的 matshow

import numpy as np
import matplotlib.pyplot as plt

x_max = max([x[0] for x in samples])
y_max = max([x[1] for x in samples])
freq = np.zeros((x_max+1, y_max+1))
for coord, f in counter.iteritems():
    freq[coord[0]][coord[1]] = f
plt.matshow(freq, cmap=plt.cm.gray)
plt.show()

答案 1 :(得分:1)

我正在大量借用this post的表格结构。

这里的不同之处在于构造数组数据。通过用零初始化数组,对于每个坐标(i,j),将该数组元素递增1,以表示递增的频率。

zip(*coords)会将所有i组合在一个元组中,将所有j组合在另一个元组中。通过查找每个中的最大值,我们知道数组的大小。注意,这必须从xy增加1以占0,即从0到x是x + 1行。

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.table import Table

def table_plot(data):
    fig, ax = plt.subplots()
    ax.set_axis_off()

    tb = Table(ax, bbox=[0,0,1,1])

    nrows, ncols = data.shape
    width, height = 1.0 / ncols, 1.0 / nrows

    for (i, j), val in np.ndenumerate(data):
        tb.add_cell(i, j, width, height, text=str(val) if val else '', loc='center')

    for i in range(data.shape[0]):
        tb.add_cell(i, -1, width, height, text=str(i), loc='right',
                    edgecolor='none', facecolor='none')
    for i in range(data.shape[1]):
        tb.add_cell(-1, i, width, height/2, text=str(i), loc='center',
                    edgecolor='none', facecolor='none')

    tb.set_fontsize(16)
    ax.add_table(tb)
    return fig

coords = ((1,2), (2,5), (1,2), (5, 5), (4, 5))

# get maximum value for both x and y to allocate the array
x, y = map(max, zip(*coords))
data = np.zeros((x+1, y+1), dtype=int)

for i, j in coords:
    data[i,j] += 1

table_plot(data)
plt.show()

输出:

enter image description here