2016-05-09 22 views
1

Ich muss streuen ein Wörterbuch des Wörterbuchs streuen.Scatter Plot Wörterbuch des Wörterbuchs

Meine Daten sieht wie folgt aus:

{'+C': {1: 191, 2: 557}, '+B': None, '-B': None, '+D': None, '+N': {1: 1, 3: 1}, '+L': {1: 2819, 2: 1506}, '>L': None, '<C': {0: 2125}, '<B': None, '<L': {0: 2949, 1: 2062}} 

Die äußeren Tasten sind x-Achsenbeschriftungen und innerhalb Tasten sind y-Achse. Die Werte der inneren Schlüssel sind Anmerkungen für x, y. Ich habe versucht, die Daten zu zeichnen, aber ich habe den Graph, den ich gesucht habe, nicht bekommen.

Ich versuchte Folgendes, aber endete mit Wiederholungen in meiner X-Achse.

Antwort

0

Sie müssen ganzzahlige Kategorien für x einrichten, denen Sie dann Beschriftungen auf der x-Achse zuweisen können. Der folgende Code verwendet dafür die Aktionscodes in Ihrem Dict. Beachten Sie, dass Wörterbücher in Python ungeordnet sind, sodass die Schlüssel sortiert werden müssen. Sie können stattdessen ein geordnetes Diktat verwenden und dann dict.keys() direkt verwenden.

Die Anmerkungen für jeden Punkt sind Zeichenfolgen, die nacheinander mit Textanmerkungen auf der Zeichnung platziert werden. Wir müssen die x, y-Achsenbereiche im Plot explizit mit plt.axis() festlegen, da Annotationen nicht enthalten sind, wenn die Bereiche automatisch berechnet werden.

import matplotlib.pyplot as plt 

action_sequence = { 
    '+C': {1: 191, 2: 557}, '+B': None, '-B': None, '+D': None, 
    '+N': {1: 1, 3: 1}, '+L': {1: 2819, 2: 1506}, 
    '>L': None, '<C': {0: 2125}, '<B': None, '<L': {0: 2949, 1: 2062} 
} 

# x data are categorical; define a lookup table mapping category string to int 
x_labels = list(sorted(action_sequence.keys())) 
x_values = list(range(len(x_labels))) 
lookup_table = dict((v,k) for k,v in enumerate(x_labels)) 

# Build a list of points (x, y, annotation) defining the scatter plot. 
points = [(lookup_table[action], key, anno) 
     for action, values in action_sequence.items() 
     for key, anno in (values if values else {}).items()] 
x, y, anno = zip(*points) 

# y is also categorical, with integer labels for the categories 
y_values = list(range(min(y), max(y)+1)) 
y_labels = [str(v) for v in y_values] 

plt.figure(figsize=(10,8)) 
plt.title('Scatter Plot', fontsize=20) 
plt.xlabel('x', fontsize=15) 
plt.ylabel('y', fontsize=15) 
plt.xticks(x_values, x_labels) 
plt.yticks(y_values, y_labels) 
plt.axis([min(x_values)-0.5, max(x_values)+0.5, 
      min(y_values)-0.5, max(y_values)+0.5]) 
#plt.scatter(x, y, marker = 'o') 
for x_k, y_k, anno_k in points: 
    plt.text(x_k, y_k, str(anno_k)) 

plt.show() 

Siehe die folgende Frage für einen anderen Weg, um die Streudiagramm zur Etikettierung:

Matplotlib: How to put individual tags for a scatter plot

Verwandte Themen