Python使用策略模式绘制图片分析多组数据

news2024/12/23 18:30:06
  • 趋势分析:折线图
  • 静态比较:条形图
  • 分布分析:箱线图
  • 离散情况:散点图

import matplotlib.pylab as plt
from abc import ABC, abstractmethod
import seaborn as sns
import pandas as pd
import plotly.graph_objects as go
import plotly.io as pio
import altair as alt
from bokeh.plotting import figure, output_file, show
from bokeh.io import output_file, show
from bokeh.palettes import Category20c
from bokeh.plotting import figure, show
from bokeh.transform import cumsum
from math import pi
import numpy as np


class PlotStrategy(ABC):
    # 抽象类:强制子类实现此方法
    @abstractmethod
    def plot(self, x_data, y_data, desc):
        pass


class LineMulPlotStrategy(PlotStrategy):
    def plot(self, x_data, y_data, desc):
        print('折线图')
        plt.clf()  # 清除当前图形内容
        arr_data = [d[list(d.keys())[0]] for d in y_data]  # 提取数据
        arr_key = [list(d.keys())[0] for d in y_data]

        plt.plot(x_data, arr_data[0], label=arr_key[0])
        plt.plot(x_data, arr_data[1], label=arr_key[1])

        plt.xlabel(desc[1])
        plt.ylabel(desc[2])
        plt.title(desc[0])
        plt.legend()
        # plt.show()
        plt.savefig('./lineMul.png')

class  BarMulPlotStrategy(PlotStrategy):
    def plot(self, x_data, y_data, desc):
        print('柱状图')
        plt.clf()  # 清除当前图形内容
        arr_data = [d[list(d.keys())[0]] for d in y_data]  # 提取数据
        arr_key = [list(d.keys())[0] for d in y_data]

        bar_width = 0.35  # 条形宽度
        x_offset = 0.2  # 每个条形图的水平偏移量

        # 绘制第一个条形图
        # np.arange() 函数的作用是生成一个等差序列的一维数组。
        # 如果 x_data 是一个有 5 个元素的列表,那么 np.arange(len(x_data)) 将生成一个包含 0、1、2、3、4 的整数数组
        plt.bar(np.arange(len(x_data)) - x_offset, arr_data[0], width=bar_width, label=arr_key[0])
        # 绘制第二个条形图
        plt.bar(np.arange(len(x_data)) + x_offset, arr_data[1], width=bar_width, label=arr_key[1])

        # plt.bar(x_data, arr_data[0])
        # plt.bar(x_data, arr_data[1])

        plt.xlabel(desc[1])
        plt.ylabel(desc[2])
        plt.title(desc[0])

        # plt.show()
        plt.savefig('./BarMul.png')

class  BoxMulPlotStrategy(PlotStrategy):
    def plot(self, x_data, y_data, desc):
        print('箱线图')
        plt.clf()  # 清除当前图形内容
        arr_data = [d[list(d.keys())[0]] for d in y_data]  # 提取数据
        arr_key = [list(d.keys())[0] for d in y_data]

        plt.boxplot(arr_data, tick_labels=arr_key)

        plt.xlabel(desc[1])
        plt.ylabel(desc[2])
        plt.title(desc[0])

        # plt.show()
        plt.savefig('./BoxMul.png')

class  ScatterMulPlotStrategy(PlotStrategy):
    def plot(self, x_data, y_data, desc):
        print('散点图')
        plt.clf()  # 清除当前图形内容
        arr_data = [d[list(d.keys())[0]] for d in y_data]  # 提取数据
        arr_key = [list(d.keys())[0] for d in y_data]

        plt.scatter(x_data, arr_data[0], label=arr_key[0])
        plt.scatter(x_data, arr_data[1], label=arr_key[1])

        plt.xlabel(desc[1])
        plt.ylabel(desc[2])
        plt.title(desc[0])
        # 显示label对应的图例
        plt.legend()

        # plt.show()
        plt.savefig('./ScatterMul.png')

# Context类持有PlotStrategy的引用。可以通过set_strategy方法动态地更改策略
class Context:
    def __int__(self, strategy: PlotStrategy):
        # _ 开头的变量,表示这是一个受保护的变量
        # 该变量只在类内部及其子类中使用,而不应在类外部直接访问
        self._strategy = strategy

    def set_strategy(self, strategy: PlotStrategy):
        self._strategy = strategy

    def execute_strategy(self, x_data, y_data, desc):
        self._strategy.plot(x_data, y_data, desc)


x = ['A','B','C','D','E']
y = [
    {'key1':[2, 3, 6, 1, 4]},
    {'key2':[1, 2, 3, 4, 5]}
    ]
desc = ['title', 'x', 'y']


context = Context()

context.set_strategy(LineMulPlotStrategy())
context.execute_strategy(x, y, desc)

context.set_strategy(BarMulPlotStrategy())
context.execute_strategy(x, y, desc)

context.set_strategy(BoxMulPlotStrategy())
context.execute_strategy(x, y, desc)

context.set_strategy(ScatterMulPlotStrategy())
context.execute_strategy(x, y, desc)


折线图
柱状图
箱线图
散点图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目方案:社会视频资源整合接入汇聚系统解决方案(七)

目录 一、概述 1.1 应用背景 1.2 总体目标 1.3 设计原则 1.4 设计依据 1.5 术语解释 二、需求分析 2.1 政策分析 2.2 业务分析 2.3 系统需求 三、系统总体设计 3.1设计思路 3.2总体架构 3.3联网技术要求 四、视频整合及汇聚接入 4.1设计概述 4.2社会视频资源分…

Redis数据库(一):Redis数据库介绍与安装

Redis是一种高性能的开源内存数据库,支持多种数据结构(如字符串、列表、集合等),具有快速的读写速度。它提供持久化、主从复制、高可用性和分布式部署等功能,适用于缓存、实时分析、消息队列等应用场景。Redis使用简单…

Spring Boot + Vue 全栈开发,都需要哪些前端知识?

Node.js默认安装的npm包和工具的位置:Node.js目录\node_modules 在这个目录下你可以看见 npm目录,npm本身就是被NPM包管理器管理的一个工具,说明 Node.js已经集成了npm工具 #在命令提示符输入 npm -v 可查看当前npm版本 npm -v 二、使用n…

用英文介绍成都:Chengdu, China’s New Blueprint MEGACITY

Chengdu, China’s New Blueprint MEGACITY Link: https://www.youtube.com/watch?va6DR5Hh4AHM Southwest China’s largest metropolis and one of its greenest big cities has a population of 21 million. Chengdu exemplifies Beijing’s quest to modernize the count…

SiC MOSFET的性能优势以及技术难点

碳化硅功率器件近年来越来越广泛应用于工业领域,不断地推陈出新,作为一种新型功率器件,与传统的硅基功率器件相比,在某些特定条件下具有独特的优势,但也存在一定的不足,似乎对于碳化硅元器件的普及还有一些…

JAVA并发编程【Semaphore】源码解析

文章目录 一、Semaphore基础概念二、接口限流场景模拟三、Semaphore源码解析3.1、Semaphore结构解析3.1.1、Sync源码3.1.2、NonfairSync源码3.1.3、FairSync源码 3.2、Semaphore重点方法源码解析 本章节将对Semaphore类中所有方法进行源码解析并提供部分代码案例。可以让读者全…

服务器win10server,python安装paddleocr的踩坑日记

最近由于需要图像文字识别的简单业务,研究了一下,一是用大厂的文字识别api,如百度腾讯等,但这种免费版只有有限的调用次数,如百度只有每月只有1000次调用额度,个人也够用,但由于业务量大&#x…

通天星CMSV6车载定位监控平台 point_manage/merge SQL注入致RCE漏洞复现

0x01 产品简介 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。 0x02 漏洞概述 …

泛微E9开发 根据判断条件,控制字段的编辑/必填属性

根据判断条件,控制字段的编辑/必填属性 1、需求说明2、实现方法3、扩展知识点1. 注册钩子事件,指定动作完成后触发1.1 接口名称及参数说明1.2 案例 2. 改变单个字段显示属性(只读/必填等)2.1 参数说明2.2 案例 1、需求说明 当字段“填报人”和字段“姓名…

测试基础15:测试用例设计方法-场景设计(流程分析)

课程大纲 1、定义 系统多个功能串联形成业务流程,不仅需要验证正确的主流程,而且需要验证各个功能点各种异常情况。 2、应用场景 与因果图&判定表方法的相似之处:界面需手动填写的输入框少,基本只需选择有限的几个&#xff08…

小型数据中心是什么?如何建设?

在数字化时代,小型数据中心正成为许多企业和组织加强数据管理和服务扩展的理想选择。与传统大型数据中心相比,小型数据中心以其灵活性、高效性和相对较低的运营成本吸引着越来越多的关注。然而,要成功建设一个小型数据中心,并确保…

TC3xx启动的功能安全机制浅析(1)

目录 1.SM基本概念 2.芯片启动阶段safety相关解读 3.小结 之前描述TC3xx Boot Firmware逻辑时提到了功能安全的内容,但没有完全展开;启动阶段与功能安全相关的内容如下图所示: 其中, 灰色背景指在BootRom Fireware里的运行逻辑…

720漫游工具又双叒叕上新了一批新功能

一、720漫游全景图片上传支持「自定义水印」 全景图片素材上传支持自定义水印设置,通过自定义水印,可以在全景图片上打上自定义的水印图片保护用户版权利益,同时强化自身品牌露出。具体操作如下: 打开「创建720漫游作品页」-选择…

一文搞懂Linux命令行下载OneDrive分享文件

一文搞懂Linux命令行下载OneDrive分享文件 什么问题? 因为OneDrive有些坑,无法从分享界面获取真实下载链接,比如下面这个链接: https://connecthkuhk-my.sharepoint.com/:f:/g/personal/jhyang13_connect_hku_hk/EsEgHtGOWbJIm…

信息系统分析与设计:重点内容|UML在线绘制|数据库技术

目录 UML在线绘图工具信息系统分析与设计第1章 系统思想第2章 信息、管理与信息系统第3章 信息系统建设概论🌟第4章 系统规划🌟第5章 系统分析概述第6章 流程建模🌟业务流程图DFD数据流图🌟数据字典 第7章 用例建模(用例图)&#…

【扫雷游戏】C语言详解

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

这才是真正的在线VS Code,其他的只能算是在线文本编辑器

前言 在数字化时代,编程已成为各行各业不可或缺的技能。然而,传统的编程环境往往需要在本地安装复杂的开发工具和软件,这不仅占用了大量的存储空间,还可能导致系统资源的浪费。为此在网上冲浪找了许多在线代码编辑器,…

昂科烧录器支持HangShun航顺芯片的32位微控制器HK32F030C8T6

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中HangShun航顺芯片的32位微控制器HK32F030C8T6已经被昂科的通用烧录平台AP8000所支持。 HK32F030C8T6使用ARM Cortex-M0内核,最高工作频率96 MHz,内置最…

国际网络专线的开通流程

1. 选择服务商:首先,您需要选择一个可靠的服务商来提供国际网络专线服务。确保服务商具有良好的声誉和专业知识,以便为您提供高质量的网络连接和支持。 2. 评估需求:在与服务商沟通之前,您需要明确自己的网络需求。这…

TikTok美妆护肤热销背后:达人的力量与品牌崛起

TikTok不仅是一个娱乐和社交的平台,更是一个强大的电商平台。在美妆护肤领域,TikTok更是展现出其强大的带货能力,成为美妆护肤类商品热销的新势力。本文Nox聚星将和大家探讨TikTok上美妆护肤类商品的特点、热销原因,以及美妆博主和…