使用离散变量的2D离散颜色图

时间:2016-06-17 11:26:17

标签: python matplotlib plot simulation contour

我正在寻找一种以人类可读格式绘制一些数据的方法。我有来自模拟的数据,包含帧数,蛋白质残基数和蛋白质二级结构状态。帧号作为整数,次结构状态作为字符串。例如:

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个残留,因此需要计算效率。我也不反对重新格式化数据,如果它使绘图更容易/可能/更快。

2 个答案:

答案 0 :(得分:1)

以下示例如何:

  1. 您首先定义数据(或者您将从文件中读取这些数据)。
  2. 为单个值定义颜色映射(请参阅下面的colormapcolor documentation of matplotlib
  3. 函数会将这些字母/值映射到数字,将其视为索引。相同的索引将用于访问颜色
  4. 使用最近邻插值和提供的颜色绘制图像
  5. 我的建议:

    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])

实现这一情节。

enter image description here