如何在matplotlib中复制gnuplot的伪3D图,以用于蛋白质随时间的二级结构分配?

时间:2018-07-24 08:42:44

标签: python matplotlib gnuplot

我正在尝试使用matplotlib复制在gnuplot中创建的图。 gnuplot(以下)使用的绘图类型称为伪3D绘图。

Secondary structure assignment of protein over time

这显示的是肽/蛋白质每个残基随时间的二级结构分配。因此,在每个时间步骤(列)中,您都会看到单个肽的二级结构分配。对于每个残基(行),您将看到该残基的二级结构分配随时间变化。

我想使这种类型的绘图适应matplotlib。 matplotlib中哪种合适的绘图类型可以做到这一点?

我能想到的最基本的解决方案是简单地使用补丁在正确的坐标处绘制矩形,但是我希望使用现有的matplotlib绘图类型,该类型对定制更灵活,更可靠。

数据的结构如下:

data = [[x1, y1, z11], [x1, y2, z12], [x1, y3, z13], ..., [xn, ym, znm]]

其中n是时间步长总数,m是残基总数。 Z值是在xy坐标处用于二级结构分配的分类数据。

一些实际数据可用于测试在三个时间步骤中存在三个残基的肽段:

data = [[1, 1, 0], [1, 2, 0], [1, 3, 0], [2, 1, 6], [2, 2, 6], [2, 3, 6], [3, 1, 6], [3, 2, 0], [3, 3, 0]]

1 个答案:

答案 0 :(得分:1)

我从这个answer和这个gist的灵感中获得了下图:

pcolor with categorical data

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

from matplotlib import colors

data = [[1, 1, 0], [1, 2, 2], [1, 3, 0], [2, 1, 6], [2, 2, 6], [2, 3, 6], [3, 1, 6], [3, 2, 0], [3, 3, 0]]


# format the data into an array, zero as default
x_max = max( u[0] for u in data ) + 1
y_max = max( u[1] for u in data ) + 1
z_max = max( u[2] for u in data ) + 1

z = np.zeros((x_max, y_max))
for u in data:
    z[u[0], u[1]] = u[2]

# Define the x and y range:
x = range(x_max + 1)
y = range(y_max + 1)

# Colormap with discrete values and corresponding labels:
labels = ['random', 'helix', 'coil', 'pi', 'beta', 'turn', 'bridge']
cmap = colors.ListedColormap(['white', 'blue', 'green', 'magenta', 'orange', 'red', 'yellow'])
bounds = range(cmap.N+1)
norm = colors.BoundaryNorm(bounds, cmap.N)

plt.pcolor(x, y, z, cmap=cmap, norm=norm)

formatlabels = plt.FixedFormatter( labels )
plt.colorbar(cmap=cmap, norm=norm, boundaries=bounds, ticks=bounds,
             format=formatlabels, drawedges=True);