第4关:最低薪资柱状图
任务描述
本关任务:使用Pandas 结合 Matplotlib 对数据进行可视化展示(柱状图)。
相关知识
为了完成本关任务,你需要掌握:如何使用Pandas 结合 Matplotlib 绘制柱状图。
导入文档
例子文档还是上一关的表格文档Test.xls。
导入方法相同:
- %matplotlib inline
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import re
- path = 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']) #第一个纵坐标morning
- Y2 = list(df['noon']) #第二个纵坐标noon
- Y3 = 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 np
- import pandas as pd
- import matplotlib
- #强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)
- matplotlib.use('Agg')
- import matplotlib.pyplot as plt
- import 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') #存储图片
还没有评论,来说两句吧...