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