J'ai un dictionnaire imbriqué comme celui-ci:

{'uvvm': {'0-250ms': 96, '500-750ms': 2}, 'usvv': {'0-250ms': 1},
 'unsharedChunksVirtualVolume': {'0-250ms': 21}, 'ubvv': {'0-250ms': 60, '250-500ms': 2, '500-750ms': 3},
 'unbvvh': {'0-250ms': 1}, 'ssvv': {'0-250ms': 101, '250-500ms': 1},
 'sscc': {'0-250ms': 2}, 'sc': {'500-750ms': 2},
 'qvv': {'0-250ms': 200, '500-750ms': 5}, 'qas': {'0-250ms': 4}}

Les clés internes 0-250, 250-500, 500-750 etc., ne sont pas uniformes pour toutes les clés externes. Je dois tracer un graphique à barres sans utiliser de pandas , car nous devons le collecter dans le cadre de l'offre d'assistance et je ne peux pas installer pandas sur les ordinateurs des clients. Veuillez fournir un moyen.

op = dict(list(dictLatency.items())[i:i+10])
print(op)
inner_keys = ['0-250ms', '250-500ms', '500-750ms', '750-1000ms', '1000-1250ms',
              '1250-1500ms', '1500-1750ms', '1750-2000ms', '2000-2250ms']
newDict = a:[[i, b.get(i, 0)] for i in inner_keys] for a, b in op.items()
print(newDict)

labels = op.keys()

Voici newDict

{'updateVirtualVolumeMetaData': [['0-250ms', 96], ['250-500ms', 0], ['500-750ms', 2], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'updateStorageProfileForVirtualVolume': [['0-250ms', 1], ['250-500ms', 0], ['500-750ms', 0], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'unsharedChunksVirtualVolume': [['0-250ms', 21], ['250-500ms', 0], ['500-750ms', 0], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'unbindVirtualVolume': [['0-250ms', 60], ['250-500ms', 2], ['500-750ms', 3], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'unbindAllVirtualVolumesFromHost': [['0-250ms', 1], ['250-500ms', 0], ['500-750ms', 0], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'spaceStatsForVirtualVolume': [['0-250ms', 101], ['250-500ms', 1], ['500-750ms', 0], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'setStorageContainerContext': [['0-250ms', 2], ['250-500ms', 0], ['500-750ms', 0], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'setContext': [['0-250ms', 0], ['250-500ms', 0], ['500-750ms', 2], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'queryVirtualVolume': [['0-250ms', 200], ['250-500ms', 0], ['500-750ms', 5], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]], 'queryArrays': [['0-250ms', 4], ['250-500ms', 0], ['500-750ms', 0], ['750-1000ms', 0], ['1000-1250ms', 0], ['1250-1500ms', 0], ['1500-1750ms', 0], ['1750-2000ms', 0], ['2000-2250ms', 0]]}

Il affiche les valeurs dans la liste [] et non sous forme de dictionnaire {}. Je voudrais la clé intérieure et les valeurs comme dict pas comme liste.

0
vidhya gopalan 1 mars 2021 à 11:24

1 réponse

Meilleure réponse

Vous pouvez parcourir le dictionnaire externe, puis le dictionnaire interne pour dessiner un graphique à barres empilées:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np

dictLatency = {'uvvm': {'0-250ms': 96, '500-750ms': 2}, 'usvv': {'0-250ms': 1},
               'unsharedChunksVirtualVolume': {'0-250ms': 21}, 'ubvv': {'0-250ms': 60, '250-500ms': 2, '500-750ms': 3},
               'unbvvh': {'0-250ms': 1}, 'ssvv': {'0-250ms': 101, '250-500ms': 1},
               'sscc': {'0-250ms': 2}, 'sc': {'500-750ms': 2},
               'qvv': {'0-250ms': 200, '500-750ms': 5}, 'qas': {'0-250ms': 4}}
inner_keys = ['0-250ms', '250-500ms', '500-750ms', '750-1000ms', '1000-1250ms',
              '1250-1500ms', '1500-1750ms', '1750-2000ms', '2000-2250ms']
# colors = plt.cm.Set3.colors
colors = plt.cm.hsv(np.linspace(0, 0.8, len(inner_keys)))

fig, ax = plt.subplots(figsize=(15, 4))
for outerkey, innerdict in dictLatency.items():
    bottom = 0
    if outerkey == 'unsharedChunksVirtualVolume':
        outerkey = 'unshared\nChunks\nVirtual\nVolume'
    for innerkey, value in innerdict.items():
        ax.bar([outerkey], [value], bottom=bottom, color=colors[inner_keys.index(innerkey)])
        bottom += value
ax.tick_params(axis='x', rotation=90)
legend_handles = [Rectangle((0, 0), 0, 0, color=color, label=label) for color, label in zip(colors, inner_keys)]
ax.legend(handles=legend_handles)
plt.tight_layout()
plt.show()

resulting plot

PS: pour les barres horizontales, vous pouvez changer l'appel en ax.bar en:

ax.barh(y=outerkey, width=value, left=bottom, color=colors[inner_keys.index(innerkey)])
0
JohanC 8 mars 2021 à 14:12