python学习笔记——自动生成图表工具(更新二)
2020-01-14 08:47
260 查看
本次的更新是昨天那篇文档的全部再次颠覆性改变。还是改变main.py这个文件 增加了以下几个功能
1.增加了如果输入文件路径错误后的操作
2.同一种图表类型的循环使用
3.对代码再次进行封装使代码变得更加的简单阅读
4.方便以后增加图表类型
上一次代码
import csv import matplotlib.pyplot as plt import ai_menu.get_data as number_data from ai_menu.menu import bar_menu # 条形图 from ai_menu.menu import pie_menu # 饼图 from ai_menu.menu import plots_menu # 折线图 plt.rcParams["font.family"] = 'Arial Unicode MS' class ai_menu(): def __init__(self,flie_name): self.flie_name=flie_name def ride_headers(self): '''返回csv文件的表头''' try: with open('{}.csv'.format(self.flie_name),'r')as f: ride=csv.reader(f) for i in ride: break return i except FileNotFoundError: print('找不到指定文件') return '' def op_menu(self): hreaders=self.ride_headers() print(hreaders) while True: print('''图表代码 1,折线图 2,条形图 3,饼图 4,直方图''') menu=input('请选择要使用的图表>>>') if menu=='2': '''使用折线图''' op_number=input('请输入想使用几行数据>>>') if op_number=='2': print('''数据选择类型 1:设置列表数量进行排序 2:根据列表索引进行排序 3:根据数据范围进行排序(目前只支持:整数) 4:根据时间范围进行排序(需要传入完整的年月日)''') list_type=int(input('请选择数据选择类型>>>')) try: if list_type==1: data=number_data.get_two_line_data.get_two_number_data(self.flie_name) line=number_data.get_two_line_data.lists_number(data[0]) bar_menu.two_plt(line[0],line[1],data[1],data[2],self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type==2: data=number_data.get_two_line_data.get_two_number_data(self.flie_name) line=number_data.get_two_line_data.op_list_number(data[0]) bar_menu.two_plt(line[0],line[1],data[1],data[2],self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type==3: data=number_data.get_two_line_data.get_two_number_data(self.flie_name) line=number_data.get_two_line_data.scope_of_data(data[0]) bar_menu.two_plt(line[0],line[1],data[1],data[2],self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type==4: print('''x轴显示方式 1:日期作为x轴 2:其他内容作为x轴''') op_numbers=input('请选择x轴显示方式>>>>') if op_numbers=='1': data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.scope_of_data_time(data[0]) bar_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: data=number_data.get_two_line_data_time.get_time_name_data(self.flie_name) line=number_data.get_two_line_data_time.scope_of_data_time_tag(data[0],data[1]) bar_menu.two_plt(line[0],line[1],data[2],data[3],self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: print('超过最大索引值') except TypeError as e: print('格式错误,不能构建图表。') pass elif op_number=='3': print('''数据选择类型 1:设置列表数量进行排序 2:根据列表索引进行排序 3:根据数据范围进行排序(目前只支持:整数) 4:根据时间范围进行排序(需要传入完整的年月日)''') list_type = int(input('请选择数据选择类型>>>')) try: if list_type==1: data=number_data.get_three_line_data.get_three_number_data(self.flie_name) line=number_data.get_three_line_data.list_number(data[0],data[1]) bar_menu.three_bar(line[0],line[1],line[2],data[2],data[3],data[4],self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type==2: data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.op_list_number(data[0], data[1]) bar_menu.three_bar(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type==3: data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.scope_of_data(data[0], data[1]) bar_menu.three_bar(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type==4: print('''x轴显示方式 1:日期作为x轴 2:其他内容作为x轴''') op_numbers = input('请选择x轴显示方式>>>>') if op_numbers == '1': data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.scope_of_data_time(data[0], data[1]) bar_menu.three_bar(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: data=number_data.get_three_line_data_time.get_time_name_data(self.flie_name) line=number_data.get_three_line_data_time.scope_of_data_time_tag(data[0],data[1],data[2]) bar_menu.three_bar(line[0],line[1],line[2],data[3],data[4],data[5],self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: print('超过最大索引值') except Exception as e: print('格式错误,不能构建图表') pass elif menu=='1': #使用折线图 op_number = int(input('请输入想使用几行数据>>>')) if op_number == 2: print('''数据选择类型 1:设置列表数量进行排序 2:根据列表索引进行排序 3:根据数据范围进行排序(目前只支持:整数) 4:根据时间范围进行排序(需要传入完整的年月日)''') list_type = int(input('请选择数据选择类型>>>')) try: if list_type == 1: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.lists_number(data[0]) plots_menu.two_plt(line[0],line[1],data[1],data[2],self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type == 2: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.op_list_number(data[0]) plots_menu.two_plt(line[0],line[1],data[1],data[2],self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type == 3: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.scope_of_data(data[0]) plots_menu.two_plt(line[0],line[1],data[1],data[2],self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif list_type == 4: print('''x轴显示方式 1:日期作为x轴 2:其他内容作为x轴''') op_numbers = input('请选择x轴显示方式>>>>') if op_numbers == '1': data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.scope_of_data_time(data[0]) plots_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: data = number_data.get_two_line_data_time.get_time_name_data(self.flie_name) line = number_data.get_two_line_data_time.scope_of_data_time_tag(data[0], data[1]) plots_menu.two_plt(line[0], line[1], data[2], data[3], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: print('超过最大索引值') except TypeError as e: print('格式错误,不能构建图表。') pass elif op_number==3: '''输入3行数据''' print('''数据选择类型 1:设置列表数量进行排序 2:根据列表索引进行排序 3:根据数据范围进行排序(目前只支持:整数) 4:根据时间范围进行排序(需要传入完整的年月日)''') list_type = int(input('请选择数据选择类型>>>')) if list_type == 1: data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.list_number(data[0], data[1]) plots_menu.three_plt(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 3: data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.op_list_number(data[0], data[1]) plots_menu.three_plt(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 2: data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.scope_of_data(data[0], data[1]) plots_menu.three_plt(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 4: print('''x轴显示方式 1:日期作为x轴 2:其他内容作为x轴''') op_numbers = input('请选择x轴显示方式>>>>') if op_numbers == '1': data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.scope_of_data_time(data[0], data[1]) plots_menu.three_plt(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass else: data = number_data.get_two_line_data_time.get_time_name_data(self.flie_name) line = number_data.get_two_line_data_time.scope_of_data_time_tag(data[0], data[1]) plots_menu.three_plt(line[0], line[1], data[2], data[3], self.flie_name) op=input('是否继续(N:结束 其他:继续):') if op=='N': break else: pass elif menu=='3': '''使用饼图''' line=pie_menu.get_menu(self.flie_name) pie_menu.plt_menu(line[0],line[1],line[2]) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: pass def run(self): self.op_menu() def main(): flie=input('请输入打开文件名称:') data=ai_menu(flie) data.run() if __name__ == '__main__': main()
更改后代码
import csv import matplotlib.pyplot as plt import ai_menu.get_data as number_data from ai_menu.menu import bar_menu # 条形图 from ai_menu.menu import pie_menu # 饼图 from ai_menu.menu import plots_menu # 折线图 plt.rcParams["font.family"] = 'Arial Unicode MS' ''' 本次最大的更改就是我把之前所有选择图表的功能都放到一个函数上,这时的if elif就用的太对很影响阅读并且不利于之后添加新的图表 这里我把不同的图表放到不同的函数中 在最后在新建一个函数用来控制选择哪种图表,来直接调用函数,这样虽然会增加代码的数量但是也会 使整体的代码变得易读。 ''' class ai_menu(): def __init__(self,flie_name): self.flie_name=flie_name def ride_headers(self): '''返回csv文件的表头''' try: with open('{}.csv'.format(self.flie_name),'r')as f: ride=csv.reader(f) for i in ride: print(i) break return True except FileNotFoundError: print('找不到指定文件') return False def Bar_menu(self): '''我在这里加入一个while循环的作用是当我在使用一个条形图表后可以控制我下一个图表是不是还是使用条形图''' while True: op_number = input('请输入想使用几行数据>>>') if op_number == '2': print('''数据选择类型 1:设置列表数量进行排序 2:根据列表索引进行排序 3:根据数据范围进行排序(目前只支持:整数) 4:根据时间范围进行排序(需要传入完整的年月日)''') list_type = int(input('请选择数据选择类型>>>')) try: if list_type == 1: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.lists_number(data[0]) bar_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 2: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.op_list_number(data[0]) bar_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 3: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.scope_of_data(data[0]) bar_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 4: print('''x轴显示方式 1:日期作为x轴 2:其他内容作为x轴''') op_numbers = input('请选择x轴显示方式>>>>') if op_numbers == '1': data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.scope_of_data_time(data[0]) bar_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: data = number_data.get_two_line_data_time.get_time_name_data(self.flie_name) line = number_data.get_two_line_data_time.scope_of_data_time_tag(data[0], data[1]) bar_menu.two_plt(line[0], line[1], data[2], data[3], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: print('超过最大索引值') except TypeError as e: print('格式错误,不能构建图表。') pass def Plots_menu(self): while True: op_number = int(input('请输入想使用几行数据>>>')) if op_number == 2: print('''数据选择类型 1:设置列表数量进行排序 2:根据列表索引进行排序 3:根据数据范围进行排序(目前只支持:整数) 4:根据时间范围进行排序(需要传入完整的年月日)''') list_type = int(input('请选择数据选择类型>>>')) try: if list_type == 1: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.lists_number(data[0]) plots_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 2: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.op_list_number(data[0]) plots_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 3: data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.scope_of_data(data[0]) plots_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 4: print('''x轴显示方式 1:日期作为x轴 2:其他内容作为x轴''') op_numbers = input('请选择x轴显示方式>>>>') if op_numbers == '1': data = number_data.get_two_line_data.get_two_number_data(self.flie_name) line = number_data.get_two_line_data.scope_of_data_time(data[0]) plots_menu.two_plt(line[0], line[1], data[1], data[2], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: data = number_data.get_two_line_data_time.get_time_name_data(self.flie_name) line = number_data.get_two_line_data_time.scope_of_data_time_tag(data[0], data[1]) plots_menu.two_plt(line[0], line[1], data[2], data[3], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: print('超过最大索引值') except TypeError as e: print('格式错误,不能构建图表。') pass elif op_number == 3: '''输入3行数据''' print('''数据选择类型 1:设置列表数量进行排序 2:根据列表索引进行排序 3:根据数据范围进行排序(目前只支持:整数) 4:根据时间范围进行排序(需要传入完整的年月日)''') list_type = int(input('请选择数据选择类型>>>')) if list_type == 1: data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.list_number(data[0], data[1]) plots_menu.three_plt(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 3: data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.op_list_number(data[0], data[1]) plots_menu.three_plt(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 2: data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.scope_of_data(data[0], data[1]) plots_menu.three_plt(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass elif list_type == 4: print('''x轴显示方式 1:日期作为x轴 2:其他内容作为x轴''') op_numbers = input('请选择x轴显示方式>>>>') if op_numbers == '1': data = number_data.get_three_line_data.get_three_number_data(self.flie_name) line = number_data.get_three_line_data.scope_of_data_time(data[0], data[1]) plots_menu.three_plt(line[0], line[1], line[2], data[2], data[3], data[4], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass else: data = number_data.get_two_line_data_time.get_time_name_data(self.flie_name) line = number_data.get_two_line_data_time.scope_of_data_time_tag(data[0], data[1]) plots_menu.three_plt(line[0], line[1], data[2], data[3], self.flie_name) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass def Pie(self): while True: line = pie_menu.get_menu(self.flie_name) pie_menu.plt_menu(line[0], line[1], line[2]) op = input('是否继续(N:结束 其他:继续):') if op == 'N': break else: pass def main(self): print('''图表代码 1,折线图 2,条形图 3,饼图 4,直方图''') while True: menu = input('请选择要使用的图表>>>') if menu=='1': self.Plots_menu() elif menu=='2': self.Bar_menu() elif menu=='3': self.Pie() elif menu=='N': print('退出程序') break else: print('暂无图表') def main(): while True: flie_name=input('请输入文件名地址or文件名地址:') ai=ai_menu(flie_name) op=ai.ride_headers() if op ==True: ai.main() break else: op_flie=input('文件名or地址错误,是否继续输入(Y:继续输入):') if op_flie == 'Y': pass else: break if __name__ == '__main__': main()
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- yii学习笔记—gii 自动代码生成工具
- 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
- python学习重温(1)---自动case生成工具
- [转]轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
- 使用Python生成博客目录并自动更新README
- 代码自动生成工具版本更新,新增支持Arduino uno R3
- 代码自动生成工具版本更新,新增支持Arduino uno R3
- python学习重温(2)---自动case生成工具之elementtree
- python学习重温(1)---自动case生成工具
- 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
- 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
- SQL SERVER 2005 数据库对比工具,并自动生成更新SQL脚本
- python的UML类图自动生成工具--pyreverse安装和使用
- 代码自动生成工具版本更新,新增支持Arduino uno R3
- python工具代码之身份证校验持续更新:【内向即失败--王奕君】
- python使用open flash chart生成图表(基于pyofc2)
- SQL语句图表生成工具ChartSQL
- 简单使用Python自动生成文章
- mybatis代码自动生成工具
- C#工具---使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明