tkinter+matplotlib打造“数据分析助手”实现图表自动化

去年写的一个数据分析小助手。
每个月初补充上月的新增数据,就能实现多期历史数据按季度、月份、周(星期)的不同统计口径、不同的统计区间进行统计分析和自动画图(发展趋势、占比变化等),自动化输出统计报表等,根据不同的维度、统计对象、范围进行组合,拆分,汇总等运算后输出统计结果。
在图形界面上几下点击以后,图表秒出,看看效果:
数据分析助手
框架的代码(只是结构,具体的数据需要自己填补进去哦,部分功能的实现在我的其他博文中,欢迎交流。)

import datetime
from datetime import timedelta
import math #季度推算
from dateutil.relativedelta import * #月度推算
import tkinter as tk  # 使用Tkinter前需要先导入
from tkinter import *
import os,re,sys
import numpy as np
import pandas as pd #导入pandas库
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False     # 正常显示负号
import mpl_toolkits.axisartist as axisartist
from mpl_toolkits.axisartist.axislines import SubplotZero
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from mpl_toolkits.axes_grid1.inset_locator import mark_inset

window = tk.Tk()
window.title('数据分析助手01.03')
window.geometry('1000x700')  # 这里的乘是小x
biaoti = tk.Label(window, text="数 据 分 析 助 手", fg='blue',font=('Batang', 20), width=30)
biaoti.place(x=250,y=30)  #
# 在图形界面上创建一个标签label用以显示并放置
var1 = tk.StringVar()  # 创建变量,用var1用来接收鼠标点击具体选项的内容
l = tk.Label(window, bg='white', fg='red',font=('Arial', 10), width=20, textvariable=var1)
l.place(x=250,y=120)

lweidu = tk.Label(window, text="数据维度(季输1/周输2/年输3)\n(空值默认为月,其他必输):")
lweidu.place(x=50,y=160)  #
NUM_weidu = tk.StringVar()
NUM_weidu.set("")
date_weidu =tk.Entry(window,text = "",width=20,textvariable = NUM_weidu)
date_weidu.place(x=50,y=200)

lshu = tk.Label(window, text="请输入要处理几期数据\n(空值默认为2):")
lshu.place(x=50,y=230)  #
NUM0 = tk.StringVar()
NUM0.set("")
date_num =tk.Entry(window,text = "",width=20,textvariable = NUM0)
date_num.place(x=50,y=270)

lye = tk.Label(window, text="请输入最后的月/季/周\n(空值默认为上月):")
lye.place(x=50,y=300)  #
date_m0 = tk.StringVar()
date_m0.set("")
date_mm =tk.Entry(window,text = "",width=20, textvariable = date_m0)
date_mm.place(x=50,y=340)

lye1 = tk.Label(window, text="是否6类特价商品\n(是输1/空值默认为否):")
lye1.place(x=50,y=370)  #
M3_M9 = tk.StringVar()
M3_M9.set("")
M3M9 =tk.Entry(window,text = "",width=20, textvariable = M3_M9)
M3M9.place(x=50,y=410)
v3_list0=['总公司下载数据', '新员工销售统计','老员工销售统计','单个商品进出货数据','库存商品统计','季度分公司分级']#建立一个列表,数据库种类,"非法金融活动模型",'总行下发分行数据'

def print_selection1():  # 创建一个方法用于按钮的点击事件
          value = lb.get(lb.curselection())   # 获取当前选中的报表种类
          var1.set(value)  # 为label设置值          
          fenghang1 = ['广东', '珠海', '汕头', '潮州', '韶关', '河源', '梅州', '惠州', '汕尾', '东莞',\
           '中山', '江门', '佛山', '阳江', '湛江', '茂名', '肇庆', '清远', '揭阳', '云浮']

          value1=value # 此时value是报表种类的名称,value1
          print("\n下面开始处理:%s" % (value1))
                  
          var4 = tk.StringVar()# 创建Listbox并为其添加内容
          var4.set(fenghang1) # 为变量var4设置值                  
          var2 = tk.StringVar()  # 创建变量,用var2用来接收鼠标点击具体选项的内容
          l2 = tk.Label(window, bg='white', fg='red',font=('Arial', 10), width=16, textvariable=var2)
          l2.place(x=480,y=120)
          def print_selection2():  # 创建一个方法用于按钮的点击事件
                    value = lb_2.get(lb_2.curselection())   # 获取当前选中的分公司名称
                    var2.set(value)  # 为label设置值
                    value2=value #这里value2是分公司的名称
                    #下面导入数据表

                    var5 = tk.StringVar()  # 创建变量,用var5用来接收鼠标点击具体选项的内容,图的种类名称
                    l3 = tk.Label(window, bg='white', fg='red',font=('Arial', 10), width=26, textvariable=var5)
                    l3.place(x=680,y=120)
                    def print_selection3():  # 创建一个方法用于按钮的点击事件
                              Aa = tk.Label(window, bg='#f4f4f4',fg="blue",font=("Arial",10),width=90,height=10,text ='',wraplength = 656,justify = 'left')#创建一个显示文字分析的窗口
                              Aa.place(x=120,y=480)# 文字分析窗口
                              value = lb_3.get(lb_3.curselection())   # 获取当前选中的图的名称
                              var5.set(value)  # 为label设置值                              
                              value3=value # 此时value是图的种类名称

                              def qushitu(num_list1,num_list2,label_list0):    #自定义一个函数,画变化趋势图
                                      plt.close() #清除之前的图形
                                      fig = plt.figure(num=1, figsize=(9,5),dpi=90)# 共享坐标轴 方法一
                                      #引入数据(略),具体数据省略了。。。。。。
                                      # 只共享X轴  sharex
                                      ax2 = plt.subplot(212, sharex=ax1)
                                      plt.show()

                              if value =="销售任务(实际销量)变化趋势图"  or  value =='新员工销售任务(实际销量)变化趋势图':
                                      #引入数据(略)
                                      qushitu(num_list1,num_list2,label_list0)
                              if value =="本期出货数量及商品占比图":
                                      plt.close() #清除之前的图形
                                      fig = plt.figure(num=2, figsize=(7, 4))
                                      ax1 = fig.add_subplot(1, 1, 1)
                                      #引入数据(略)
                                      plt.ylim(0,Y_len2_1)  # 限定纵轴的范围
                                      plt.legend(loc='upper left', fontsize=9) # 让图例生效
                                      #要添加的子图
                                      axins = inset_axes(ax1,width=2.5, height=1.2, loc='upper right')
                                      # ax1 大图, width height分别为子图的宽和高,loc 为子图在大图ax1中的相对位置 相应的值有lower left,center right,center
                                      axins.bar(x2,dict(data2_3).values(),width=0.4, color=cor,alpha=0.5)                                      
                                      plt.show()
                                    

                    #下面是框架:          
                    lb_3 = tk.Button(window, text='请选择输出图表名称', width=29, height=2, command=print_selection3)# 创建一个按钮并放置,点击按钮调用print_selection函数
                    lb_3.place(x=680,y=150)                    
                    var6 = tk.StringVar()# 创建Listbox并为其添加内容                    
                    if  value1 ==  '总公司下载数据':
                              var6.set(('多期利润分成或本期环比','多期退货统计或本期环比',"按地区统计本期潜在客户数量",'本期出货数量及商品占比图','本期退货原因统计图','机构网点分析','销售任务(实际销量)变化趋势图','多期合并原表')) # 为变量var3设置值
                    elif  value1 ==  '新员工销售统计':
                              var6.set(('多期利润分成或本期环比','多期退货统计或本期环比','本期出货数量及商品占比图','本期退货原因统计图','机构网点分析','多期合并原表','按地区统计本期潜在客户数量','销售任务(实际销量)变化趋势图')) # 为变量var3设置值
                    elif  value1 ==  '老员工销售统计':
                              var6.set(('多期利润分成或本期环比','多期退货统计或本期环比','本期出货数量及商品占比图','本期退货原因统计图','机构网点分析','多期合并原表','按地区统计本期潜在客户数量','销售任务(实际销量)变化趋势图')) # 为变量var3设置值
                    elif  value1 ==  '单个商品进出货数据':
                              var6.set(model) #("趋势图")
                    elif  value1 ==  '季度分公司分级':                              
                              var6.set(('本季清单','本季各类占比统计表','多期合并原表','本季明细',"(内)外加工数量趋势图",'多期拆分与环比')) #结果
                    elif  value1 == '库存商品统计':
                          var6.set(('多期退货统计或本期环比','多期合并原表','本期退货原因统计图','(内)外加工数量趋势图'))
                          # 创建Listbox
                    lb_3 = tk.Listbox(window, listvariable=var6, width=30, height=13)  #将var5的值赋给Listbox
                    if  value10==['M3M4M5M7M8M9'] and value1 !=  '单个商品进出货数据': #设置第三个选择框中图种类的增减
                              lb_3.insert('end','M3M4M5M7M8M9')  # 从最后一个位置开始加入值,本期排名
                    if  value1 ==  '季度分公司分级' :
                          if  NUM>6:
                                lb_3.insert('end','连续3期排名前','多期结果','近3季升降前10名')  #
                          if  value2 ==  '广东':
                                lb_3.insert('end','多期利润分成或本期环比','多期退货统计或本期环比','本期退货原因统计图','新员工销售任务(实际销量)变化趋势图')
                                        
                    lb_3.place(x=680,y=200)
                   
          lb_2 = tk.Button(window, text='请选择分公司名称', width=18, height=2, command=print_selection2)# 创建一个按钮并放置,点击按钮调用print_selection函数
          lb_2.place(x=480,y=150)
          # 创建Listbox
          lb_2 = tk.Listbox(window, listvariable=var4, width=19, height=13)  #将var3的值赋给Listbox,第二个选择菜单的内容,分行或模型名称
          lb_2.place(x=480,y=200)          

b1 = tk.Button(window, text='请选择数据种类', width=22, height=2, command=print_selection1)# 创建一个按钮并放置,点击按钮调用print_selection函数
b1.place(x=250,y=150)

v3_list = list(set(v3_list0))# 数据库文件夹中所有报表名称的列表,转换为集合再转换为列表,set是列表剔重
var3 = tk.StringVar()# 创建Listbox并为其添加内容
var3.set(v3_list) # 为变量var3设置值,所有报表名称
# 创建Listbox
lb = tk.Listbox(window, listvariable=var3, width=23, height=13)  #将var3的值赋给Listbox
lb.place(x=250,y=200)

lm = tk.Label(window,fg="#3066cc",text='维护日期:2021-01-27  如是我闻')  # 在图形界面下方创建一个标签label用以放置制作人
lm.pack(side="bottom")
# 主窗口循环显示
window.mainloop() 

在这里插入图片描述

回顾近两年来的学习,70后的我,快奔五的人眼睛既近视,又开始老花,记忆力也慢慢下降了,学起来确实是困难重重,最主要的是没有参加培训班,完全靠自学,碰到难题的时候经常花费大量的时间去研究。
下面是我个人的一点学习体会:
1。通过CSDN手机app平台,极大方便了我学习和查找资料,一碰到难题就在平台上搜索,通常可以找到解决办法。同时可以利用零散的时间进行学习,不论是坐车、看电视、接送小孩等,随时随地都可以看上一二篇文章可代码。
2。从简单的做起,再逐渐细化,不断修改和完善。想一开始就弄个高大尚的程序,对于我这种无编程基础的人来说,是很容易放弃的。
3。结合工作实际,边学边用。因为不是码农出身,没有编写代码的经验,所以不追求什么专业性的东西。但是,正因为自己并非程序员,工作上对编程没什么要求,只要稍微学一点,在公司内部就比他人多了一项技能,这样可以建立起信心,慢慢地学下去。一步一个脚印,一年后,终于结合工作中的数据分析,编写出一些简单的代码,大大提升了工作效率。

  • 14
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要在tkinter实现matplotlib,需要使用matplotlib的FigureCanvasTkAgg类。首先,导入必要的库,包括tkinter以及FigureCanvasTkAgg和matplotlib.pyplot。然后,创建一个tkinter窗口,并在其中添加一个画布。接下来,将matplotlib的图形对象绘制在画布上,然后使用pack()或grid()等方法将画布显示在窗口上。最后,使用mainloop()方法启动窗口的事件循环,以保持窗口的显示。以下是一个示例代码: ```python import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import matplotlib.pyplot as plt # 创建tkinter窗口 window = tk.Tk() # 创建一个画布 canvas = tk.Canvas(window, width=400, height=400) canvas.pack() # 创建一个matplotlib图形对象 fig, ax = plt.subplots() ax.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25]) # 创建一个FigureCanvasTkAgg对象,并将图形对象绘制在画布上 canvas_widget = FigureCanvasTkAgg(fig, canvas) canvas_widget.draw() # 将画布显示在窗口上 canvas_widget.get_tk_widget().pack() # 启动窗口的事件循环 window.mainloop() ``` 这样就可以在tkinter窗口中显示matplotlib绘制的图形了。注意,需要安装相应的库才能运行上述代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [tkinter 显示matplotlib绘图](https://blog.csdn.net/qq_33267306/article/details/125587834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python+mysql+tkinter+matplotlib的可视化学生成绩管理系统课程设计](https://blog.csdn.net/m0_56604317/article/details/128473414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [利用Tkintermatplotlib两种方式画饼状图的实例](https://download.csdn.net/download/weixin_38717450/13770205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值