我正在寻找一种方法来以人类可读的格式绘制一些数据。我有来自模拟的数据,其中包含帧号、蛋白质残基数和蛋白质二级结构状态。帧数为整数,二级结构状态为字符串。例如:
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”列中给出的字符串绘制特定颜色。最好手动控制字符串的颜色(以避免相似的颜色)。
任何人都可以指导我使用允许我执行此操作的任何特定模块/子模块吗?
注意:这是针对大型数据集,文件可能达到 2000 帧,超过 1000 个残基,因此需要计算效率。我也不反对重新格式化数据,它应该使绘图更容易/可能/更快。
最佳答案
下面的例子怎么样:
- 您首先定义数据(或者您将从文件中读取这些数据)。
- 为单个值定义一个颜色映射(参见下面的
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
-ticks,...)但它应该可以帮助您开始
关于python - 使用离散变量的二维离散彩色图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37880399/