第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') #存储图片
版权归原作者 Radish_c 所有, 如有侵权,请联系我们删除。