web-dev-qa-db-fra.com

Tracer un python dict dans l'ordre des valeurs de clé

J'ai un python qui ressemble à ceci:

In[1]: dict_concentration
Out[2] : {0: 0.19849878712984576,
5000: 0.093917341754771386,
10000: 0.075060643507712022,
20000: 0.06673074282575861,
30000: 0.057119318961966224,
50000: 0.046134834546203485,
100000: 0.032495766396631424,
200000: 0.018536317451599615,
500000: 0.0059499290585381479}

Les clés sont de type int, les valeurs sont de type float64. Malheureusement, lorsque j'essaye de tracer cela avec des lignes, matplotlib connecte les mauvais points (tracé joint). Comment puis-je le faire connecter les lignes dans l'ordre des valeurs clés? enter image description here

27
DJname

Les dictionnaires Python ne sont pas ordonnés. Si vous voulez un dictionnaire commandé, utilisez collections.OrderedDict

Dans votre cas, trier le dict par clé avant de tracer,

import matplotlib.pylab as plt

lists = sorted(d.items()) # sorted by key, return a list of tuples

x, y = Zip(*lists) # unpack a list of pairs into two tuples

plt.plot(x, y)
plt.show()

Voici le résultat. enter image description here

60
SparkAndShine

Passez simplement les éléments triés du dictionnaire à la fonction plot(). concentration.items() renvoie une liste de tuples où chaque tuple contient une clé du dictionnaire et la valeur correspondante.

Vous pouvez profiter de la décompression de la liste (avec *) Pour transmettre les données triées directement à Zip, puis à nouveau pour les transmettre à plot():

import matplotlib.pyplot as plt

concentration = {
    0: 0.19849878712984576,
    5000: 0.093917341754771386,
    10000: 0.075060643507712022,
    20000: 0.06673074282575861,
    30000: 0.057119318961966224,
    50000: 0.046134834546203485,
    100000: 0.032495766396631424,
    200000: 0.018536317451599615,
    500000: 0.0059499290585381479}

plt.plot(*Zip(*sorted(concentration.items())))
plt.show()

sorted() trie les tuples dans l'ordre des éléments du Tuple, vous n'avez donc pas besoin de spécifier une fonction key car les tuples renvoyés par dict.item() commencent déjà par la valeur de clé. .

3
mhawke