【问题标题】:2D discrete colour plot using discrete variables使用离散变量的二维离散彩色图
【发布时间】:2016-06-17 11:26:17
【问题描述】:

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

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 图。最好手动控制赋予字符串的颜色(以避免相似的颜色)。

谁能指导我到任何允许我这样做的特定模块/子模块?

注意:这是针对大量数据的,对于 1000 多个残基,文件可能达到 2000 帧,因此需要计算效率。我也不反对重新格式化数据,如果它使绘图更容易/可能/更快。

【问题讨论】:

标签: python matplotlib plot simulation contour


【解决方案1】:

下面的例子怎么样:

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

我的建议:

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,...)但它应该让你开始

【讨论】:

  • 这很好用,唯一要添加的是对于不是 NxN 数组的数据集,最好在 imshow 函数中添加 'aspect' 参数以使颜色图具有你个人会喜欢(我的测试数据集大约是 900x100,所以颜色图一开始看起来很不一样)。感谢您的帮助。
【解决方案2】:

这是使用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])

为了实现这个情节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多