我正在寻找一种以人类可读格式绘制一些数据的方法。我有来自模拟的数据,包含帧数,蛋白质残基数和蛋白质二级结构状态。帧号作为整数,次结构状态作为字符串。例如:
0 1 2 3 4 5 6 7 8 9 10
1 'H' 'H' 'H' '0' 'H' '0' 'H' 'H' 'H' 'B' 'H' 'H' 'S'
2 'H' 'H' 'H' 'H' 'H' 'S' 'H' '0' 'B' 'H' 'H' 'H' 'H'
第0列包含帧号,其余列对应于残留数字的状态(即第1帧的第6个残基的状态为'0',第2帧的状态为'S')。
我想根据“Struc”列中给出的字符串,根据残差编号生成帧编号的2D绘图,绘制特定颜色。手动控制字符串的颜色是可取的(避免类似的颜色)。
任何人都可以指引我使用任何特定的模块/子模块来实现这一目标吗?
注意:这适用于大量数据,文件可以达到2000帧,超过1000个残留,因此需要计算效率。我也不反对重新格式化数据,如果它使绘图更容易/可能/更快。
答案 0 :(得分:1)
以下示例如何:
colormap
和color documentation of matplotlib)我的建议:
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
def toImage(frames, colormap):
keys = list(colormap.keys())
colors = [colormap[key] for key in keys]
image = [[keys.index(val) for val in row[1:]] for row in frames]
return image, colors
frames = [[0, 'H', 'H', 'H', '0', 'H', '0', 'H', 'H', 'H', 'b', 'H', 'H', 'S'],
[1, 'H', 'H', 'H', 'H', 'H', 'S', 'H', '0', 'b', 'H', 'H', 'H', 'H']]
colormap = {'H': 'red',
'0': 'green',
'S': '#4eefff',
'b': 'b'}
image, colors = toImage(frames, colormap)
plt.imshow(image, cmap = ListedColormap(colors), interpolation = 'nearest')
plt.show()
当然,调整很多(例如我完全遗漏了帧数,适应y
- 适当的滴答声,......)但它应该让你开始
答案 1 :(得分:0)
以下是使用Seaborn heatmap的替代方法,可能更适合大型数据集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import seaborn as sns
# create dataset
residue_state_options = ['H', '0', 'S', 'b']
residue_state_arr = np.random.choice(residue_state_options,
(100, 100), p=[0.7, 0.1, 0.1, 0.1])
df = pd.DataFrame(residue_state_arr)
# map dataset to numbers
residue_state_map = {'H': 0, '0': 1, 'S': 2, 'b': 3}
df.replace(residue_state_map, inplace=True)
ax = sns.heatmap(df)
对于稍微复杂的情节,再加上颜色控制,您可以取出最后一行,而不是像
那样做colors = ['#edf8fb', '#b2e2e2', '#66c2a4', '#238b45']
grid_kws = {'height_ratios': (0.9, 0.05), 'hspace': 0.2}
fig, (ax, cbar_ax) = plt.subplots(2, gridspec_kw=grid_kws)
ax = sns.heatmap(df, ax=ax, cbar_ax=cbar_ax, cmap=ListedColormap(colors),
xticklabels=False, yticklabels=False,
cbar_kws={'orientation': 'horizontal'})
cbar_ax.set_xticklabels(residue_state_options)
cbar_ax.xaxis.set_ticks([0.125, 0.375, 0.625, 0.875])
实现这一情节。