标题:python 爬取机动车国环公布信息(二)
鉴于:python 爬取机动车国环公布信息(一)尚有部分未写完,现补充后面数据处理的部分。
上一篇链接:https://blog.csdn.net/weixin_44816589/article/details/103937000
运行上一篇程序得到文件vecc_data_get_file.csv,本篇直接对这个文件进行处理。
直接上代码:
import csv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def data_draw_pencentage(x, y_1, y_2, y_3):
"""
:param x: 横坐标
:param y_1: 纵坐标数据1
:param y_2: 纵坐标数据2
:param y_3: 纵坐标数据3
:return:
"""
try:
x_list = x
y_1_list = y_1
y_2_list = y_2
y_3_list = y_3
x_title = x_list[0] # 横坐标轴名称,日期
y_1_title = y_1_list[0] # 纵坐标数据名称,国内企业,左上角
y_2_title = y_2_list[0] # 纵坐标数据名称,国内车型数,左上角
y_3_title = y_3_list[0] # 纵坐标数据名称,国内车型数,左上角
title = y_1_title[:2] + '国六车辆概况' # 图表名称,居中上方
x_list.remove(x_title) # 横轴数据列表去除第一个元素字符“日期”
x_num_list = range(len(x_list))
y_1_list.remove(y_1_title) # 纵坐标数据列表去除第一个元素字符“国内企业”
y_2_list.remove(y_2_title) # 纵坐标数据列表去除第一个元素字符“国内车型数”
y_3_list.remove(y_3_title) # 纵坐标数据列表去除第一个元素字符“国内车辆数”
for i in range(len(y_1_list)): # 字符格式转换为字符串格式
y_1_list[i] = int(y_1_list[i])
y_2_list[i] = int(y_2_list[i])
y_3_list[i] = int(y_3_list[i])
y_1_sum = y_1_list[-1] # 列表最后一位元素为累计总值
y_2_sum = y_2_list[-1] # 列表最后一位元素为累计总值
y_3_sum = y_3_list[-1] # 列表最后一位元素为累计总值
for i in range(len(y_1)):
y_1_list[i] = y_1_list[i] / y_1_list[-1] # 累计值相对于累计总值的比值
y_2_list[i] = y_2_list[i] / y_2_list[-1] # 累计值相对于累计总值的比值
y_3_list[i] = y_3_list[i] / y_3_list[-1] # 累计值相对于累计总值的比值
plt.figure(figsize=(18, 16)) # 新建图不,同时设置尺寸(此代码可不写,则默认)
plt.plot(x_num_list, y_1_list, marker='o', label=y_1_title + '--(当前值)' + str(y_1_sum)) # 第 1 条曲线,同时设置label,线型标签,左上角
plt.plot(x_num_list, y_2_list, marker='*', label=y_2_title + '--(当前值)' + str(y_2_sum)) # 第 2 条曲线,同时设置label,线型标签,左上角
plt.plot(x_num_list, y_3_list, marker='+', label=y_3_title + '--(当前值)' + str(y_3_sum)) # 第 3 条曲线,同时设置label,线型标签,左上角
plt.grid(axis='y') # 设置垂直于y轴的网格线,如果去掉axis=“y”,则为十字交叉网格线
plt.legend() # label 生效,即左上角线型标签生效
plt.xticks(x_num_list, x_list, rotation=45) # 设置x轴标签,改成日期,且倾斜45°
# plt.subplots_adjust(left=0.05, bottom=0.15, right=0.95, top=0.90) # 设置图表下边界距离
plt.subplots_adjust(bottom=0.15) # 设置图表下边界距离
plt.xlabel('日期') # 设置横轴名称
plt.ylabel('累计值/累计总值') # 设置纵轴名称
try:
plt.title(title) # 设置图表标题
except:
print("未输入图标标题")
pass
plt.show() # 使作图生效
except:
print("draw warning")
# def data_file_open(i, j):
def main():
with open('vecc_data_get_file.csv') as data_file:
odata_all = csv.reader(data_file)
# print(odata_all)
print("---------------------------")
""" 新建7个空列表,用来存储需要的数据列表 """
date_temp = [] # 日期
corp_in_temp = [] # 国内企业
car_type_num_in = [] # 国内车型数
car_pro_num_in = [] # 国内车辆数
corp_out_temp = [] # 国外企业
car_type_num_out = [] # 国外车型数
car_pro_num_out = [] # 国外车辆数
""" 数据读取过程 """
for row in odata_all:
date_temp.append(row[0])
corp_in_temp.append(row[7])
car_type_num_in.append(row[8])
car_pro_num_in.append(row[9])
corp_out_temp.append(row[10])
car_type_num_out.append(row[11])
car_pro_num_out.append(row[12])
date_temp_2 = [] # 第一次调用data_draw_pencentage函数后,data_temp的第一个元素“日期”被remove掉,故重新准备一个与data_temp相同的列表
for i in date_temp: # 新建列表,逐项赋值过程
date_temp_2.append(i)
print("date_temp", date_temp)
data_draw_pencentage(date_temp, corp_in_temp, car_type_num_in, car_pro_num_in) # 函数调用
print("date_temp", date_temp)
data_draw_pencentage(date_temp_2, corp_out_temp, car_type_num_out, car_pro_num_out) # 函数调用
if __name__ == "__main__":
main()
代码中有详细解释,不再赘述。
运行后结果: