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

embedded/2024/11/10 14:20:59/
  • 趋势分析:折线图
  • 静态比较:条形图
  • 分布分析:箱线图
  • 离散情况:散点图

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
from bokeh.models import ColumnDataSource
from bokeh.models import ColumnDataSource, DatetimeTickFormatter
import matplotlib.dates as mdates
from colorcet import fire
import plotly.express as px
import holoviews as hv
from holoviews.operation.datashader import datashadeclass PlotStrategy(ABC):# 抽象类:强制子类实现此方法@abstractmethoddef plot(self, x_data, y_data, desc):passclass 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')class  BigDataCSVPlotStrategy(PlotStrategy):def plot(self, x_data, y_data, desc):print('大数据量:Matplotlib + Downsampling')plt.clf()  # 清除当前图形内容# 假设 df 是包含股票数据的 DataFrame,且有 'Date' 和 'Close' 列df = pd.read_csv('stock_data.csv', parse_dates=['Date'], index_col='Date')# 确保日期列被正确解析df.index = pd.to_datetime(df.index, format='%Y/%m/%d %H:%M')# 对数据进行重采样,比如按日、周或月df_resampled = df['Close'].resample('D').mean()  # 按天重采样并取平均值# 对数据进行重采样,比如按日、周或月df_resampled1 = df['High'].resample('D').mean()  # 按天重采样并取平均值plt.figure(figsize=(10, 6))plt.plot(df_resampled.index, df_resampled.values)plt.plot(df_resampled1.index, df_resampled1.values)# 设置横轴日期格式plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=1))  # 按天显示刻度# 自动格式化日期标签以避免重叠plt.gcf().autofmt_xdate()plt.xlabel('Date')plt.ylabel('Close Price')plt.title('Stock Close Price Over Time')# plt.show()plt.savefig('./BigDataCSV_plt.png')class BigDataDatashaderPlotStrategy(PlotStrategy):def plot(self, x_data, y_data, desc):print('大数据量:Datashader')class BigDataPlotlyPlotStrategy(PlotStrategy):def plot(self, x_data, y_data, desc):print('大数据量:Plotly')# 读取 CSV 文件并解析日期df = pd.read_csv('stock_data.csv', parse_dates=['Date'])# 假设 df 是包含股票数据的 DataFramefig = px.line(df, x='Date', y=['Close','High'], title='Stock Close and High Price Over Time')# fig.show()fig.write_html('./BigDataplotly.html')class BigDataBokehPlotStrategy(PlotStrategy):def plot(self, x_data, y_data, desc):print('大数据量:Bokeh')# 读取 CSV 文件并解析日期df = pd.read_csv('stock_data.csv')# 创建 Bokeh 的数据源 ColumnDataSourcesource = ColumnDataSource(df)# 创建 Bokeh 图表对象 figure,并设置图表属性p = figure(title='Stock Prices', x_axis_label='Time', y_axis_label='Price')# 在图表上添加绘图元素(折线图)p.line(x='Date', y='Close', source=source, legend_label='Close', line_width=2, color='blue')p.line(x='Date', y='High', source=source, legend_label='High', line_width=2, color='red')# 添加图例位置p.legend.location = "top_left"# 显示图表output_file("BigDatabokeh.html") # 不显示折现,显示label# show(p)class BigDataHoloviewsPlotStrategy(PlotStrategy):def plot(self, x_data, y_data, desc):print('大数据量:Holoviews')# 读取 CSV 文件并解析日期df = pd.read_csv('stock_data.csv')# 将日期时间字符串转换为 datetime 对象df['Date'] = pd.to_datetime(df['Date'])hv.extension('bokeh')# 假设 df 是包含股票数据的 DataFramecurve = hv.Curve(df, 'Date',  ['Close', 'High'])shaded = datashade(curve)hv.save(shaded, 'BigDataHoloviews.html')# Context类持有PlotStrategy的引用。可以通过set_strategy方法动态地更改策略
class Context:def __int__(self, strategy: PlotStrategy):# _ 开头的变量,表示这是一个受保护的变量# 该变量只在类内部及其子类中使用,而不应在类外部直接访问self._strategy = strategydef set_strategy(self, strategy: PlotStrategy):self._strategy = strategydef 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)context.set_strategy(BigDataCSVPlotStrategy())
context.execute_strategy(x, y, desc)# context.set_strategy(BigDataDatashaderPlotStrategy())
# context.execute_strategy(x, y, desc)context.set_strategy(BigDataPlotlyPlotStrategy())
context.execute_strategy(x, y, desc)# context.set_strategy(BigDataBokehPlotStrategy())
# context.execute_strategy(x, y, desc)context.set_strategy(BigDataHoloviewsPlotStrategy())
context.execute_strategy(x, y, desc)

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

 


http://www.ppmy.cn/embedded/53978.html

相关文章

【系统架构设计师】计算机组成与体系结构 ③ ( 层次化存储结构 | 寄存器 | 高速缓存 | 内存 | 外存 )

文章目录 一、层次化存储结构1、层次化存储结构2、层次化存储结构 - 示例说明3、程序员可操作的部分 计算机 采用 分级存储结构 , 主要目的是 为了 解决 容量 / 价格 / 速度 之间的矛盾 ; 一、层次化存储结构 1、层次化存储结构 计算机 存储器 按照存储速度 由快到慢 进行排序 …

零基础入门办公软件速成学习 沈阳电脑办公软件培训

专业指导:由专业的培训师或讲师提供指导,确保员工能够全面、系统地学习软件的各种功能和技巧。 定制课程:根据公司需求和员工现有水平定制课程内容,确保培训的针对性和实用性。 互动学习:通过实时演示、练习和答疑环节…

什么是torchrun?

torchrun 是 PyTorch 用于分布式训练的命令行工具,旨在简化启动和管理分布式训练任务的过程。下面我将详细讲解 torchrun 的使用方法,并讨论它与分布式数据并行(Distributed Data Parallel, DDP)的区别。 一、torchrun的使用方法…

个人网站搭建-步骤(持续更新)

域名申请 域名备案 域名解析 服务器购买 端口转发 Nginx要在Linux上配置Nginx进行接口转发,您可以按照以下步骤进行操作: 安装Nginx(如果尚未安装): 使用包管理工具(如apt, yum, dnf, 或zypper&#x…

IOS Swift 从入门到精通:从 JSON 文件加载数据

文章目录 常见问题解答数据模型JSON 数据验证 JSON解码 JSON编写 FAQRow 代码添加状态栏背景模糊将内容添加到 FAQView常见问题解答数据模型 此 FAQ 模型符合Decodable,因为我们需要将 JSON 数据解码为 SwiftUI 数据。它还将符合 Identifiable ,因此我们稍后可以在 ForEach …

说一说ABAP CDS View的发展历史与特性

1. 背景 随着SAP Fiori应用程序的兴起,SAP领域的小伙伴接触和使用ABAP CDS View的机会也是越来越多。今天,让我们花些时间,一起在了解下这项技术的设计初衷和发展历史。 2. 设计初衷 说起ABAP CDS View,就不得不提及SAP HANA。…

【LeetCode面试经典150题】117. 填充每个节点的下一个右侧节点指针 II

一、题目 117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode) 给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个…

使用 Reqable 在 MuMu 模拟器进行App抓包(https)

1、为什么要抓包? 用开发手机应用时,查看接口数据不能像在浏览器中可以直接通过network查看,只能借助抓包工具来抓包,还有一些线上应用我们也只能通过抓包来排查具体的问题。 2、抓包工具 实现抓包,需要一个抓包工具…