首页 > 解决方案 > Matplotlib 对条形图进行错误排序

问题描述

我正在尝试在 Python 3.6 中使用 Matplotlib 获取条形图,虽然我得到了图表,但它没有按升序排序。

该代码将能够从 csv 文件列创建一个列表,计算此列表中的出现次数并返回字典(出现次数类型:出现次数)并将其打印在条形图中。我不明白为什么没有对条进行排序,我看到的关于此类问题的示例与我的情况不同。

文件不在这里,但 print(Dic) 的结果是有序的: Counter({'Walk': 191, 'Sitt': 87, 'CarChild': 28, 'SittCell': 26, 'WalkCell': 23, ' SittTalk':21,'Play':17,'Shoot':16,'PhyExer':12,'Jogging':9,'PlayFeedF':7,'ShootSelf':6,'Stand':4,'PushPram' : 3, 'OnPram': 3, 'ShootCam': 2, 'Portrait': 2, 'Pose': 2, 'PlayFeedB': 2, 'PlayScoot': 2, 'ACTION': 1, 'Sing': 1 , 'SittLap': 1, 'SittMag': 1, 'SittBook': 1, 'WalkChild': 1, 'WalkPar': 1, 'PlayInst': 1, 'PlayFeed': 1, 'WalkScoot': 1, ' PlayInstCell': 1})

下面是代码:

import matplotlib.pyplot as plt
import csv
import numpy as np
from collections import Counter


# this block will create a list from a csv column
lista = []

with open('xujiahui.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for lines in csv_reader:
    lista.append(lines[1])

#print(lista)

# this block will count each item and return a key: value pair dic:
Dic = Counter(lista)
print(Dic)


# this block plots bar chart
uses = list(Dic.keys())
use_num = list(Dic.values())

plt.xlabel('Occurrences')
plt.title('User types and occurrences')

plt.barh(range(len(use_num)), use_num, color='black', tick_label=uses)

plt.show()

下面是情节:

在此处输入图像描述

标签: pythonmatplotlib

解决方案


我只是发现两个列表中的键和值的排列顺序与字典的顺序不同,因此条形图未排序。所以我决定使用不同的方法通过循环从字典中构造两个列表,现在 matplotlib 可以正确绘制。这是代码和最终图:

import matplotlib.pyplot as plt; plt.rcdefaults()
import matplotlib.pyplot as plt
import csv
import collections
import numpy as np
from collections import Counter


# # this block will create a list from a csv column
lista = []
#Count = {}

with open('xujiahui.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for lines in csv_reader:
        lista.append(lines[1])
#print(lista)

# this block will count each item and return a key: value pair dic:
Dic = Counter(lista)
print(Dic)

mydict = {'walk': 191, 'sitt': 87, 'carchild': 28, 'sittcell': 26, 'walkcell': 23, 'sitttalk': 21, 'play': 17, 'shoot': 16, 'phyexer': 12, 'jogging': 9, 'playfeedf': 7, 'shootself': 6, 'stand': 4, 'pushpram': 3, 'onpram': 3, 'shootcam': 2, 'portrait': 2, 'pose': 2, 'playfeedb': 2, 'playscoot': 2, 'sing': 1, 'sittlap': 1, 'sittmag': 1, 'sittbook': 1, 'walkchild': 1, 'walkpar': 1, 'playinst': 1, 'playfeed': 1, 'walkscoot': 1, 'playinstcell': 1}

# this block generate lists from mydict
use = []
use_num = []
print ('Sort by keys:')
for key in mydict.keys():
    use.append(key)
print(use)

print ('Sort by items:')
for value in mydict.values():
    use_num.append(value)
print(use_num)

# this block will plot
plt.xlabel('Occurences')
plt.title('User types and occurrences')

plt.barh(range(len(use_num)), use_num, color='black', tick_label=use)

plt.show()

在此处输入图像描述


推荐阅读