在绘制柱状图之前呢,需要准备txt文件为编写代码提供数据来源,就比如本小白博主的数据源如下:
我准备了两种类型的txt文件,一个是普通的文本格式数据类型,另一个是Json格式的数据类型,盆友们要是想知道这两种格式的区别是什么,可看下图:
普通文本格式:
Json格式:
这两种形式从数据形式上就不尽相同了,而且Json中的字符串必须都用双引号包起来。
然后我们需要新建一个新python文件,命名为data_define
创建一个名为Record的类,然后在这个类里面定义一个构造方法,实现将传入的参数赋值给方法中的成员变量,可以使后续的成员方法能够使用这些赋值后的成员变量,并定义一个__str__魔术方法,将对象通过字符串表达并返回字符串
class Record:
def __init__(self, date, order_id, money, province): # 数据定义
self.date = date # 订单日期
self.order_id = order_id # 订单号
self.money = money # 订单金额
self.province = province # 订单地点
def __str__(self): # 魔术方法,将对象通过字符串表达并返回字符串
return f"{self.date}, {self.order_id}, {self.money}, {self.province}"
另外创建一个新的python文件,命名为file_define
创建一个Filereader类,在里面定义一个抽象方法
class FileReader:
def file_read(self) -> list[Record]: # 抽象方法,list[Record]:返回一个list,里面是Record对象
pass
然后创建两个子类继承父类,复写其中的file_read方法实现功能。在类中定义构造方法,调用时需传入一个文件路径字符串参数
class TxtFileReader(FileReader):
def __init__(self, path): # 构造方法,导入时需传入一个参数作为文件路径
self.path = path
def file_read(self) -> list[Record]:
f = open(self.path, "r", encoding="UTF-8")
record_list: list[Record] = []
for data in f.readlines():
data = data.strip() # 去除txt文件首尾的空格换行符
data_list = data.split(",") # 按逗号分割
record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])
record_list.append(record)
f.close()
return record_list
class JsonFileReader(FileReader):
def __init__(self, path):
self.path = path
def file_read(self) -> list[Record]:
f = open(self.path, "r", encoding="UTF-8")
f_data = f.readlines()
record_list: list[Record] = []
for data in f_data:
data.strip()
data_dict = json.loads(data) # 将json文件格式转换成字典类型
record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])
record_list.append(record)
f.close()
return record_list
随着文件处理的包定义完毕,下面就是在主类中绘制柱状图啦,第一步自然是将定义过的两个包导进来,然后将文件保存的路径传入两个子类中,拿到存储有Record对象的list,随后计算每天的总营业额,最后生成柱状图即可完成啦
from file_define import TxtFileReader, JsonFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts, TitleOpts, AxisOpts
txtFileReader = TxtFileReader("E:/百度网盘/BaiduNetdiskFiles/2011年1月销售数据.txt")
jsonFileReader = JsonFileReader("E:/百度网盘/BaiduNetdiskFiles/2011年2月销售数据JSON.txt")
jan_data: list[Record] = txtFileReader.file_read() # 一月份的数据
fed_data: list[Record] = jsonFileReader.file_read() # 二月份的数据
all_data: list[Record] = jan_data + fed_data # 因为都是同一类型的数据,所以将这两个数据合并起来
dict_data = {} # 计算每天的总营业额并保存在字典中
x_data = [] # x轴数据
for record in all_data:
if record.date in dict_data:
dict_data[record.date] += record.money
else:
dict_data[record.date] = record.money
if record.date not in x_data:
x_data.append(record.date)
else:
continue
bar = Bar()
y_data = [] # y轴数据
for data in dict_data:
y_data.append(dict_data[data])
bar.add_xaxis(x_data)
bar.add_yaxis("营业额", y_data, label_opts=LabelOpts(is_show=False)) # label_opts=LabelOpts(is_show=False):隐藏数值标签
bar.set_global_opts(
title_opts=TitleOpts(title="每日营业额"),
yaxis_opts=AxisOpts(
type_="value",
axislabel_opts=LabelOpts(formatter="{value} 元")
)
)
bar.render("营业额柱状图.html")
这是每天总营业额的字典数据:
最后便是柱状图啦,因为没有更改标签,用的都是默认的,所以是很简单的柱状图啦
多谢各位观看,有什么错误请指出来哦