您的位置:首页 > 编程语言 > Python开发

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()
  • 点赞
  • 收藏
  • 分享
  • 文章举报
qq_30305565 发布了8 篇原创文章 · 获赞 0 · 访问量 111 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: