我试图绘制病毒生物序列组合分离年份差异和核苷酸差异的频率。我试图找到一个优雅的方法来做它有麻烦。
所以我有一个对齐,我将每个序列相互比较,得到一个整数值,它们是多么不同。我还要检查他们的隔离年数有多么不同。因此,对于一组相隔两年隔离并具有三个差异的序列,您将获得坐标(2,3)。我想计算发生了多少次(2,3)以及所有其他组合并绘制它(并得到绘图数据)。我一直试图将频率列表转换为数据帧无效,我想知道是否有更好的方法来做到这一点。
我可以展示一些代码,但我不确定这是最好的方式,所以我想听听其他想法。
一个问题是如何在开始时表示频率。我可以创建所有事件的列表或创建事件的字典并增加计数器。
示例数据: (年差,序列残基差异): (1,2),(2,5),(1,2),(5,5),(4,5)
答案 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
组合在另一个元组中。通过查找每个中的最大值,我们知道数组的大小。注意,这必须从x
和y
增加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()
输出: