利用pandas分析数据并通过matplotlib在tkinter上绘图
先看下效果:
嘻嘻
资源下载(不用积分):
下载文件
你需要掌握的知识:
1.文件操作os库
2.tkinter图形库
3.pandas数据分析库
4.matplotlib绘图库
5.python的基础知识
源代码如下:
import pandas as pd
from tkinter import *
from tkinter import ttk
import tkinter as tk
import os
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2Tk
import mpl_toolkits.axisartist as axisartist
class Analysis_of_the_vaccine:
def __init__(self):
self.root=Tk()
self.root.geometry('1000x800')
self.root.iconbitmap('0.gif')
self.alldata=self.get_data()
self.Gui()
self.root.mainloop()
def get_data(self):
file_dir='D:/python_test/files'
all_file_list=os.listdir(file_dir)
first=True
for i in range(len(all_file_list)):
if first:
csv=pd.read_csv('files/'+all_file_list[i])
first=False
else:
tmp=pd.read_csv('files/'+all_file_list[i])
csv=pd.concat([csv,tmp],axis=0)
csv=csv.dropna()
csv.reset_index(drop=True,inplace=True)
csv['price']=csv['price'].astype(str)
for i in range(csv.shape[0]):
csv['price'][i]=csv['price'][i].split('元')[0].split('/')[0]
li=csv['price'].values.tolist()
unuses=['议价失败','GMP到期,放弃议价','企业放弃议价','未报价','参考采购价参考(']
for unuse in unuses:
if unuse in li:
csv=csv.drop(csv[csv['price']==unuse].index)
csv.reset_index(drop=True,inplace=True)
self.create_company=csv['create_company'].unique()
self.names=csv['name'].unique()
self.province=[name[:-4] for name in all_file_list]
return csv
def get_pro_data(self,pro):
pro_data=self.alldata[self.alldata['prov']==pro]
pro_data.reset_index(drop=True,inplace=True)
return pro_data
def Gui(self):
numIdx=4
frames=[PhotoImage(file='100.gif', format='gif -index %i' %(i)) for i in range(numIdx)]
def update(idx):
frame = frames[idx]
idx+=1
label.configure(image=frame)
self.root.after(100, update, idx%numIdx)
self.labelframe=LabelFrame(self.root,text='图片展示',height=700,width=740)
self.labelframe.pack(side='right')
self.labelframe.pack_propagate(0)
label=Label(self.labelframe)
label.pack()
self.root.after(0, update, 0)
self.menubar=tk.Menu(self.root)
self.filemenu=tk.Menu(self.menubar,tearoff=0)
self.menubar.add_cascade(label='退出',menu=self.filemenu)
self.filemenu.add_command(label='退出',command=self.Exit)
self.root.config(menu=self.menubar)
self.labelframe=LabelFrame(self.root,text='基本操作')
self.labelframe.pack(side='left')
v=tk.IntVar()
r1=tk.Radiobutton(self.labelframe,text='各疫苗生产厂家生产的疫苗类别',variable=v,value=1,command=self._1)
r1.pack(anchor="w")
r2=tk.Radiobutton(self.labelframe,text='各省采购的疫苗类别和价格之间的关系',variable=v,value=2,command=self._2)
r2.pack(anchor="w")
r3=tk.Radiobutton(self.labelframe,text='同类疫苗在不同生产企业的价格走势',variable=v,value=3,command=self._3)
r3.pack(anchor="w")
self.root.mainloop()
def Convert(self,para1,para2):
self.canvas=FigureCanvasTkAgg(para1,para2)
self.canvas.draw()
cv=self.canvas.get_tk_widget()
cv.pack(side=tk.TOP, fill=tk.X, expand=1)
toolbar=NavigationToolbar2Tk(self.canvas,para2)
toolbar.update()
self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH,expand=1)
def Exit(self):
self.root.destroy()
def exit(self):
self.root1.destroy()
def display(self):
self.root1=Tk()
self.root1.geometry('1000x800')
self.labelframe1=LabelFrame(self.root1,text='子窗口',height=900,width=700)
self.labelframe1.pack(fill='both',padx=5,pady=5)
self.labelframe1.pack_propagate(0)
self.labelframe2=LabelFrame(self.labelframe1,text='显示区',height=700,width=750)
self.labelframe2.pack(side='right')
self.labelframe2.pack_propagate(0)
self.labelframe3=LabelFrame(self.labelframe1,text='操作区',width=230)
self.labelframe3.pack(side='left',fill='y')
self.labelframe3.pack_propagate(0)
def display1(self,value_name,func,fir_msg):
number=tk.StringVar()
self.Listchoose=ttk.Combobox(self.labelframe3,width=150,height=40,textvariable=number,state='readonly')
self.Listchoose['values']=list(value_name)
self.Listchoose.bind("<<ComboboxSelected>>",func)
self.Listchoose.set(fir_msg)
self.Listchoose.pack()
self.button=Button(self.labelframe3, width=27, height=1, text="退出", bg='#FFD700',font=("楷", 12),command=self.exit)
self.button.pack()
def _3(self):
self.display()
self.display1(self.names,self._3event,'疫苗信息')
def _3event(self,event):
self.labelframe2.destroy()
self.labelframe2=LabelFrame(self.labelframe1,text='显示区',height=700,width=750)
self.labelframe2.pack(side='right')
self.labelframe2.pack_propagate(0)
alldata=self.alldata
alldata['price']=alldata['price'].astype(float)
alldata=alldata.drop(alldata[alldata['price']==0.].index)
name=self.Listchoose.get()
self.labelframe1['text']=name
alldata['company_pro']=alldata['create_company']+'('+alldata['prov']+')'
company=alldata[alldata['name']==name]['company_pro'].values
price=alldata[alldata['name']==name]['price'].values
self.figure=plt.figure()
self.figure.clf()
matplotlib.rcParams["font.family"] = "SimHei"
plt.yticks(fontsize=5)
plt.barh(company,price)
self.Convert(self.figure,self.labelframe2)
def _2(self):
self.display()
self.display1(self.province,self._2event,'省份')
def _2event(self,event):
self.labelframe2.destroy()
self.labelframe2=LabelFrame(self.labelframe1,text='显示区',height=700,width=750)
self.labelframe2.pack(side='right')
self.labelframe2.pack_propagate(0)
self.labelframe1['text']=self.Listchoose.get()
pro_data=self.get_pro_data(self.Listchoose.get())
pro_data['price']=pro_data['price'].astype(float)
pro_data.reset_index(drop=True,inplace=True)
price=[]
names=pro_data['name'].unique()
for name in names:
price.append(pro_data.iloc[pro_data[pro_data['name']==name].index[0]][6])
if max(price)<=0:
price=[1 for i in price]
self.figure=plt.figure()
self.figure.clf()
matplotlib.rcParams["font.family"] = "SimHei"
plt.pie(x=price,labels=list(names),autopct='%.1f%%',labeldistance=1,radius=1,startangle=45,rotatelabels=True)
self.Convert(self.figure,self.labelframe2)
def _1(self):
self.display()
yscrollbar=Scrollbar(self.root1)
yscrollbar.pack(side='right',fill='y')
self.text=Text(self.labelframe2,width=80,height=50,yscrollcommand=yscrollbar.set)
self.text.pack()
yscrollbar.config(command=self.text.yview)
yscrollbar.pack()
self.display1(self.create_company,self._1event,'生产厂家')
def _1event(self,event):
company=self.Listchoose.get()
self.text.delete('1.0','end')
self.labelframe1['text']=company
names=self.alldata[self.alldata['create_company']==company]['name'].unique()
for name in names:
self.text.insert(END,name+'\n\n')
最后
如果你有疑问,请在评论区毫不犹豫地指出;如果你发现的我的问题,或者你有更好的想法,请告诉我;如果你对本篇文章感兴趣并且获得知识的话,请毫不犹豫地点赞关注我吧!