使用Python自动生成图文并茂的网页分析报告
在数据分析中,不管是市场研究还是科学分析,经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件,这种方式不便之处是不方便跟动态文字段落结合在一起,也不方便分享。特别是我们需要使用Python定时自动生成数据分析报告并通过网络发布时,如果使用Flask等网络框架,技术门槛比较高,实现复杂。本文探讨使用一种非常直接简单的方法来使用Python不依赖其他网络库直接生成图文并茂的网页文件,这种方法可以广泛应用到数据分析里。
思路和实现步骤
先利用 matplotlib 库绘制精美的数据图表,对数据进行直观呈现,接着将生成的图表保存为图片,再使用html代码模版以文本形式调用图片路径,然后将生成的HTML代码通过Python的文件读写功能以文本的形式保存为文件,文件格式设置为html。最后自动打开默认浏览器打开这个刚生成的html文件,这样Python程序运行完就马上看到了生成的图文并茂的html数据分析报告了。。
这个Python程序的主要功能是生成一个包含数据可视化图表和特定HTML内容的网页,并自动在默认浏览器中打开该网页。以下是对程序的详细总结:
1. 数据可视化部分
- 导入必要的库:导入了
pylab
、webbrowser
、matplotlib.pyplot
,其中matplotlib.pyplot
用于绘制图表,webbrowser
用于在浏览器中打开网页。 - 设置图表参数:
- 设置图片的像素、分辨率和图表的尺寸。
- 解决中文显示问题,指定默认字体为
SimHei
,并解决负号显示为方块的问题。
- 定义数据:定义了两个数据列表
y
和y2
,以及对应的x
轴标签列表。 - 绘制图表:
- 设置图表的标题、
x
轴和y
轴的标签。 - 使用
plt.plot()
函数绘制两条折线图,分别标记为Y
和Y2
,并设置了线条的颜色、标记样式等。 - 使用
legend()
函数显示图例。 - 将
x
轴标签倾斜45度。 - 在每个数据点上添加数字标签。
- 在指定位置添加文本说明。
- 反转
y
轴。 - 将生成的图表保存为
1.jpg
文件,并显示图表,最后关闭图表窗口。
- 设置图表的标题、
2. HTML文件生成部分
- 创建HTML文件:创建两个HTML文件
test.html
和test2.html
(这是为了测试对比,实际只需要生成1个文件)。 - 写入HTML内容:
- 在
test2.html
中写入包含标题的HTML内容。 - 在
test.html
中写入包含图片链接和自定义HTML内容的消息,其中图片链接指向之前生成的1.jpg
文件。
- 在
- 关闭文件:关闭两个HTML文件。
3. 浏览器打开部分
- 使用
webbrowser.open()
函数在默认浏览器中打开test.html
文件。
综上所述,该程序的主要目的是将数据可视化图表和特定的HTML内容整合到一个网页中,并自动在浏览器中展示。
最后上完整代码:
# coding:utf-8
"""
此 Python 代码具备强大的功能,能将数据可视化与网页生成巧妙结合。它先利用 matplotlib 库绘制精美的折线图,对数据进行直观呈现,解决了中文显示、负号显示等细节问题。接着将生成的图表保存为图片,再自动创建 HTML 文件,把图表和预设的 HTML 内容整合到网页中,最后自动在默认浏览器中打开网页,实现数据的可视化展示与传播。
适用人群
适合数据分析师、营销人员、学生等人群。数据分析师可用其直观展示数据分析结果;营销人员能借此展示销售数据、市场趋势等;学生则可用于课程作业、项目展示等。
yl,2024年
"""
from pylab import *
import webbrowser #浏览器控制库,如果仅仅是生成html文件可以不用
import matplotlib.pyplot as pltstr='查看=[21-1-10 - 21-1-16]'#figsize(12.5, 4) # 设置 figsize
plt.rcParams['savefig.dpi'] = 300 #图片像素
plt.rcParams['figure.dpi'] = 200 #分辨率
# 默认的像素:[6.0,4.0],分辨率为100,图片尺寸为 600&400
# 指定dpi=200,图片尺寸为 1200*800
# 指定dpi=300,图片尺寸为 1800*1200
# 设置figsize可以在不改变分辨率情况下改变比例
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.rcParams['figure.figsize'] = (10.0, 6.0) # 设置figure_size尺寸
font_label = {'family':'SimHei',
'weight' : 'normal',
'size' : 20,
}
y=[1,23,19,2300,3,5,12,2300,19,23,3,500,12]
y2=[2,24,23,3,9,110,13,23,1300,26,3,9,10000]
x=['2021-02-22','2021-03-22','2021-04-22','c','d','e','f','O','j','feb','jan','mar','oct']
plt.title('Keyword Ranking销售排名',fontdict={'size':20},loc='center')
plt.xlabel('X轴',fontdict=font_label)
plt.ylabel('Y轴',fontdict=font_label)
plt.plot(x,y,linewidth=3,color='r',marker='D',markerfacecolor='yellow', markersize=5,linestyle='-',label='Y') #标记线为红色r,标点为大菱形D,风格为虚线
plt.plot(x,y2,color='b',marker='p',linestyle='-',label='Y2')
legend(loc='best',title='Name') #在plot()函数中增加一个参数label,再通过legend()函数显示图例
plt.xticks(rotation=45) #X横坐标倾斜60度
#plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) #将说明图表放置在图表外# 设置数字标签
for a, b in zip(x, y):plt.text(a, b, b, ha='center', va='top', fontsize=10) #fontsize,style,ha,va参数分别是字号,字体,垂直对齐方式,水平对齐方式
for a, b in zip(x, y2):plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
plt.text(5,500,'相关系数:\n增长幅度:',ha='center', va='top', fontsize=10,color='b') #前面2个参数为x,y对应坐标值ax = plt.gca()
ax.invert_yaxis() #y轴反向
plt.savefig('1.jpg',dpi=100)
#plt.show()
plt.close()# 命名生成的html
GEN_HTML = "test.html"
htmlfile2="test2.html"
# 打开文件,准备写入
f = open(GEN_HTML, 'w',encoding='UTF-8')
f2=open(htmlfile2,'w',encoding='UTF-8')
title="这是产品标题"
body="<p><h1>标题</h1></p>"
html="""
<html><head><title>%s</title></head><body>%s</body
</html>
"""%(title,body)
f2.write(html)
f2.close()
print(f"成功了")
# 准备相关变量
str1 = """
<h1>这是标题</h1>
<a class="a-link-normal s-no-outline" href="/gp/slredirect/picassoRedirect.html/ref=pa_sp_atf_aps_sr_pg1_1?ie=UTF8&adId=A07267723HYUM7A1IS3F4&url=%2FNew-Star-Foodservice-Commercial-Suction%2Fdp%2FB00DVXLML4%2Fref%3Dsr_1_1_sspa%3Fcrid%3D3D71DEYXHO6JB%26dchild%3D1%26keywords%3Dfrench%2Bfry%2Bcutter%26qid%3D1614913550%26sprefix%3Dfrench%2B%252Caps%252C470%26sr%3D8-1-spons%26psc%3D1&qualifier=1614913550&id=5497147329523695&widgetName=sp_atf">
<div class="a-section aok-relative s-image-square-aspect">
<img src="https://m.media-amazon.com/images/I/81OLbMS+cHL._AC_UL320_.jpg" class="s-image" alt="Sponsored Ad - New Star Food Service 42313 Commercial Restaurant French Fry Cutter with Suction Feet, 1/2-Inch" srcset="https://m.media-amazon.com/images/I/81OLbMS+cHL._AC_UL320_.jpg 1x, https://m.media-amazon.com/images/I/81OLbMS+cHL._AC_UL480_FMwebp_QL65_.jpg 1.5x, https://m.media-amazon.com/images/I/81OLbMS+cHL._AC_UL640_FMwebp_QL65_.jpg 2x, https://m.media-amazon.com/images/I/81OLbMS+cHL._AC_UL800_FMwebp_QL65_.jpg 2.5x, https://m.media-amazon.com/images/I/81OLbMS+cHL._AC_UL960_FMwebp_QL65_.jpg 3x" data-image-index="2" data-image-load="" data-image-latency="s-product-image" data-image-source-density="1">
</div>
</a>"""str2 = r'''
<img <img alt="测试图" src="1.jpg"><b>加粗</b>
<div><div><ul><li font="50"> <h1>评论与销售分析</h1></li><li> 评分数相关分析</li></ul><div><table><tr><td> table </td><td bgcolor="#0fff90"> table2 </td></tr></table></div></div
</div>
'''# 写入HTML界面中
message = """
<html>
<head></head>
<body>
<p>%s</p>
<p>%s</p>
</body>
</html>
""" % (str1, str2)# 写入文件
f.write(message)
# 关闭文件
f.close()# 自动调用网络浏览器打开刚才生成的网页文件
webbrowser.open(GEN_HTML, new=0)
相关文章:
使用Python自动生成图文并茂的网页分析报告
在数据分析中,不管是市场研究还是科学分析,经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件,这种方式不便之处是不方便跟动态文字段落结合在一起,也不方便分…...

uniapp-原生android插件开发摘要
uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语言编写,从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…...

GIT工具学习【1】:基本操作
目录 0.本地代码分区1.配置自己的个人信息(设置一次即可)2.新建仓库3.提交代码到暂存区(加入购物车)4.从暂存区撤回(不会改变工作区文件)5.恢复指定版本(会改变工作区文件)5.1&#…...
《国密算法开发实战:从合规落地到性能优化》
前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…...

【语法】C++中string类中的两个问题及解答
贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中,调用的是这个string对象的容量(可以存多少个有效字符),而size()是调用的string对象现在有…...
LeetCode-154. 寻找旋转排序数组中的最小值 II
1、题目描述: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,…...
2.数据结构:1.Tire 字符串统计
1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层,每一层至多 26 个节点(字母) int cnt[N];//字符串至多 N 个ÿ…...
C语言复习4:有关数组的基础常见算法
# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法(顾名思义,就是把没有顺序的…...
Ubuntu从零创建Hadoop集群
目录 前言 前提准备 1.设置网关和网段 2.查看虚拟机IP及检查网络 3.Ubuntu相关配置 镜像源配置 下载 vim编辑器 4.设置静态IP和SSH免密(可选) 设置静态IP SSH免密 5.JDK环境部署 6.Hadoop环境部署 7.配置 Hadoop 配置文件 HDFS集群规划 HDFS集群配置 1.配…...

GPIO概念
GPIO通用输入输出口 在芯片内部存在多个GPIO,每个GPIO用于管理多个芯片进行输入,输出工作 引脚电平 0v ~3.3v,部分引脚可容任5v 输出模式下可控制端口输出高低电平,可以驱动LED,控制蜂鸣器,模拟通信协议&a…...
Node.js, Bun, Deno 比较概述
以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl(Node.js 原作者)Jarred Sumner运行时引擎V8(Chrome)V8(Chrome)JavaScriptCore&#…...

C# 类库打包dll文件
目录 前言操作流程注意事项 前言 在C#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中,选择“创建新项目”。 选…...

Linux中的UDP编程接口基本使用
UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式,有了这些理论基础之后,下面先从UDP编程开始从操作部分深入网络 在本篇中,主要考虑下面的内容: 创建并封装服务端:了解创建服务端的…...

RAG项目实战:金融问答系统
需求痛点 私有知识很多,如何让大模型只选择跟问题有关的知识进行参考呢? 需求分析 是否可以使用关键词匹配呢?以前的搜索主要使用关键词匹配,这个要求太高了,需要提前抽取准备好关键词,有点像以前SEO的工…...
大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化
假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解,接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化,以下是详细介绍及代码示例: 1. React 高级特性的深入学习 1.1 React 并发模式(Con…...
虚拟机Linux操作(持续更新ing)
虚拟机操作(持续更新ing) 虚拟机基本操作(Linux) # Linux # 立刻关机 poweroff # 立刻关机,可以选择数字或者具体时间 shutdown -h now # 立刻重启,可以选择数字或者具体时间 shutdown -r now # 立刻重启 reboot # cd 切换目录,下面用根目录举例 cd /…...
【开源-线程池(Thread Pool)项目对比】
一些实现**线程池(Thread Pool)**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用,代码简洁;适合快速原型开发。功能较为基础,不支持动态调整线程数…...
JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)
JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式) 一、项目背景 在软件测试过程中,使用 JMeter 进行性能测试和功能测试是常见的操作。本实战项目将详细介绍如何使用 JMeter 自带工具以及 BadBoy 进行脚本录制,并完善脚本以…...
Jackson注解实战:@JsonInclude的妙用
在日常的Java开发中,我们经常需要将Java对象序列化为JSON格式,以便进行数据传输或存储。然而,有时候我们并不希望在JSON中包含某些空值或不必要的字段,这不仅会增加数据的冗余性,还可能对后续的处理造成困扰。Jackson库…...

CAN总线通信协议学习1——物理层
首先来看看CAN是怎么产生的:简单理解,CAN就是一种“拥有特别连接方式”的数据传输的总线,其有特定的一些规则。 (注:资料及图片来源于知乎博主TOMOCAT。) CAN总线的结构 查阅参考文献,OSI标准…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...