Как сопоставить набор цветов с последовательностью строк и построить ее в Python? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть список строк (например, фактическая строка составляет 5000 символов):

sequence='NGHHENIMHNYRBIFIFEMRHHCFFFJUUSVUUUUNXMTUSRHXOMEJNGKVUUUUVUUUVTUUVUWWSVULVUUUUUUUUUUUUWXQJUQRTXQRHM'

последовательность содержит алфавиты 'A' до 'Y'. Я хочу сопоставить цвета с каждым алфавитом и построить график, как показано на рисунке ниже.

ожидаемый результат (это пример вывода):

enter image description here

Я пробовал следующее:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap
import seaborn as sns
import pandas as pd


colors=sns.color_palette("coolwarm", 25)
string=[]
for char in sequence:
   string.append(char)


df=pd.DataFrame({'col':string}, index=range(len(string)))
letter2num = dict(zip(list("ABCDEFGHIJKLMNOPQRSTUVWXY"), np.arange(25)))
df2 = pd.DataFrame(np.array( [letter2num[i] for i in df.values.flat] ).reshape(df.shape))
cmap = ListedColormap(colors)
fig, ax = plt.subplots(figsize=(20,19))
ax.imshow(df2.values, vmin=0, vmax=len(cmap.colors), cmap=cmap) 

Однако это дает вертикалку и тонкую прямую линию. Может кто-нибудь поставить в правильном направлении?

мой вывод:

enter image description here

1 Ответ

0 голосов
/ 24 мая 2019

Я нашел решение, используя pcolormesh

import matplotlib
from matplotlib.colors import ListedColormap
import seaborn as sns
import numpy as np
import pandas as pd

sns.set_style('white')
colors=sns.color_palette("coolwarm", 25)

df=pd.DataFrame({'col':sequence}, index=range(len(sequence)))
letter2num = dict(zip(list("ABCDEFGHIJKLMNOPQRSTUVWXY"), np.arange(25)))
df2 = pd.DataFrame(np.array( [letter2num[i] for i in df.values.flat] ).reshape(df.shape))
cmap = ListedColormap(colors)
fig, ax = plt.subplots(figsize=(3,10))
plt.pcolormesh(df2.values, vmin=0, vmax=len(cmap.colors), cmap=cmap)
plt.xticks([])
cbar=plt.colorbar( fraction=0.46,ticks=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24],pad=0.3)
cbar.ax.set_yticklabels(['A', 'B', 'C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y'],size=15,verticalalignment='bottom',horizontalalignment='left' )
cbar.ax.tick_params(size=0, pad=5.4)
yticks=['0','50','100','150','200']
plt.yticks([0,1250,2500,3750,5000],yticks,size=15)
plt.ylabel('Time(ns)',Size=20)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...