Cela donne le choix exact parcelle:
import matplotlib.pyplot as plt
from collections import OrderedDict
T_OLD = {'10' : 'need1', '11':'need2', '12':'need1', '13':'need2','14':'need1'}
T_SRT = OrderedDict(sorted(T_OLD.items(), key=lambda t: t[0]))
plt.plot(map(int, T_SRT.keys()), map(lambda x: int(x[-1]), T_SRT.values()),'r')
plt.ylim([0.9,2.1])
ax = plt.gca()
ax.set_yticks([1,2])
ax.set_yticklabels(['need1', 'need2'])
plt.title('T_OLD')
plt.xlabel('time')
plt.ylabel('need')
plt.show()
Pour Python 3.X les lignes complotant doit convertir explicitement la sortie map()
aux listes:
plt.plot(list(map(int, T_SRT.keys())), list(map(lambda x: int(x[-1]), T_SRT.values())),'r')
comme en Python 3 .X map()
renvoie un itérateur par opposition à une liste dans Python 2.7.
L'intrigue utilise les clés du dictionnaire converties en ints et les derniers éléments de need1
ou need2
, également convertis en ints. Cela repose sur la structure particulière de vos données, si les valeurs où need1
et need3
il aurait besoin d'un couple plus d'opérations.
Après le traçage et la modification des limites d'axes, le programme modifie simplement les étiquettes de graduation aux positions y 1 et 2. Il a ensuite ajoute aussi le titre et les x et les étiquettes d'axe y.
La partie importante est que le dictionnaire/données d'entrée doit être trié. Une façon de le faire est d'utiliser OrderedDict
. Ici T_SRT
est un OrderedDict
objet trié par clés dans T_OLD
.
La sortie est la suivante:
Ceci est un cas plus général pour plusieurs valeurs/étiquettes dans T_OLD
. Il suppose que l'étiquette est toujours 'needX'
où X
est un nombre quelconque. Cela peut facilement être fait pour un cas général d'une chaîne qui précède le nombre mais il faudrait plus de traitement,
import matplotlib.pyplot as plt
from collections import OrderedDict
import re
T_OLD = {'10' : 'need1', '11':'need8', '12':'need11', '13':'need1','14':'need3'}
T_SRT = OrderedDict(sorted(T_OLD.items(), key=lambda t: t[0]))
x_val = list(map(int, T_SRT.keys()))
y_val = list(map(lambda x: int(re.findall(r'\d+', x)[-1]), T_SRT.values()))
plt.plot(x_val, y_val,'r')
plt.ylim([0.9*min(y_val),1.1*max(y_val)])
ax = plt.gca()
y_axis = list(set(y_val))
ax.set_yticks(y_axis)
ax.set_yticklabels(['need' + str(i) for i in y_axis])
plt.title('T_OLD')
plt.xlabel('time')
plt.ylabel('need')
plt.show()
Cette solution trouve le numéro à la fin de l'étiquette avec re.findall
pour accueillir la possibilité de multi numéros de chiffres. La solution précédente a juste pris le dernier composant de la chaîne parce que les nombres étaient à un seul chiffre. Il suppose toujours que le numéro de la position de tracé est le dernier numéro de la chaîne, d'où le [-1]
. Encore une fois pour la sortie de la carte Python 3.X est explicitement converti en liste, pas nécessaire dans Python 2.7.
Les étiquettes sont maintenant générées en sélectionnant d'abord des valeurs y uniques en utilisant set
, puis en renommant leurs étiquettes par concaténation des chaînes 'need'
avec son entier correspondant.
Les limites de l'axe des ordonnées sont fixées à 0,9 de la valeur minimale et à 1,1 de la valeur maximale. Le reste du format est comme avant.
Le résultat de ce cas de test est:
Je veux vous demander une chose. Comment écrire du code pour un dictionnaire de n'importe quelle longueur. Si le dictionnaire est de longueur arbitraire et nous ne voulons pas spécifier explicitement les valeurs (data_labels = ['need1', 'need2']). –
Bien sûr, voir ma réponse mise à jour. –