2016-08-05 2 views
0

Я пытаюсь построить последовательность набора отсортированных по времени значений, в которых каждое значение представлено другим цветом. Например, если мои ценности подобныСтрока индекса последовательности python

state_seq = [2, 2, 2, 2, 0, 0, 0, 1, 3, 6, 3, 3, 3, 0, 0] 
time_seq = ['2013-05-29 09:31:00', '2013-05-29 09:46:00', '2013-07-23 12:28:00', '2013-07-23 01:53:00', '2013-08-05 02:02:00', '2013-08-05 02:08:00', '2013-08-05 04:28:00', '2013-08-06 10:20:00', '2013-08-06 03:03:00', '2013-08-06 04:13:00', '2013-08-06 04:17:00', '2013-08-06 04:36:00', '2013-08-07 11:07:00', '2013-08-07 12:28:00', '2013-08-07 12:31:00'] 

Я хочу, чтобы каждый уникальный элемент state_seq быть представлены с цветом и построить последовательность. В настоящее время, я использую Сиборн palplot, чтобы получить это сделано в тривиальной, как,

color_set = ["#95a5a6", "#34495e","#9b59b6", "#3498db", "#800000", "#2ecc71", 'y', '#FF4500'] 
palette = list() 
for s in state_seq: 
    palette.append(color_set[s])  

sns.palplot(palette) 

Который дает мне что-то вроде этого (этот вывод не может точно соответствовать фрагмент кода - я редактировал код лучше ясность) Sequence from seaborn pal plot

Этот подход имеет неудачу, что я не могу представить свои метки времени по оси x. Есть ли лучшая альтернатива python, возможно, подобная R-пакету TraMineR, описанному здесь Is it possible to make a graph with pattern fills using TraMineR and R base graphs?

+0

Почему бы не использовать * * BarChart из 'matplotlib' с одинаково высокими барами (без границ) и удалены оси у? – jbndlr

ответ

1

Я предполагаю, что вы хотите квадратные квадратики для каждого значения независимо от промежутка времени между каждым. Чтобы иметь ширину, указывающую временной промежуток, вы можете convert time_seq to datetime objects, а затем построить даты непосредственно с matplotlib.

import matplotlib.pyplot as plt 
import numpy as np 

state_seq = [2, 2, 2, 2, 0, 0, 0, 1, 3, 6, 3, 3, 3, 0, 0] 
time_seq = ['2013-05-29 09:31:00', '2013-05-29 09:46:00', '2013-07-23 12:28:00', '2013-07-23 01:53:00', '2013-08-05 02:02:00', '2013-08-05 02:08:00', '2013-08-05 04:28:00', '2013-08-06 10:20:00', '2013-08-06 03:03:00', '2013-08-06 04:13:00', '2013-08-06 04:17:00', '2013-08-06 04:36:00', '2013-08-07 11:07:00', '2013-08-07 12:28:00', '2013-08-07 12:31:00'] 
color_set = ["#95a5a6", "#34495e","#9b59b6", "#3498db", "#800000", "#2ecc71", 'y', '#FF4500'] 

for i in range(len(time_seq)): 
    # fill the yaxis with our colour for each time_seq entry for width 1 
    plt.fill_between((i,i+1), 1, color=color_set[state_seq[i]]) 

# keep the coloured boxes square 
plt.axis("scaled") 

plt.xlim(0, len(time_seq)) 
plt.axes().get_yaxis().set_visible(False) 

# add custom tick labels based on time_seq and set to middle of boxes 
plt.xticks(np.arange(0.5,len(time_seq)+0.5, 1), time_seq, rotation='vertical') 
# remove xaxis ticks 
plt.axes().get_xaxis().set_ticks_position("none") 

plt.savefig("boxes.png", bbox_inches="tight") 

Выдает: enter image description here

Смежные вопросы