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

  • 趋势分析:折线图
  • 静态比较:条形图
  • 分布分析:箱线图
  • 离散情况:散点图

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)


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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人机恋爱新趋势:与AI男友谈恋爱的甜蜜与挑战

"我曾经把ChatGPT当成工具,从未追过星,也没有嗑过CP。没想到,到了36岁,我竟然嗑上了AI男友。Open AI,你赢了。你不仅是最好的AI公司,还是乙女游戏公司。" 转行大龄互联网人,走遍20国…

Go 语言学习笔记之字典 Map

Go 语言中的字典 Map 大家好,我是码农先森。 概念 在 Go 语言中,字典被称为 map,它是一种无序的集合,用于存储键值对。每个键在 map 中必须是唯一的,并且对应一个值。map 是一种非常常用的数据结构,用于…

03-Shell编程之循环语句与函数

目录 3.1 for循环语句 3.1.1for语句的结构 3.1.2 for语句应用实例 3.2 使用whlie循环语句 1.打印数字1到5 3.3 使用until循环语句 3.3.1until的实例 1.打印数字1到5(使用until的逆向逻辑) 2.等待用户输入特定内容 3.4 函数 3.4.1Shell函数的基…

msvcp120.dll丢失怎么办,找不到msvcp120.dll的多种解决方法

最近,我在运行一个程序时遇到了一个错误,系统提示找不到msvcp120.dll文件,无法继续执行代码。这让我感到非常困扰,因为这个问题导致我无法正常运行这个程序。经过一番搜索和尝试,我找到了几种修复这个问题的方法&#…

Mysql索引底层数据结构——Java全栈知识(28)

Mysql索引底层数据结构 1、什么是索引 索引在项目中还是比较常见的,它是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本&…

【UEFI实战】HttpBoot

环境配置 首先下载tftpd工具,可以在phjounin / tftpd64 / Downloads — Bitbucket下载到,建议不要安装到C盘,因为可能无法修改其配置。配置tftpd工具的DHCP服务: 注意这里的IP地址需要跟实际网卡IP匹配。 下载Apache&#xff0c…

探秘神经网络激活函数:Sigmoid、Tanh和ReLU,解析非线性激活函数的神奇之处

引言 在神经网络中,激活函数扮演着至关重要的角色。它们赋予神经网络非线性的能力,使得网络具备学习和表示复杂函数关系的能力。本文将详细解析三种常见的激活函数:Sigmoid、Tanh和ReLU,揭开它们在神经网络中的奥秘。无论你是初学…

MOE学习笔记

MOE网络结构 和传统的 transformer 网络结构相比,我们将 Transformer 模型的每个 FFN 层替换为 MoE 层,MoE 层由门网络(Router)和一定数量的专家(Expert)组成。 这些 Expert 其实也是 FFN 层,…

光伏半导体的种类

光照射半导体材料时,其电导率发生变化的实质是光生载流子的产生。在半导体中,价带中的电子受到一定能量的光子激发后,可以跃迁到导带,形成自由电子和空穴对,即光生载流子。这些光生载流子会增加半导体的导电能力&#…

思考-生涯思考-GPT-5对人们的影响

GPT-5 一年半后发布?对此你有何期待? IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,…

MOC和MCS通讯流程分析

半导体行业-SECS/GEM协议 半导体设备通讯SECS协议是由国际半导体设备与材料协会(SEMI)的会员一起构建的连接性标准。它最初是为了在半导体/电子行业的自动化中实现设备与主机系统之间的通信而制定的。 SECS/GEM不仅允许客户查看设备的功能,…

使用 MongoDB 剖析开放银行:技术挑战和解决方案

开放银行(或开放金融)在银行业掀起了一股颠覆性浪潮,它迫使金融机构(银行、保险公司、金融科技公司、企业甚至政府机构)迎接一个透明、协作和创新的新时代。这种模式转变要求银行与第三方提供商(TPP&#x…

双 μC 的 PWM 频率和分辨率

该方法是过滤 PWM 信号的 HF 分量,只留下与占空比成正比的 LF 或 DC 分量。然而,低通滤波器并不能完全滤除PWM频率,因此LF/DC信号一般会有一些纹波。 有两种方法可以降低 PWM DAC 的纹波。可以降低低通滤波器的截止频率,或者提高…

编译原理大题自解(活前缀DFA、LR(0)分析表)

目录 4. (简答题) (1)给出识别活前缀的DFA (2)设计此文法的 LR(0)分析表 第一种解法 第二种解放 首先声明这是作者的写法(不保证正确!)仅供参考。本题因为可能存在冲突的原因,所…

SAPUI5基础知识9 - JSON Module与数据绑定

1. 背景 在前面的博客中,我们已经学习了SAPUI5中视图和控制器的使用,在本篇博客中,让我们学习下MVC架构中的M-模型了。 SAPUI5中的JSON Model是一个客户端模型,可以用于在SAPUI5应用程序中处理和操作JSON数据。SAPUI5提供了绑定…

爬虫笔记15——爬取网页数据并使用redis数据库set类型去重存入,以爬取芒果踢V为例

下载redis数据库 首先需要下载redis数据库,可以直接去Redis官网下载。或者可以看这里下载过程。 pycharm项目文件下载redis库 > pip install redis 然后在程序中连接redis服务: from redis import RedisredisObj Redis(host127.0.0.1, port6379)…

【D3.js in Action 3 精译】第一部分 D3.js 基础知识

第一部分 D3.js 基础知识 欢迎来到 D3.js 的世界!可能您已经迫不及待想要构建令人惊叹的数据可视化项目了。我们保证,这一目标很快就能达成!但首先,我们必须确保您已经掌握了 D3.js 的基础知识。这一部分提到的概念将会在您后续的…

【物联网】物联网操作系统简介

目录 一、物联网操作系统概述 1.1内存占用 1.2 内存管理 二、物联网操作系统构成 三、物联网操作系统关键特性 3.1 调度方式 3.2 I/O操作方式 3.3 网络服务 3.3.1 TinyOS网络协议栈 3.3.2 LiteOS网络协议栈 一、物联网操作系统概述 物联网操作系统是支撑物联网大规模…

倩女幽魂搬砖攻略:2024搬砖攻略大全!云手机强力辅助!

《倩女幽魂》手游是一款具有极高自由度和丰富玩法的角色扮演游戏。为了帮助玩家更好地了解并掌握游戏中的各种技巧和策略,本文将为大家提供详细的攻略指南。我们将从每日签到、任务升级、银两经营、必做活动和出金等多个方面详细介绍,帮助玩家轻松玩转游…

ONLYOFFICE 桌面编辑器 8.1重磅来袭:全新功能提升您的办公效率

文章目录 前言ONLYOFFICE 桌面编辑器8.1一、PDF编辑:告别“头痛”时刻二、幻灯片版式:秒变“设计大师”三、无缝切换:办公界的“快速通道”四、语言支持:全球通吃的“翻译官”五、 隐藏“连接到云”板块:摆脱“云”的束…