Python基于Excel多列长度不定的数据怎么绘制折线图?

简介: 本文档详述了如何运用Python从CSV格式的Excel文件中读取特定范围的数据,并基于这些数据绘制多条折线图。文件的第一列代表循环增长的时间序列,后续各列包含不同属性的数据。通过指定起始与结束行数,可选取一个完整的时间循环周期内的数据进行绘图。每列数据以不同颜色和线型表示,并且图片长度会根据时间序列的长度动态调整,确保图表清晰易读。最终生成的图表将保存至指定文件夹。

  本文介绍基于Python语言,读取Excel表格数据,并基于给定的行数范围内的指定列数据,绘制多条曲线图,并动态调整图片长度的方法。

  首先,我们来明确一下本文的需求。现有一个.csv格式的Excel表格文件,其第一列为表示时间的数据,而靠后的几列,也就是下图中紫色区域内的列,则是表示对应日期的属性的数据;如下图所示。

  其中,第一列是一个表示时间循环增长的列,其数值从2023001开始,到2023365结束,然后会继续再从2023001开始,以此类推;并且每一个循环中,有些日期可能会缺失,即并不是每天都有数据的。

  我们现在希望,对于给定的行数起始值结束值(已知这个起始值与结束值对应的第一列数据,肯定是一个完整的时间循环),基于表格中后面带有数据的几列(也就是上图中紫色区域内的数据),绘制曲线图;并且由于这几列数据所表示的含义不同,希望用不同颜色、不同线型来表示每一列的数据。其中,我们希望具体绘制的结果如下图所示。

  可以看到,横坐标就是表示时间的数据,纵坐标就是那几列含有数据的列;此外,还需要注意,前面也提到了,时间数据是不断循环的,而每一个循环中时间的数量是不确定的。因此,我们还希望绘制出来的图片,可以根据循环中时间的数量(或者说是循环的长度),来动态调整其长度

  明确了需求,即可开始撰写代码。本文所用代码如下。

python

代码解读

复制代码

# -*- 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()

  其中,我们首先导入必要的库。os用于处理文件路径,pandas用于读取和处理表格文件数据,matplotlib.pyplot用于绘制图表。

  接下来,我们定义文件路径和索引范围。csv_file表示输入.csv格式文件的路径,pic_folder表示输出图片的文件路径,idx_start表示数据的起始索引,idx_end表示数据的结束索引。

  接下来,我们读取.csv格式文件并选择指定范围的数据。df = pd.read_csv(csv_file)表示读取.csv格式文件并创建DataFrame,而后通过selected_data = df.iloc[idx_start : idx_end]选择指定索引范围的数据,也就是处于指定行数内的数据;time就是第一列数据,也就是一个循环内的时间序列,time_x则用于显示图片的x轴刻度——之所以需要这个,是因为我这里希望用字符的形式来表示图片中x轴的刻度(如果用数字的话,那么相当于一年365天对应的x轴长度都是固定的365个刻度;而对于时相缺失比较多的循环,这样绘制出来的图不好看)。随后,分别提取本文开头图片中紫色框内的数据,其分别表示蓝色、绿色、红色、近红外和NDVI的预测值和实际值。

  随后,即可绘制曲线图。首先,通过plt.figure(figsize = ((idx_end - idx_start) * 0.45, 5))动态设置图片尺寸,使用plt.plot()函数绘制每个指标的预测值和实际值;同时,设置图例、x轴刻度旋转等属性,并保存图片;最后,通过plt.show()显示绘制的图片。

  运行上述代码,即可获得本文开头第二幅图所示的图片结果。


转载来源:https://juejin.cn/post/7403683232807501875

相关文章
|
2天前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
31 16
|
8天前
|
数据挖掘 索引 Python
Python数据挖掘编程基础3
字典在数学上是一个映射,类似列表但使用自定义键而非数字索引,键在整个字典中必须唯一。可以通过直接赋值、`dict`函数或`dict.fromkeys`创建字典,并通过键访问元素。集合是一种不重复且无序的数据结构,可通过花括号或`set`函数创建,支持并集、交集、差集和对称差集等运算。
15 9
|
5天前
|
数据采集 数据挖掘 数据处理
Python中实现简单爬虫并处理数据
【9月更文挑战第31天】本文将引导读者理解如何通过Python创建一个简单的网络爬虫,并展示如何处理爬取的数据。我们将讨论爬虫的基本原理、使用requests和BeautifulSoup库进行网页抓取的方法,以及如何使用pandas对数据进行清洗和分析。文章旨在为初学者提供一个易于理解的实践指南,帮助他们快速掌握网络数据抓取的基本技能。
16 3
|
7天前
|
JSON 数据可视化 数据处理
Python数据可视化-折线图可视化
Python数据可视化-折线图可视化
|
7天前
|
存储 索引 Python
python中的数据容器
python中的数据容器
|
7天前
|
数据采集 存储 监控
如何使用 Python 爬取京东商品数据
如何使用 Python 爬取京东商品数据
22 0
|
8天前
|
数据挖掘 Python
Python数据挖掘编程基础8
在Python中,默认环境下并不会加载所有功能,需要手动导入库以增强功能。Python内置了诸多强大库,例如`math`库可用于复杂数学运算。导入库不仅限于`import 库名`,还可以通过别名简化调用,如`import math as m`;也可指定导入库中的特定函数,如`from math import exp as e`;甚至直接导入库中所有函数`from math import *`。但需注意,后者可能引发命名冲突。读者可通过`help('modules')`查看已安装模块。
13 0
|
8天前
|
人工智能 数据挖掘 Serverless
Python数据挖掘编程基础
函数式编程中的`reduce`函数用于对可迭代对象中的元素进行累积计算,不同于逐一遍历的`map`函数。例如,在Python3中,计算n的阶乘可以使用`reduce`(需从`funtools`库导入)实现,也可用循环命令完成。另一方面,`filter`函数则像一个过滤器,用于筛选列表中符合条件的元素,同样地功能也可以通过列表解析来实现。使用这些函数不仅使代码更加简洁,而且由于其内部循环机制,执行效率通常高于普通的`for`或`while`循环。
13 0
|
8天前
|
分布式计算 数据挖掘 Serverless
Python数据挖掘编程基础6
函数式编程(Functional Programming)是一种编程范型,它将计算机运算视为数学函数计算,避免程序状态及易变对象的影响。在Python中,函数式编程主要通过`lambda`、`map`、`reduce`、`filter`等函数实现。例如,对于列表`a=[5,6,7]`,可通过列表解析`b=[i+3 for i in a]`或`map`函数`b=map(lambda x:x+3, a)`实现元素加3的操作,两者输出均为`[8,9,10]`。尽管列表解析代码简洁,但其本质仍是for循环,在Python中效率较低;而`map`函数不仅功能相同,且执行效率更高。
6 0
|
8天前
|
数据挖掘 Python
Python数据挖掘编程基础5
函数是Python中用于提高代码效率和减少冗余的基本数据结构,通过封装程序逻辑实现结构化编程。用户可通过自定义或函数式编程方式设计函数。在Python中,使用`def`关键字定义函数,如`def pea(x): return x+1`,且其返回值形式多样,可为列表或多个值。此外,Python还支持使用`lambda`定义简洁的行内函数,例如`c=lambda x:x+1`。
14 0
下一篇
无影云桌面