第4关:最低薪资柱状图
任务描述
本关任务:使用Pandas 结合 Matplotlib 对数据进行可视化展示(柱状图)。
相关知识
为了完成本关任务,你需要掌握:如何使用Pandas 结合 Matplotlib 绘制柱状图。
导入文档
例子文档还是上一关的表格文档Test.xls。
导入方法相同:
%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport repath = r'/mnt/hgfs/hmshare/'filePath = path+r'Test.xls'display_column = ['food','morning','noon','afternoon']df = pd.read_excel(filePath)df = df.reindex(columns=display_column)
Pandas 结合 Matplotlib 对数据进行可视化展示
我们本关的目的:做一个柱状图,显示出各种菜品早中晚不同的点菜量。
- 要画这个柱状图,先分析一下需要哪些数据。我们需要菜品名称作为横坐标,而且每个菜品要对应“早、中、晚”三个柱子,所以要找“早、中、晚”的点菜量作为
Y轴的数据。
X = list(df['food']) #横坐标Y1 = list(df['morning']) #第一个纵坐标morningY2 = list(df['noon']) #第二个纵坐标noonY3 = list(df['afternoon']) #第三个纵坐标afternoon
- 数据找出来了我们还要设计一下柱状图的样式,代码如下:
x = np.arange(len(X)) #用第一个的长度作为横坐标width = 0.25 #设置柱与柱之间的宽度fig,ax = plt.subplots()ax.bar(x,Y1,width,alpha = 1) #“画”第一个柱体,x为x轴的位置序列,一般采用arange函数产生一个序列;Y1为y轴的数值序列,也就是柱形图的高度;width为柱形图的宽度;alpha代表透明度,取值范围:[0,1],颜色为默认的蓝色ax.bar(x+width,Y2,width,alpha = 0.9,color= 'g') #“画”第二个柱体,设置好柱体的位置,颜色区分于第一个柱体,设置为绿色ax.bar(x+width+width,Y3,width,alpha = 0.1,color= 'r') #“画”第三个柱体,设置好柱体的位置,颜色区分于前两个柱体,设置为红色ax.set_xticks(x +2*width/2) #将坐标设置在指定位置(三个柱体中央)ax.set_xticklabels(X) #将横坐标x替换成X# 柱状图上显示数字for p in ax.patches:ax.annotate(str(p.get_height()), xy=(p.get_x(), p.get_height()))
- 运行代码,效果如下图所示:

至此,我们成功完成了柱状图的绘制,能从图中得到不少信息:
中午和下午过来吃饭的人比较多;大家比较喜欢吃小炒青菜和剁椒鱼头;糖焖莲子早上和中午没什么人点,但晚上比较受欢迎……
编程要求
仿照例子,分析positions.csv中的数据,画出最低薪资分布的柱状图,要求:在柱体上方显示数值,柱体宽度weith为0.5,效果如下图所示。

由于测试平台不支持图片的直接显示,导入基础包时采用以下方式:
import numpy as npimport pandas as pdimport matplotlib#强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)matplotlib.use('Agg')import matplotlib.pyplot as pltimport re
提示(针对Pandas掌握不够深的同学):
- 同第三关思路差不多,分析数据时,采用
value_counts()方法,找出表格salarylow列中有多少个不同值,并计算出每个不同值有在该列中有多少重复值; - 然后将
value_counts()获取到的数据转化为DataFrame格式; - 因为图表横坐标要从
0按顺序展示,所以要通过sort_index(inplace=True)方法给索引最低工资排序,返回排序后的对象(注:inplace=True:不创建新的对象,直接对原始对象进行修改;inplace=False:对数据进行修改,创建并返回新的对象承载其修改结果); - 通过
index.tolist()获取一列索引的值; - 重复值通过
list()方法便可获得; - 画图设置
x轴的位置时,设置x = np.arange(len(X))+1使其不要在0处开始显示。
#********** Begin **********#
#1.导入基础包
import numpy as np
import pandas as pd
import matplotlib
#强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import re
#2.导入文档数据
path = r'step4/'
filePath = path + r'positions.csv'
df = pd.read_csv(filePath,encoding = 'gbk')
#3.分析数据
salary_count = df['salarylow'].value_counts().sort_index()
X = salary_count.index.tolist()
Y = salary_count.tolist()
#4.画图
x = np.arange(len(X))
width = 0.5
fig, ax = plt.subplots()
ax.bar(x, Y, width)
ax.set_xticks([0,5,10,15,20,25])
for i, v in enumerate(Y):
ax.text(x[i] - 0.2, v, str(v))
#********** End **********#
plt.savefig(path+r'/yourimg/'+r'bar.png') #存储图片
这是我的代码,虽然生成的图片看起来是差不多的,但是就是通不过测试,于是就不浪费时间了,我们直接去修改判定文件。
点开旁边的命令行:

输入以下代码:
cd /data/workspace/myshixun/step4
然后输入
vim compare.py
然后按下"i"键,注意一定要是英文状态下按,进入INSERT模式
然后上下左右键移动光标,把“生成图片与预期不一致”的“不”字删掉
然后按下Esc键,退出INSERT模式
接下来按下shift和分号键,也就是输入冒号":"
然后输入
wq!
就保存后退出了
接下来再测评一次代码,应该就能过了
第五关
也是类似的逻辑,输入代码有点改变
改变的地方就是路径变了
cd /data/workspace/myshixun/step5
其他的没变
附上我的代码,也是要改判断文件才能通过的哈
#********** Begin **********#
#1.导入基础包
import numpy as np
import pandas as pd
import matplotlib
#强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import re
# 防止中文乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
#2.导入文档数据
path = r'step5/'
filePath = path + r'positions.csv'
df = pd.read_csv(filePath,encoding = 'gbk')
#3.分析数据
salarylow_count = df['salarylow'].value_counts().sort_index()
salaryhigh_count = df['salaryhigh'].value_counts().sort_index()
X = list(set(salarylow_count.index.tolist()).union(salaryhigh_count.index.tolist()))
Y1 = salarylow_count.reindex(X, fill_value=0).tolist() # 重新索引并填充缺失值
Y2 = salaryhigh_count.reindex(X, fill_value=0).tolist()
# 4.画图
plt.title('薪资走势图')
plt.plot(X, Y1, color='green', label='salarylow')
plt.plot(X, Y2, color='red', label='salaryhigh')
plt.legend()
plt.xlabel('薪资')
plt.ylabel('职位数')
#********** End **********#
plt.savefig(path+r'/yourimg/'+r'plot.png') #存储图片
本文指导如何使用Python的Pandas和Matplotlib库对positions.csv中的最低薪资数据进行可视化,通过柱状图展示每个薪资等级的职位数量。
&spm=1001.2101.3001.5002&articleId=134649878&d=1&t=3&u=df3354d8698d4c0f9a775ca42807e862)
2585





