数据可视化——结合面向对象的思想实现数据可视化

简介: 数据可视化——结合面向对象的思想实现数据可视化

9d8d1ced1d7847278484746fe080aec1.png5df4961b7e864887812ad55b704e2958.gif

前言

前面我们已经学习了如何使用 python 的 pyecharts 模块来实现数据可视化,将数据经过处理后以折线图、地图以及柱状图的形式展现出来,那么这篇文章我将以一个例子为大家分享如何结合 面向对象 的思想来实现数据可视化。

实现数据可视化的过程

  1. 收集数据:收集需要进行可视化的数据,并确保数据的准确性和完整性。数据可以来源于各种渠道,如数据库、日志文件、API等。
  2. 清洗和整理数据:对收集到的数据进行清洗和整理,包括去除重复值、处理缺失数据、处理异常值等。确保数据的质量和一致性。
  3. 选择合适的可视化工具:根据数据的类型和需求,选择合适的可视化工具。常见的可视化工具包括Tableau、Power BI、matplotlib、D3.js等。
  4. 选择可视化类型:根据数据的特点和表达需求,选择合适的可视化类型。常见的可视化类型包括条形图、折线图、散点图、饼图、雷达图等。
  5. 设计可视化界面:根据数据的特点和可视化类型,设计出合适的可视化界面。界面应该简洁明了,注重重点数据的展示和对比。
  6. 绘制图表:使用选择的可视化工具,绘制出设计好的可视化图表。根据需求,添加合适的图例、标签、标题等,以增加图表的可读性和易理解性。
  7. 数据交互和分析:为可视化界面添加交互功能,如鼠标悬停显示数据详情、点击图表元素进行筛选等。通过交互功能,用户可以进行数据的进一步分析和探索。
  8. 调整和优化:根据用户反馈和需求变化,对可视化界面进行调整和优化。可以修改图表样式、改进交互功能、添加新的数据维度等。
  9. 分享和发布:将完成的可视化结果分享和发布,可以通过导出静态图片、生成报告、嵌入网页等方式进行展示和共享。
  10. 监控和更新:定期监控可视化结果,及时更新数据和调整可视化界面,保持可视化结果的时效性和准确性。

我们实现的是简单的数据可视化,今天主要针对收集数据、清洗和整理数、选择可视化类型、绘制图表几个方面来讲解。

实现数据可视化

我们以两个月的销售额来举例,将两个月的销售额以图像的形式展现出来。

读取数据

这里我们已经将数据打包放进了文件中,所以我们需要做的就是将数据从文件中读取出来。由于两个文件的格式是不同的,一种是 csv 格式,一个是 JSON 格式,所以读取和处理数据的方式也是不同的,这里分两个方法来分别读取和处理不同的数据。

这里提供一个接口来方便后面两个类的使用。

class FileReader():
    def reader(self) -> list[Record]:
        pass

什么是接口?接口是指类当中的方法都没有具体的方法体,用 pass 来表示方法体,而具体的方法实现由继承他的子类来实现。

读取文件的方式基本相同,但是为了后面的处理数据操作,我们还是分两个类来实现。

读取csv格式文件数据

class TestFileReader(FileReader):
    def __init__(self,path):
        self.path = path
    def reader(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF8")
        data_lines = f.readlines()
        f.close()

读取JSON格式文件数据

class JsonFileReader(FileReader):
    def __init__(self,path):
        self.path = path
    def reader(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF8")
        data_lines = f.readlines()
        f.close()

创建对象

将每一条销售信息当作对象。

class Record():
    def __init__(self,data,order_id,money,province):
        self.data = data
        self.order_id = order_id
        self.money = money
        self.province = province
    def __str__(self):
        return f'{self.data},{self.order_id},{self.money},{self.province}'

__ init __ 构造方法来对属性进行初始化。

__ str __ 方法来方便我们的打印。

处理数据

我们将数据数据都转换为对象,每个对象代表一条销售信息,然后将这些对象都存储在列表中。

TestFileReader 类

class TestFileReader(FileReader):
    def __init__(self,path):
        self.path = path
    def reader(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF8")
        data_lines = f.readlines()
        f.close()
        list1 : list[Record] = []
        for line in data_lines:
            line = line.strip()  # strip方法用来处理每一行数据后面的 \n
            data_list = line.split(",")
            record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
            list1.append(record)
        return list1

JsonFileReader 类

class JsonFileReader(FileReader):
    def __init__(self,path):
        self.path = path
    def reader(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF8")
        data_lines = f.readlines()
        f.close()
        list1 : list[Record] = []
        for line in data_lines:
            line = line.strip()
            data_dict = json.loads(line)  # JSON类型数据转换为python数据类型
            record = Record(data_dict["date"],data_dict["order_id"],int(data_dict["money"]),data_dict["province"])
            list1.append(record)
        return list1

数据分析

将同一天的销售额累加在一起,并且使用字典这种数据类型来存储,为什么要使用字典呢?因为字典的key值不允许出现重复,这也就对应了我们的日期,而值就对应了我们的销售额。

test_file = TestFileReader("D:/桌面/2011年1月销售数据.txt")
json_file = JsonFileReader("D:/桌面/2011年2月销售数据JSON.txt")
list1 = test_file.reader()
list2 = json_file.reader()
data_list = list1 + list2  # 将两天的数据综合到一起
data_dict = {}
for record in data_list:
    if record.data in data_dict.keys():  # 如果该日期已经存储了,那么我们将存储的值与当前值相加之后再存入
        data_dict[record.data] += record.money
    else:  # 如果没有出现,那么就直接存入数据
        data_dict[record.data] = record.money

绘制柱状图

这个例子我们使用柱状图最能显示出数据的差异,随意我们选择柱状图。

bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))  # 设置系列配置项来取消柱状图中数据的显示
bar.set_global_opts(
    title_opts=TitleOpts(title="2011年1、2月销售情况")
)
bar.render("2021年1、2月销售情况.html")

整体代码及效果展示

data_define.py 文件

class Record():
    def __init__(self,data,order_id,money,province):
        self.data = data
        self.order_id = order_id
        self.money = money
        self.province = province
    def __str__(self):
        return f'{self.data},{self.order_id},{self.money},{self.province}'

file_define.py 文件

from data_define import Record
import json
class FileReader():
    def reader(self) -> list[Record]:
        pass
class TestFileReader(FileReader):
    def __init__(self,path):
        self.path = path
    def reader(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF8")
        data_lines = f.readlines()
        f.close()
        list1 : list[Record] = []
        for line in data_lines:
            line = line.strip()
            data_list = line.split(",")
            record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
            list1.append(record)
        return list1
class JsonFileReader(FileReader):
    def __init__(self,path):
        self.path = path
    def reader(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF8")
        data_lines = f.readlines()
        f.close()
        list1 : list[Record] = []
        for line in data_lines:
            line = line.strip()
            data_dict = json.loads(line)
            record = Record(data_dict["date"],data_dict["order_id"],int(data_dict["money"]),data_dict["province"])
            list1.append(record)
        return list1

main.py 文件

from data_define import Record
from file_define import *
from pyecharts.charts import Bar
from pyecharts.options import TitleOpts,LabelOpts,InitOpts
from pyecharts.globals import ThemeType
test_file = TestFileReader("D:/桌面/2011年1月销售数据.txt")
json_file = JsonFileReader("D:/桌面/2011年2月销售数据JSON.txt")
list1 = test_file.reader()
list2 = json_file.reader()
data_list = list1 + list2
data_dict = {}
for record in data_list:
    if record.data in data_dict.keys():
        data_dict[record.data] += record.money
    else:
        data_dict[record.data] = record.money
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
    title_opts=TitleOpts(title="2011年1、2月销售情况")
)
bar.render("2021年1、2月销售情况.html")


9d8d1ced1d7847278484746fe080aec1.png

相关文章
|
机器人 关系型数据库 MySQL
shell脚本实现文件自动清理并推送钉钉机器人告警
shell脚本实现文件自动清理并推送钉钉机器人告警
294 1
|
6月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
1776 2
|
9月前
|
安全 网络安全 数据中心
服务器托管适用什么场景?
在数字化时代,服务器托管对企业运营至关重要。本文解析了五种常见托管方式:共享托管经济实惠,适合小型网站;VPS灵活可控,适合中小型企业;专用服务器性能卓越,适合大型应用;云托管灵活扩展,适应现代需求;托管式服务外包管理,省心省力。选择时需综合考虑预算、技术能力及性能要求,找到最佳解决方案。
394 0
|
9月前
|
人工智能 边缘计算 运维
连续四年蝉联第一!阿里云边缘云开启多元化演进
连续四年蝉联第一!阿里云边缘云开启多元化演进
306 0
|
机器学习/深度学习 人工智能 开发者
Python适合做游戏吗?
【7月更文挑战第2天】Python适合做游戏吗?
413 56
|
Python
|
存储 监控 安全
什么是日志管理,如何进行日志管理?
日志管理是对IT系统生成的日志数据进行收集、存储、分析和处理的实践,对维护系统健康、确保安全及获取运营智能至关重要。本文介绍了日志管理的基本概念、常见挑战、工具的主要功能及选择解决方案的方法,强调了定义管理目标、日志收集与分析、警报和报告、持续改进等关键步骤,以及如何应对数据量大、安全问题、警报疲劳等挑战,最终实现日志数据的有效管理和利用。
2104 0
|
开发者
Elasticsearch7.15.2 安装ik7.15.2中文分词器报错解决方案
问题描述 下载 elasticsearch-7.15.2 及分词器 elasticsearch-analysis-ik-7.15.2 运行bin/elasticsearch 报以下错误 Exception in thread "main" java.nio.file.NotDirectoryException: /Users/lishuo/ElasticStack/elasticsearch-7.15.2/plugins/.DS_Store at java.base/sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSy
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
247 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码