失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python用表格中的数据画柱状图_[python]统计excel表格某列中每项出现的次数并画柱状图...

python用表格中的数据画柱状图_[python]统计excel表格某列中每项出现的次数并画柱状图...

时间:2023-07-23 12:00:28

相关推荐

python用表格中的数据画柱状图_[python]统计excel表格某列中每项出现的次数并画柱状图...

一.需求:

需要统计该列中每个院系的总数并画成柱状图

有三个这样的表格,需要统计这三个表格所有的每个院系的数量

二.步骤:

1.读xls文件

xls_file17 = xl.open_workbook("文件路径.xls")

2.获取该数据列

xls_sheet1 = []#定义一个列表

xls_sheet1.append(xls_file17.sheets()[0].col_values(1)) # 取第一个表格,取院系那一列

3.删掉无用数据

删掉前面没有有用数据的几行(空行和"学院"行),第一个单元格删三次相当于删掉了前三行

for i in range(3):

del xls_sheet1[0][0] # 删掉前3行

三个表格一起做,代码为:

#

xls_file17 = xl.open_workbook("I:/hxy/名单.xls")

xls_sheet1 = []

table_names17 = xls_file17.sheet_names()

xls_sheet1.append(xls_file17.sheets()[0].col_values(1)) # 取院系那一列

for i in range(3):

del xls_sheet1[0][0] # 删掉前3行

#

xls_file18 = xl.open_workbook("I:/hxy/名单.xls")

xls_sheet2 = []

xls_sheet2.append(xls_file18.sheets()[0].col_values(1)) # 取院系那一列

# print(xls_sheet2)

for i in range(3):

del xls_sheet2[0][0] # 删掉前3行

#

xls_file19 = xl.open_workbook("I:/hxy/名单.xls")

xls_sheet3 = []

xls_sheet3.append(xls_file19.sheets()[0].col_values(1)) # 取院系那一列

for i in range(3):

del xls_sheet3[0][0] # 删掉前3行

4.拼接三个表格

xls_sheet1.extend(xls_sheet2)

xls_sheet1.extend(xls_sheet3)

5.统计

arr = np.array(xls_sheet1) # 转换成array

key = np.unique(xls_sheet1) # x轴,得到的也是array对象

result = {}

for k in key:

mask = (arr == k)

arr_new = arr[mask]

v = arr_new.size

result[k] = v

#result是类似于这样的字典:{外语学院:15,文学院:23.....}

x = list(result.key()) # 取院系的那一列

y = list(result.values()) # 取数字的那一列

5.画图

plt.bar(x, y, align='center') # 画图,设置x,y轴的数据

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

for x, y in zip(x, y):

plt.text(x, y+0.05, '%.0f'%y, ha='center', va='bottom')

plt.xticks(rotation =90)# rotation设置x轴标签的旋转度数

plt.show()

结果图:

解释:

result是个字典,里面有key的一列和values的一列,key是院系,作为x周哦,values是统计好的数字,作为y轴

for x, y in zip(x, y):

plt.text(x, y+0.05, '%.0f'%y, ha='center', va='bottom')

这是用来在柱状图上面显示数值的

参数的意义:

x代表代表了不同柱子在图形中的位置(坐标),通过for循环找到每一个x、y值的相应坐标,再使用plt.text在对应位置添文字说明来生成相应的数字标签,而for循环也保证了每一个柱子都有标签。x,

y+0.05表示在每一柱子对应x值、y值上方0.05处标注文字说明,’%.0f’ %

y,代表标注的文字,即每个柱子对应的y值,其中0表示不显示小数后面的数值,1就表示显示小数后面一位,以此类推; ha=‘center’,

va= 'bottom’代表对齐的方式

条形图、折线图也是如此设置,饼图则在pie命令中有数据标签的对应参数。对于累积柱状图、双轴柱状图则需要用两个for循环,同时通过x与y的不同加减来设置数据标签位置。

该解释来自于:/charliedaifu/p/9964095.html

plt.xticks(rotation =90)

#设置坐标轴的标签,rotation设置x轴标签的旋转度数(不旋转的话不够宽,显示不下)

6.想把坐标轴的文字变成竖排

好像python做不到,我是通过转成表格再用excel画图的

6.1代码:

pf = pd.DataFrame(list(result.keys()), columns=['院系'])# 第一列

pf = pd.concat([pf,pd.DataFrame(list(result.values()), columns=['计数'])], axis=1) #第二列拼接

'''

#也可以用这个转换

pf=pd.DataFrame(list(result.items()), columns=['院系', '计数'])

'''

file_path = pd.ExcelWriter('I:/hxy/result.xlsx')

pf.to_excel(file_path, encoding='utf-8', index=False)# 输出为表格

file_path.save()# 保存表格

6.2excel中的操作:

1.选择A2:B35这两列有效的

2.插入柱状图

3.改变坐标轴文字方向

得到表格后选择坐标轴–>更多选项

选择文本选项–>文本框–>文字方向–>竖排

4.在柱子上面显示数字

在数据标签那里打勾

三.参考资料:

3.1关于设置坐标轴文本标签排列方式

/oh5w6hinug43jvrhhb/article/details/90152959

3.2关于字典,列表和数据表的转换:

1.将列表变成DataFrame形式,使用pd.concat进行合并

/u013385362/article/details/78444518

内容:

2.将多个列表转换成字典再转换成dataframe

/tanlangqie/article/details/80874866

from pandas.core.frame import DataFrame

a=[1,2,3,4]#列表a

b=[5,6,7,8]#列表b

c={"a" : a,

"b" : b}#将列表a,b转换成字典

data=DataFrame(c)#将字典转换成为数据框

print(data)

这里的a,b都被当成列了

可以子列表先当成行,再转置

from pandas.core.frame import DataFrame

a=[[1,2,3,4],[5,6,7,8]]#包含两个不同的子列表[1,2,3,4]和[5,6,7,8]

data=DataFrame(a)#这时候是以行为标准写入的

print(data)

结果:

0 1 2 3

0 1 2 3 4

1 5 6 7 8

转置:

data=data.T#转置之后得到想要的结果

data.rename(columns={0:'a',1:'b'},inplace=True)#注意这里0和1都不是字符串

print(data)

结果:

a b

0 1 5

1 2 6

2 3 7

3 4 8

3.用pd的方法直接将字典列表转换为DataFrame

/zhengxt-520/p/11446121.html

4.由于只有一个key和一个value的字典转成excel表格会出错,下面是解决办法

/htbeker/article/details/85053308

5.列表转字典

/loner_fang/article/details/80940600

3.3关于统计个数

/qq_42467563/article/details/86182266

/sunshine__0411/article/details/80792970

如果觉得《python用表格中的数据画柱状图_[python]统计excel表格某列中每项出现的次数并画柱状图...》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。