2016-08-05 28 views
0

Ich versuche, die Reihenfolge einer Reihe von zeitlich sortierten Werten zu plotten, in denen jeder Wert durch eine andere Farbe dargestellt wird. Zum Beispiel, wenn meine Werte sind wieSequence index plot 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'] 

Ich möchte jedes einzigartiges Element von state_seq zu mit einer Farbe und zeichnen Sie die Sequenz dargestellt werden. Ab jetzt bin ich mit Seaborn palplot dies in triviale Weise zu erledigen wie

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) 

Was mich so etwas wie dieses gibt (diese Ausgabe mit dem Code-Snippet nicht genau kann übereinstimmen - ich den Code bearbeitet für eine bessere Klarheit) Sequence from seaborn pal plot

Dieser Ansatz hat einen Rückschlag, den ich meine Zeitbeschriftungen in X-Achse nicht darstellen kann. Gibt es eine bessere Python-Alternative, die vielleicht dem hier erläuterten R-Paket TraMineR ähnelt? Is it possible to make a graph with pattern fills using TraMineR and R base graphs?

+0

warum nicht die * barchart verwenden * von 'matplotlib' mit gleich hohen Stangen (W/O-Grenzen) und entfernt y-Achse? – jbndlr

Antwort

1

Ich nehme an, Sie wollen für jeden Wert quadratische Boxen, unabhängig von der Zeitlücke zwischen ihnen. Um eine Breite zu haben, die die Zeitlücke anzeigt, könnten Sie convert time_seq to datetime objects und dann die Daten direkt mit Matplotlib plotten.

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") 

Erzeugt: enter image description here