python-数据可视化(大数据、数据分析、可视化图像、HTML页面)

通过 Python 读取 XLS 、CSV文件中的数据,对数据进行处理,然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据,matplotlib 生成图表,并将图表嵌入到 HTML 页面中。

 1.XSL文件生成可视化图像、生成html页面

此代码根据DATA1.xls文件将数据经过panda库处理后,由matplotlib生成柱形图、折线图、扇形图,并且将图片嵌入HTML页面,让数据更加清晰。

matplotlib1.py

# coding=utf-8
import pandas as pd
import matplotlib.pyplot as plt
import os
from datetime import datetimeimport xlrd
import xlwt
from openpyxl import load_workbook# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题def read_excel_data(file_path):"""读取 Excel 文件数据"""try:df = pd.read_excel(file_path)print(f"成功读取文件: {file_path}")print(f"数据包含 {df.shape[0]} 行,{df.shape[1]} 列")print(f"列名: {', '.join(df.columns.tolist())}")return dfexcept Exception as e:print(f"读取 Excel 文件出错: {e}")return Nonedef generate_bar_chart(data, x_col, y_col, output_path):"""生成柱状图"""plt.figure(figsize=(10, 6))plt.bar(data[x_col], data[y_col])plt.title(f"{y_col} 分布柱状图")plt.xlabel(x_col)plt.ylabel(y_col)plt.xticks(rotation=45)plt.tight_layout()plt.savefig(output_path)plt.close()def generate_pie_chart(data, category_col, value_col, output_path):"""生成扇形图"""plt.figure(figsize=(8, 8))plt.pie(data[value_col], labels=data[category_col], autopct='%1.1f%%', startangle=90)plt.title(f"{value_col} 分布扇形图")plt.tight_layout()plt.savefig(output_path)plt.close()def generate_line_chart(data, x_col, y_col, output_path):"""生成折线图"""plt.figure(figsize=(10, 6))plt.plot(data[x_col], data[y_col], marker='o')plt.title(f"{y_col} 趋势折线图")plt.xlabel(x_col)plt.ylabel(y_col)plt.xticks(rotation=45)plt.grid(True)plt.tight_layout()plt.savefig(output_path)plt.close()def generate_html_report(chart_paths, output_path):"""生成 HTML 报告"""timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")html_content = f"""<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>数据可视化报告</title><style>body {{ font-family: Arial, sans-serif; margin: 20px; }}h1, h2 {{ color: #333; }}.chart-container {{ margin-bottom: 40px; }}img {{ max-width: 100%; height: auto; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }}.timestamp {{ color: #666; font-size: 0.9em; }}</style></head><body><h1>数据可视化报告</h1><p class="timestamp">生成时间: {timestamp}</p>{''.join([f'<div class="chart-container"><h2>{title}</h2><img src="{title}.png" alt="{title}"></div>'for title, path in chart_paths.items()])}<footer><p>© 2023 数据可视化工具</p></footer></body></html>"""with open(output_path, 'w', encoding='utf-8') as f:f.write(html_content)def main():# 文件路径设置xls_file = 'C:/Users/IT14/Desktop/DATA1.xls'  # 请替换为实际的 XLS 文件路径output_html = 'data_visualization_report.html'# 读取数据df = read_excel_data(xls_file)if df is None or df.empty:print("无法读取数据或数据为空,程序退出。")return# 生成图表(根据实际数据结构调整列名)chart_data = {}# 示例:假设 XLS 文件包含以下列# - 产品名称# - 销售额# - 销量# - 日期# 检查列是否存在required_columns = ['产品名称', '销售额', '销量', '日期']missing_columns = [col for col in required_columns if col not in df.columns]if missing_columns:print(f"错误:数据中缺少以下列: {', '.join(missing_columns)}")print(f"可用列: {', '.join(df.columns.tolist())}")print("请根据实际数据结构修改代码中的列名。")return# 生成柱状图(销售额分布)chart_data['产品销售额分布柱状图'] = generate_bar_chart(df, '产品名称', '销售额', '产品销售额分布柱状图')# 生成扇形图(销量占比)chart_data['产品销量占比扇形图'] = generate_pie_chart(df, '产品名称', '销量', '产品销量占比扇形图')# 生成折线图(销售额趋势)chart_data['销售额趋势折线图'] = generate_line_chart(df, '日期', '销售额', '销售额趋势折线图')# 生成 HTML 报告generate_html_report(chart_data, output_html)print("报告生成完成,请在浏览器中打开 HTML 文件查看。")if __name__ == "__main__":main()

2. CSV文件生成可视化图像

2.1 matplotblib-折线图

此代码根据sitka_weather_2018_simple.csv文件广州气温数据和日期生成一个折线图

matplotlib-折线图.py

import csv
from datetime import datetimeimport matplotlib
import matplotlib.pyplot as plt# 设置中文字体
matplotlib.rc("font",family='MicroSoft YaHei',weight="bold")# 1.读取scv文件
filename = 'C:/Users/IT14/Desktop/sitka_weather_2018_simple.csv'# 1.1.创建阅读器
with open(filename) as filename_list:# 1.2.创建阅读器csv.reader()reader = csv.reader(filename_list);# 1.3.获取表头header_name = next(reader)# 2.打印数据for index,column_value in enumerate(header_name):print(index,column_value)# 3.获取数据TMAX ,TDATE,TMIN= [],[],[]for max in reader:TMAX.append(int(max[5]))TDATE.append(datetime.strptime(max[2],'%Y-%m-%d'))TMIN.append(int(max[6]))print(TMAX)# 4.绘图-折线图
fig = plt.figure(dpi=128,figsize=(8,6))
plt1=plt.plot(TDATE,TMAX,c='red',label='最高气温')
plt2=plt.plot(TDATE,TMIN,c='blue',label='最低气温')
for a,b in zip(TDATE,TMAX):plt.text(a,b+1,b)
for a,b in zip(TDATE,TMIN):plt.text(a,b-2,b)
plt.fill_between(TDATE,TMAX,TMIN,facecolor='blue',alpha=0.1)
fig.autofmt_xdate()
# 5.设置格式
plt.title("2018年广州气温数据",fontsize=24)
plt.xlabel('年-月-日',fontsize=16)
plt.ylabel('气温(度)',fontsize=16)
plt.tick_params(axis='both',labelsize=16)
plt.legend()
plt.savefig('气温折线图.png')
plt.show()

2.2 matplotblib-柱形图

此代码根据sitka_weather_2018_simple.csv文件最大销售量、最低销售量和日期生成一个柱形图。

matplotlib-柱形图.py


import pandas as pd# 读取数据,填写文件路径,配置
data = pd.read_csv('C:/Users/IT14/Desktop/sitka_weather_2018_simple.csv',encoding="ANSI",usecols=['DATE','TMAX','TMIN'])# 取消最大显示行数和列数限制
pd.options.display.max_columns=None
pd.options.display.max_rows=None# 选择行
data_1 = data.head(2)
print(data_1)# 查看数据尺寸
print(data.shape)
# 查看数据数量
print(data.size)
# 查看字段类型
print(data.dtypes)
# 查看数据信息
# print(data.info)
# 数据描述:只统计数值型数据
print(data.describe())
# 获取单个字段取值数目,normalize=True表示显示占比
# print(data['TMAX'].value_counts())# cut函数
# print(pd.cut(range(10),bins=[0,10,20,30,40,50,60,70,80,90,100],right=True))
bins=[10,20,30,40,50,60,70,80,90,100,110]boxes,lables = pd.cut(data['TMAX'],bins=bins,right=True,retbins=True,include_lowest=True)
print(lables)
print(boxes.value_counts().sort_index().values)# 正常函数
data['DATE'] = pd.to_datetime(data['DATE'])
data = data.set_index('DATE')
print(data.head(4))
data = data.resample('ME').sum().to_period('M')
print(data.head(2))
print(data.dtypes)
print(str(data.index[0]))
sss = []
for index,dt in enumerate(data.index):sss.append(dt)
TMAX,TMIN = [],[]
for dt in enumerate(data['TMAX']):TMAX.append(int(dt[1]))
for dt in enumerate(data['TMIN']):TMIN.append(int(dt[1]))
print(sss,TMAX,TMIN)# 绘制柱形图
import matplotlib
import matplotlib.pyplot as pltmatplotlib.rc('font',family='MicroSoft YaHei',weight='bold')
# 设置画布大小
pl = plt.figure(figsize=(15,8))
#设置x,y轴
plt.ylabel('2018年销售量',fontsize=22)
plt.xlabel('月份',fontsize=22)
# 柱形图bar
plt.xticks(range(0,len(sss)),sss)
#设置两个柱形
plt1=plt.bar(range(0,len(sss)),TMAX,label='最高销售额',width=0.4)
plt2=plt.bar([i+0.4 for i in range(0,len(sss))],TMIN,label='最低销售额',width=0.4)
# 设置坐标
# for y in TMAX,TMIN:
#     for a,b in zip(range(0,len(sss)),y):
#         if y == TMIN:
#             a+=0.4
#         plt.text(a,b+2,b,ha='center')
plt.bar_label(plt1,label_type='edge')
plt.bar_label(plt2,label_type='edge')
pl.autofmt_xdate()
plt.legend()
#保存文件为图片
plt.savefig('销售额.png')
#在python编辑器打开图片
plt.show()
plt.close()

2.3 matplotblib-扇形图

此代码根据sales_data.csv文件最大销售量、最低销售量和日期生成一个扇形图图。

matplotlib-扇形图.py


import csv
import matplotlib.pyplot as plt# 设置中文字体,确保中文正常显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题def read_csv_data(file_path, category_col, value_col):"""从 CSV 文件读取数据参数:file_path (str): CSV 文件路径category_col (int): 分类列的索引(从0开始)value_col (int): 数值列的索引(从0开始)返回:tuple: 包含分类列表和对应数值列表的元组"""categories = []values = []with open(file_path, 'r', encoding='gb18030') as file:reader = csv.reader(file)next(reader)  # 跳过表头for row in reader:if len(row) > max(category_col, value_col):categories.append(row[category_col])values.append(float(row[value_col]))return categories, valuesdef generate_pie_chart(categories, values, title, output_path=None):"""生成扇形图参数:categories (list): 分类列表values (list): 对应数值列表title (str): 图表标题output_path (str, optional): 保存图片的路径,若为None则显示图表"""# 创建画布plt.figure(figsize=(10, 8))# 计算百分比总和,确保总和为100%total = sum(values)percentages = [v / total * 100 for v in values]# 找出最大占比的项,用于突出显示explode = [0.1 if p == max(percentages) else 0 for p in percentages]# 自定义颜色colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#c2c2f0', '#ffb3e6']# 绘制扇形图plt.pie(values,explode=explode,labels=categories,colors=colors[:len(categories)],autopct='%1.1f%%',  # 显示百分比,保留一位小数shadow=True,  # 添加阴影startangle=90  # 起始角度)# 设置为正圆形plt.axis('equal')# 添加标题plt.title(title, fontsize=16)# 添加图例plt.legend(categories, loc="best")# 如果指定了输出路径,则保存图片;否则显示图片if output_path:plt.savefig(output_path, dpi=300, bbox_inches='tight')print(f"图表已保存至: {output_path}")else:plt.show()def main():# CSV 文件路径(请替换为实际文件路径)csv_file = 'C:/Users/IT14/Desktop/sales_data.csv'# 配置参数category_column = 0  # 分类列索引(假设第一列是分类)value_column = 1  # 数值列索引(假设第二列是数值)chart_title = '销售数据分布扇形图'# 读取数据categories, values = read_csv_data(csv_file, category_column, value_column)if not categories or not values:print("没有足够的数据来生成图表")return# 生成并显示/保存图表generate_pie_chart(categories, values, chart_title, output_path='sales_pie_chart.png')if __name__ == "__main__":main()

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

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

相关文章

黑马点评相关知识总结

黑马点评的项目总结 主要就黑马点评项目里面的一些比较重要部分的一次总结&#xff0c;方便以后做复习。 基于Session实现短信登录 短信验证码登录 这部分使用常规的session来存储用户的登录状态&#xff0c;其中短信发送采取逻辑形式&#xff0c;并不配置云服务验证码功能。…

手搓四人麻将程序

一、麻将牌的表示 在麻将游戏中&#xff0c;总共有一百四十四张牌&#xff0c;这些牌被分为多个类别&#xff0c;每个类别又包含了不同的牌型。具体来说&#xff0c;麻将牌主要包括序数牌、字牌和花牌三大类。序数牌中&#xff0c;包含有万子、条子和筒子&#xff0c;每种花色…

【Java高阶面经:数据库篇】17、分库分表分页查询优化:告别慢查询与内存爆炸

一、分库分表基础&#xff1a;策略与中间件形态 1.1 分库分表核心策略 分库分表是应对海量数据存储和高并发访问的关键架构设计&#xff0c;其核心在于将数据分散到不同的数据库或表中&#xff0c;以突破单库单表的性能限制。常见的分库分表策略包括&#xff1a; 1.1.1 哈希…

贪心算法之跳跃游戏问题

问题背景 本文背景是leetcode的一道经典题目&#xff1a;跳跃游戏&#xff0c;描述如下&#xff1a; 给定一个非负整数数组 nums&#xff0c;初始位于数组的第一个位置&#xff08;下标0&#xff09;。数组中的每个元素表示在该位置可以跳跃的最大长度。判断是否能够到达最后…

Label Studio:开源标注神器

目录 一、Label Studio 是什么&#xff1f; 二、核心功能大揭秘 2.1 多类型数据全兼容 2.2 个性化定制随心配 2.3 团队协作超给力 2.4 机器学习巧集成 三、上手实操超简单 3.1 安装部署不头疼 3.1.1 Docker安装 3.1.2 pip安装 3.1.3 Anaconda安装 3.2 快速开启标注…

创建信任所有证书的HttpClient:Java 实现 HTTPS 接口调用,等效于curl -k

在 Java 生态中&#xff0c;HttpClient 和 Feign 都是调用第三方接口的常用工具&#xff0c;但它们的定位、设计理念和使用场景有显著差异。以下是详细对比&#xff1a; DIFF1. 定位与抽象层级 特性HttpClientFeign层级底层 HTTP 客户端库&#xff08;处理原始请求/响应&#…

从零基础到最佳实践:Vue.js 系列(7/10):《常用内置 API 与插件》

引言 Vue.js 是一款轻量且强大的前端框架&#xff0c;因其易用性和灵活性受到广泛欢迎。无论是初学者还是资深开发者&#xff0c;都可以通过其内置 API 和插件生态快速构建高效、可维护的 Web 应用。本文将从基础用法讲起&#xff0c;逐步深入到进阶技巧&#xff0c;结合大量实…

线性代数:AI大模型的数学基石

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

Java-System工具类深度解析

Java-System工具类深度解析 前言一、System 类概述1.1 基本定义与特点1.2 重要成员变量 二、标准输入输出功能2.1 标准输入&#xff08;System.in&#xff09;2.2 标准输出&#xff08;System.out&#xff09;2.3 标准错误输出&#xff08;System.err&#xff09; 三、系统属性…

删除用户凭证

Git 部分仓库无法操作&#xff0c;部分仓库没问题 问题出现 我用个人电脑修改了项目&#xff0c;提交了git。然后第二天在公司电脑git pull的时候失败&#xff0c;只有部分仓库&#xff0c;git colne直接失败&#xff0c;部分仓库无问题。 解决方式 删除git相关凭证&#xff…

19. 结合Selenium和YAML对页面实例化PO对象改造

19. 结合Selenium和YAML对页面实例化PO对象改造 一、架构升级核心思路 1.1 改造核心目标 # 原始PO模式&#xff1a;显式定义元素定位 username (id, ctl00_MainContent_username)# 改造后PO模式&#xff1a;动态属性访问 self.username.send_keys(Tester) # 自动触发元素定…

鸿蒙App开发学习路径

以下是一份系统的鸿蒙&#xff08;HarmonyOS&#xff09;App开发学习路径&#xff0c;适合从零开始逐步掌握相关技能&#xff1a; 1. 基础知识储备 1.1 理解鸿蒙系统 鸿蒙核心特性&#xff1a;分布式能力、一次开发多端部署、原子化服务、ArkUI框架。与Android/iOS的区别&…

spring boot启动报错:2002 - Can‘t connect to server on ‘192.168.10.212‘ (10061)

错误代码 10061 通常表明无法建立到指定服务器的网络连接。这个错误属于 Windows Sockets 错误代码&#xff0c;具体指的是无法建立网络连接&#xff0c;通常是因为目标地址不可达。以下是一些解决此问题的步骤&#xff1a; 检查 IP 地址和端口&#xff1a; 确保你输入的 IP …

ARMv7的NVIC中断优先级

1. 优先级模型 数值规则:数值越小,优先级越高(例如优先级0的异常比优先级1的异常更高);若多个异常的优先级相同,则 异常号(Exception Number) 较小的异常优先执行。固定优先级异常(不可配置):异常类型 优先级值 说明 Reset -3 最高优先级(系统复位) NMI -2 不可屏…

gitee错误处理总结

背景 如上图&#xff0c;根据图片中的 Git 错误提示&#xff0c;我们遇到的问题是 ​本地分支落后于远程分支&#xff0c;导致 git push 被拒绝。 ​问题原因​ 远程仓库的 master 分支有其他人推送的新提交&#xff0c;而您的本地 master 分支未同步这些更新&#xff08;即本…

阿里云合集(不定期更新)

一、阿里云申请免费域名证书流程&#xff1a;https://blog.csdn.net/humors221/article/details/143266059 二、阿里云发送国内短信怎样编程&#xff1a;https://blog.csdn.net/humors221/article/details/139544193 三、阿里云ECS服务器磁盘空间不足的几个文件&#xff1a;h…

leetcode239 滑动窗口最大值deque方式

这段文字描述的是使用单调队列&#xff08;Monotonic Queue&#xff09; 解决滑动窗口最大值问题的优化算法。我来简单解释一下&#xff1a; 核心思路 问题分析&#xff1a;在滑动窗口中&#xff0c;若存在两个下标 i < j 且 nums[i] ≤ nums[j]&#xff0c;则 nums[i] 永远…

小白的进阶之路系列之三----人工智能从初步到精通pytorch计算机视觉详解下

我们将继续计算机视觉内容的讲解。 我们已经知道了计算机视觉,用在什么地方,如何用Pytorch来处理数据,设定一些基础的设置以及模型。下面,我们将要解释剩下的部分,包括以下内容: 主题内容Model 1 :加入非线性实验是机器学习的很大一部分,让我们尝试通过添加非线性层来…

elementUI 单选框存在多个互斥的选项中选择的场景

使用 el-radio-group 来使用单选框组&#xff0c;代码如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">业务对象</el-radio><…

Qt项目开发中所遇

讲述下面代码所表示的含义&#xff1a; QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一个名为widget_19的QWidget&#xff0c;将给其应用垂直管路布局。 2、新建一个…