Цветные точки можно нарисовать с помощью plt.scatter()
. Сегменты прямых линий с plt.plot()
.
Для представления сгиба массив из 0
s, 1
s и -1
s может представлять сгибание по прямой, с поворотом вправо или с поворотом влево.
Чтобы нарисовать график, создайте позиции x
и y
, применяя направления сгиба. Эти позиции служат для рисования отрезков линии (plt.plot
), а также цветных точек (plt.scatter
). Чтобы иметь 20 разных цветов, можно использовать 'tab20' colormap .
Вот пример кода для начала.
import numpy as np
from matplotlib import pyplot as plt
n = 20
protein = np.random.randint(1, 20, n) # n numbers between 1 and 19
folds = np.zeros(n, dtype=np.int) # default there are no turns
folds[9] = -1 # turn left after protein 9
folds[11] = 1 # turn right after protein 11
folds[15] = -1 # turn left after protein 15
dir = (1, 0)
pos = (0, 0)
x = np.zeros_like(protein)
y = np.zeros_like(protein)
for i, (p, f) in enumerate(zip(protein, folds)):
x[i], y[i] = pos
if f == 1: # turn right
dir = (dir[1], -dir[0])
elif f == -1: # turn left
dir = (-dir[1], dir[0])
pos = (pos[0] + dir[0], pos[1] + dir[1])
plt.plot(x, y, 'k-', zorder=0) # straight lines
# large dots colored via the 'tab20' colormap, set zorder=3 to draw the dots on top of the lines
plt.scatter(x, y, c=protein, cmap='tab20', s=200, zorder=3)
plt.axis('off') # don't show the axes
plt.margins(0.1) # enough margin so that the large scatter dots don't touch the borders
plt.gca().set_aspect('equal') # equal distances in x and y direction
plt.show()
Чтобы нарисовать что-то похожее на пример 'd':
n = 15
protein = np.random.randint(1, 20, n)
folds = [1, -1, 1, -1, 0, 0, 0, 1, -1, 0, 0, 1, -1, -1, 0]
PS: Со следующим адаптации, показаны линии сетки:
from matplotlib.ticker import MultipleLocator, NullFormatter
plt.axis('on')
ax = plt.gca()
ax.xaxis.set_major_locator(MultipleLocator(1))
ax.xaxis.set_major_formatter(NullFormatter())
ax.yaxis.set_major_locator(MultipleLocator(1))
ax.yaxis.set_major_formatter(NullFormatter())
ax.tick_params(axis='both', length=0)
plt.grid(True, ls=':')