python - 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()
下面是情节:
解决方案
我只是发现两个列表中的键和值的排列顺序与字典的顺序不同,因此条形图未排序。所以我决定使用不同的方法通过循环从字典中构造两个列表,现在 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()
推荐阅读
- python - 函数参数列表?
- php - 我想找到一种使用 Firebase 作为 Android、IOS 和 Web 应用程序后端的最佳方法
- python - 将 QColorDialog 添加到 QHBoxLayout
- apache-spark - Spark 结构化流式点燃连接失败
- javascript - 如何使用 React Native 创建一个 fadeIn 链动画
- android - 在 TensorFlow 中检测并获取位置
- java - 机器人按键无法在无头模式下工作
- react-native - 如何创建带断点的圆形滑块?
- python - 当我尝试导入 lxml.html 时出现导入错误
- python - 从 django ORM 检索查询