紧接着上一篇使用python动态抓取JSON数据获取到的CSV文件,将获取到的数据进行可视化处理。

上篇博客地址:https://www.cnblogs.com/xyxuan/p/14886892.html

1. 分析 CSV 文件

CSV 文件内容如图所示(部分截图):

直接在python中调用CSV模块,打印csv文件的表头:

import csv

# csv文件存储地址
filename = r'所要查询的CSV文件存储路径(若已将文件复制在当前项目下,可直接写文件名称)'
with open(filename) as f:
    # 创建阅读器,调用csv.reader()将前面存储的文件对象作为实参传给他
    reader = csv.reader(f)
    # 调用next()一次,只将文件的第一行存储在header_now中
    header_now = next(reader)

    # 打印表头
    print('表头信息如下:')
    for index,column_header in enumerate(header_now):
        print(index,column_header)

测试结果如下:

2.提取并读取所需要的数据

知道数据所在的索引位置之后,根据索引提取公司名称和薪资范围,为后续绘制图形做准备。

 # 根据索引提取公司名称及薪资范围,并存储在列表中
    company,money = [],[]    #创建了一个空列表,遍历我们需要的数据那一列,得到的数据附加到末尾。
    for row in reader:
        money.append(row[2])
        company.append(row[1])
    print("***** 公司名称 *****")
    print(company)
    print("**** 薪资范围 *****")
    print(money)

输出结果如下(部分截图):

上面获取到了薪资范围的值,但是绘制图表我们需要分别取出最高薪资和最低薪资,并且上面提取到的值为字符串格式,需要转化格式才能使用。

"""
    从获取的薪资范围列表中分别提取出每个公司给出的最低薪资和最高薪资,
    并将提取到的字符串转化为float格式存储
    """
    listlow, listhigh = [],[]
    for m in money:
        num = m.split('-')  # 通过‘-’分割
        low = num[0]  # 提取最低薪资
        high = num[1].split('万/月')[0] # 提取最高薪资,并将后缀单位去除
        # 转化数据格式为float
        lows = float(low)
        highs = float(high)
        listlow.append(lows)
        listhigh.append(highs)
    print("***** 最低薪资 *****")
    print(listlow)
    print("***** 最高薪资 *****")
    print(listhigh)

输出结果如下(数据太多,只截取了一部分):

3. 绘制薪资折现图标

对数据进行可视化处理,用matplotlib创建一个简单的图形

"""
根据上面获取的公司名称,最高薪资,最低薪资绘制折线图,将数据进行可视化处理
横坐标:公司名称
纵坐标:薪资
"""
# 设置图标样式,figsize=(横坐标长度,纵坐标长度)
fig = plt.figure(dpi=128, figsize=(55,25))
# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 最高薪资
plt.plot(company,listhigh, c='red')
# 最低薪资
plt.plot(company,listlow,c='blue')

# 设置X,Y轴刻度间距,及横坐标倾斜角度
plt.xticks(np.arange(0,51,1), rotation=45)
plt.yticks(np.arange(0,6,0.5), rotation=45)

"""
设置图形格式
"""
# 图表标题文字
plt.title('Software Test Engineer', fontsize=24)
# 横坐标名称
plt.xlabel('company', fontsize=10)
# 纵坐标名称
plt.ylabel('Salary(万/月)', fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=26)

"""
将最高最低薪资图标区域着色
# alpha值在0-1范围内(0便是完全透明,1表示完全不透明),facecolor指定了填充区验收

"""
plt.fill_between(company,listhigh,listlow,facecolor = 'blue',alpha=0.2)

# 显示图表
plt.show()

显示效果如图(数据比较多,后续可根据需要优化显示效果):

附完整代码:

# coding:utf-8
# 加载数据分析常用库

import csv
import numpy as np
import matplotlib.pyplot as plt

filename = r'D:\learn\project\reptile\job.csv'
with open(filename) as f:
    # 创建阅读器,调用csv.reader()将前面存储的文件对象作为实参传给他
    reader = csv.reader(f)
    # 调用next()一次,将文件的第一行存储在header_now中
    header_now = next(reader)

    # 打印表头
    print('***** 表头信息如下 ****:')
    for index,column_header in enumerate(header_now):
        print(index,column_header)

    # 根据索引提取公司名称及薪资范围,并存储在列表中
    company,money = [],[]    #创建了一个空列表,遍历我们需要的数据那一列,得到的数据附加到末尾。
    for row in reader:
        money.append(row[2])
        company.append(row[1])
    print("***** 公司名称 *****")
    print(company)
    print("**** 薪资范围 *****")
    print(money)

    """
    从获取的薪资范围列表中分别提取出每个公司给出的最低薪资和最高薪资,
    并将提取到的字符串转化为float格式存储
    """
    listlow, listhigh = [],[]
    for m in money:
        num = m.split('-')  # 通过‘-’分割
        low = num[0]  # 提取最低薪资
        high = num[1].split('万/月')[0] # 提取最高薪资,并将后缀单位去除
        # 转化数据格式为float
        lows = float(low)
        highs = float(high)
        listlow.append(lows)
        listhigh.append(highs)
    print("***** 最低薪资 *****")
    print(listlow)
    print("***** 最高薪资 *****")
    print(listhigh)

"""
根据上面获取的公司名称,最高薪资,最低薪资绘制折线图,将数据进行可视化处理
横坐标:公司名称
纵坐标:薪资
"""
# 设置图标样式,figsize=(横坐标长度,纵坐标长度)
fig = plt.figure(dpi=128, figsize=(55,25))
# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 最高薪资
plt.plot(company,listhigh, c='red')
# 最低薪资
plt.plot(company,listlow,c='blue')

# 设置X,Y轴刻度间距,及横坐标倾斜角度
plt.xticks(np.arange(0,51,1), rotation=45)
plt.yticks(np.arange(0,6,0.5), rotation=45)

"""
设置图形格式
"""
# 图表标题文字
plt.title('Software Test Engineer', fontsize=24)
# 横坐标名称
plt.xlabel('company', fontsize=10)
# 纵坐标名称
plt.ylabel('Salary(万/月)', fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=26)

"""
将最高最低薪资图标区域着色
# alpha值在0-1范围内(0便是完全透明,1表示完全不透明),facecolor指定了填充区验收

"""
plt.fill_between(company,listhigh,listlow,facecolor = 'blue',alpha=0.2)

# 显示图表
plt.show()

 posted on 2021-06-16 17:26  叶叶酱  阅读(6821)  评论(0编辑  收藏  举报