Python基于Excel數(shù)據(jù)繪制多條曲線圖并動(dòng)態(tài)設(shè)置圖片長(zhǎng)度

??本文介紹基于Python語言,讀取Excel表格數(shù)據(jù),并基于給定的行數(shù)范圍內(nèi)的指定列數(shù)據(jù),繪制多條曲線圖,并動(dòng)態(tài)調(diào)整圖片長(zhǎng)度的方法。

??首先,我們來明確一下本文的需求?,F(xiàn)有一個(gè).csv格式的Excel表格文件,其第一列為表示時(shí)間的數(shù)據(jù),而靠后的幾列,也就是下圖中紫色區(qū)域內(nèi)的列,則是表示對(duì)應(yīng)日期的屬性的數(shù)據(jù);如下圖所示。

??其中,第一列是一個(gè)表示時(shí)間、循環(huán)增長(zhǎng)的列,其數(shù)值從2023001開始,到2023365結(jié)束,然后會(huì)繼續(xù)再從2023001開始,以此類推;并且每一個(gè)循環(huán)中,有些日期可能會(huì)缺失,即并不是每天都有數(shù)據(jù)的。

??我們現(xiàn)在希望,對(duì)于給定的行數(shù)起始值結(jié)束值(已知這個(gè)起始值與結(jié)束值對(duì)應(yīng)的第一列數(shù)據(jù),肯定是一個(gè)完整的時(shí)間循環(huán)),基于表格中后面帶有數(shù)據(jù)的幾列(也就是上圖中紫色區(qū)域內(nèi)的數(shù)據(jù)),繪制曲線圖;并且由于這幾列數(shù)據(jù)所表示的含義不同,希望用不同顏色、不同線型來表示每一列的數(shù)據(jù)。其中,我們希望具體繪制的結(jié)果如下圖所示。

??可以看到,橫坐標(biāo)就是表示時(shí)間的數(shù)據(jù),縱坐標(biāo)就是那幾列含有數(shù)據(jù)的列;此外,還需要注意,前面也提到了,時(shí)間數(shù)據(jù)是不斷循環(huán)的,而每一個(gè)循環(huán)中時(shí)間的數(shù)量是不確定的。因此,我們還希望繪制出來的圖片,可以根據(jù)循環(huán)中時(shí)間的數(shù)量(或者說是循環(huán)的長(zhǎng)度),來動(dòng)態(tài)調(diào)整其長(zhǎng)度

??明確了需求,即可開始撰寫代碼。本文所用代碼如下。

# -*- coding: utf-8 -*-

"""
Created on Wed May 15 10:34:17 2024

@author: fkxxgis
"""

import os
import pandas as pd
import matplotlib.pyplot as plt

csv_file = r"E:\04_Reconstruction\99_MODIS\Train_Model_0715_Main_Combine.csv"
pic_folder = r"E:\04_Reconstruction\99_MODIS\pic"
idx_start = 520351
idx_end = 520389

df = pd.read_csv(csv_file)
selected_data = df.iloc[idx_start : idx_end]

time = selected_data.iloc[:, 0]
time_x = range(len(time))

blue_pre = selected_data.iloc[:, 9]
blue_tru = selected_data.iloc[:, 10]
green_pre = selected_data.iloc[:, 11]
green_tru = selected_data.iloc[:, 12]
red_pre = selected_data.iloc[:, 13]
red_tru = selected_data.iloc[:, 14]
nir_pre = selected_data.iloc[:, 15]
nir_tru = selected_data.iloc[:, 16]
ndvi_pre = selected_data.iloc[:, 17]
ndvi_tru = selected_data.iloc[:, 18]

plt.figure(figsize = ((idx_end - idx_start) * 0.45, 5))

plt.plot(time_x, blue_pre, 'b-', label = "Blue Predict")
plt.plot(time_x, blue_tru, 'b--', label = "Blue Actual")
plt.plot(time_x, green_pre, '-', color = "lime", label = "Green Predict")
plt.plot(time_x, green_tru, '--', color = "lime", label = "Green Actual")
plt.plot(time_x, red_pre, 'r-', label = "Red Predict")
plt.plot(time_x, red_tru, 'r--', label = "Red Actual")
plt.plot(time_x, nir_pre, '-', color = "orange", label = "NIR Predict")
plt.plot(time_x, nir_tru, '--', color = "orange", label = "NIR Actual")
plt.plot(time_x, ndvi_pre, '-', color = "darkgreen", label = "NDVI Predict")
plt.plot(time_x, ndvi_tru, '--', color = "darkgreen", label = "NDVI Actual")

plt.rc("font", family = "Times New Roman")
plt.legend(ncol = 2)
plt.xticks(time_x, time, rotation = 45)

plt.savefig(os.path.join(pic_folder, str(idx_start) + "_" + str(idx_end)), dpi = 300, bbox_inches = "tight", pad_inches = 0.05)
plt.show()

??其中,我們首先導(dǎo)入必要的庫。os用于處理文件路徑,pandas用于讀取和處理表格文件數(shù)據(jù),matplotlib.pyplot用于繪制圖表。

??接下來,我們定義文件路徑和索引范圍。csv_file表示輸入.csv格式文件的路徑,pic_folder表示輸出圖片的文件路徑,idx_start表示數(shù)據(jù)的起始索引,idx_end表示數(shù)據(jù)的結(jié)束索引。

??接下來,我們讀取.csv格式文件并選擇指定范圍的數(shù)據(jù)。df = pd.read_csv(csv_file)表示讀取.csv格式文件并創(chuàng)建DataFrame,而后通過selected_data = df.iloc[idx_start : idx_end]選擇指定索引范圍的數(shù)據(jù),也就是處于指定行數(shù)內(nèi)的數(shù)據(jù);time就是第一列數(shù)據(jù),也就是一個(gè)循環(huán)內(nèi)的時(shí)間序列,time_x則用于顯示圖片的x軸刻度——之所以需要這個(gè),是因?yàn)槲疫@里希望用字符的形式來表示圖片中x軸的刻度(如果用數(shù)字的話,那么相當(dāng)于一年365天對(duì)應(yīng)的x軸長(zhǎng)度都是固定的365個(gè)刻度;而對(duì)于時(shí)相缺失比較多的循環(huán),這樣繪制出來的圖不好看)。隨后,分別提取本文開頭圖片中紫色框內(nèi)的數(shù)據(jù),其分別表示藍(lán)色、綠色、紅色、近紅外和NDVI的預(yù)測(cè)值和實(shí)際值。

??隨后,即可繪制曲線圖。首先,通過plt.figure(figsize = ((idx_end - idx_start) * 0.45, 5))動(dòng)態(tài)設(shè)置圖片尺寸,使用plt.plot()函數(shù)繪制每個(gè)指標(biāo)的預(yù)測(cè)值和實(shí)際值;同時(shí),設(shè)置圖例、x軸刻度旋轉(zhuǎn)等屬性,并保存圖片;最后,通過plt.show()顯示繪制的圖片。

??運(yùn)行上述代碼,即可獲得本文開頭第二幅圖所示的圖片結(jié)果。

??至此,大功告成。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容