当键不一致时,如何在不使用Pandas的情况下从嵌套字典绘制条形图?

2024-09-30 16:35:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个嵌套字典:

{'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}}

内部键0-250250-500500-750等并非对所有外部键都是统一的。我需要在不使用pandas的情况下绘制条形图,因为我们需要作为支持包的一部分进行收集,并且不能在客户机器中安装pandas。请提供一种方法

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()

这里是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]]}

它在列表[]中显示值,而不是在字典{}中显示值。 我希望内部键和值作为dict而不是list


Tags: inpandasfor字典itemskeysdictlist
1条回答
网友
1楼 · 发布于 2024-09-30 16:35:19

您可以在外部字典中循环,然后在内部字典中循环,以绘制堆叠条形图:

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:对于水平条,您可以将对ax.bar的调用更改为:

ax.barh(y=outerkey, width=value, left=bottom, color=colors[inner_keys.index(innerkey)])

相关问题 更多 >