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
繁體地址,請注明出處:http://hk.pswp.cn/web/80889.shtml
英文地址,請注明出處:http://en.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、新建一個…