Python读取csv、Excel文件生成图表

简介

本文章介绍了通过读取 csv 或 Excel 文件内容,将其转换为折线图或柱状图的方法,并写入 html 文件中。

目录

[1. 读取CSV文件](#1. 读取CSV文件)

[1.1. 生成折线图](#1.1. 生成折线图)

[1.1.1. 简单生成图表](#1.1.1. 简单生成图表)

[1.1.2. 设置折线图格式](#1.1.2. 设置折线图格式)

[1.2. 生成柱状图](#1.2. 生成柱状图)

[1.2.1. 简单生成图表](#1.2.1. 简单生成图表)

[1.2.2. 设置柱状图格式](#1.2.2. 设置柱状图格式)

[2. 读取Excel文件](#2. 读取Excel文件)

[2.1. 生成折线图](#2.1. 生成折线图)

[2.1.1. 简单生成图表](#2.1.1. 简单生成图表)

[2.1.2. 设置折线图格式](#2.1.2. 设置折线图格式)

[2.2. 生成柱状图](#2.2. 生成柱状图)

[2.2.1. 简单生成图表](#2.2.1. 简单生成图表)

[2.2.2. 设置柱状图格式](#2.2.2. 设置柱状图格式)

[3. 将生成的折线图写入html文件](#3. 将生成的折线图写入html文件)

[3.1. 直接写入图片](#3.1. 直接写入图片)

[3.2. 添加文字描述](#3.2. 添加文字描述)


1. 读取CSV文件

1.1. 生成折线图

1.1.1. 简单生成图表

代码如下

python 复制代码
import pandas
import matplotlib.pyplot as plt

# 设置csv文件路径
file = r'E:\test.csv'

# 防止中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 通过pandas读取文件内容
df = pandas.read_csv(file)
# 将文件第一行设置为序列名称
series_names = df .columns

# 将文件数据绘制为折线图
plt.plot(df)
plt.legend(series_names)  #设置序列名称
plt.xlabel('横轴标题')     #设置横坐标名称
plt.ylabel('纵轴标题')     #设置纵坐标名称
plt.title('图表标题')      #设置图表标题

# 将绘制的图表显示在屏幕上
plt.show()

# 保存图表为png文件
# plt.savefig('filename.png')

绘制结果如下(csv文件中含有3列数据)

1.1.2. 设置折线图格式

代码如下(在1.1.1目录的代码基础上增加了:图片长宽、标记样式、网格线、横纵轴参考线)

python 复制代码
import pandas
import matplotlib.pyplot as plt

# 设置csv文件路径
file = r'E:\test.csv'

# 防止中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 通过pandas读取文件内容
df = pandas.read_csv(file)
# 将文件第一行设置为序列名称
series_names = df .columns

# 定义图表大小(长15,高8),必须放在plt.plot前面
plt.figure(figsize=(15,8))

# 将文件数据绘制为折线图
plt.plot(df, marker='o', markersize=3)  #marker设置标记样式和大小
plt.xlabel('横轴标题')   #设置横坐标名称
plt.ylabel('纵轴标题')   #设置纵坐标名称
plt.title('图表标题')    #设置图表标题
plt.grid()              #显示网格线
plt.legend(series_names)  #设置序列名称
plt.axhline(y=2, color='r', linestyle='--')   #在y轴上添加横向参考线。
plt.axvline(x=1, color='r', linestyle='--')   #在x轴上添加纵向参考线。

# 将绘制的图表显示在屏幕上
plt.show()

# 保存图表为png文件
# plt.savefig('filename.png')

绘制结果如下

1.2. 生成柱状图

1.2.1. 简单生成图表

代码如下

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

# 从CSV文件读取数据并指定第一行为列名
data = pd.read_csv(r'E:\test.csv', header=0)

# 防止中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 获取列名和对应的值
columns = data.columns
values = data.iloc[0].values

# 绘制柱状图
plt.bar(columns, values)
plt.xlabel('横轴标题')
plt.ylabel('纵轴标题')
plt.title('图表标题')

# 将绘制的图表显示在屏幕上
plt.show()

# 保存图表为png文件
# plt.savefig('filename.png')

绘制结果如下

1.2.2. 设置柱状图格式

颜色代码

python 复制代码
'b' 表示蓝色
'g' 表示绿色
'r' 表示红色
'c' 表示青色
'm' 表示品红色
'y' 表示黄色
'k' 表示黑色
'w' 表示白色。

代码如下(在1.2.1目录的代码基础上增加了:图片长宽、柱子宽度/颜色、边框宽度/颜色)

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

# 从CSV文件读取数据并指定第一行为列名
data = pd.read_csv(r'E:\test.csv', header=0)

# 防止中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 定义图表大小(长15,高8),必须放在plt.plot前面
plt.figure(figsize=(15,8))

# 获取列名和对应的值
columns = data.columns
values = data.iloc[0].values

# 绘制柱状图
plt.bar(columns, values,    #横轴坐标
        color='y',          #设置柱子颜色(黄色,见颜色代码)
        width = 0.8,        #设置柱子宽度
        edgecolor='k',      #设置柱子边框颜色(黑色,见颜色代码)
        linewidth=2         #设置柱子边框宽度
)
plt.xlabel('横轴标题')
plt.ylabel('纵轴标题')
plt.title('图表标题')

# 将绘制的图表显示在屏幕上
plt.show()

# 保存图表为png文件
# plt.savefig('filename.png')

绘制结果如下

2. 读取Excel文件

2.1. 生成折线图

2.1.1. 简单生成图表

代码如下

python 复制代码
import pandas
import matplotlib.pyplot as plt

# 防止乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 读取Excel文件内容
df = pandas.read_excel(r'E:\test.xlsx', sheet_name='Sheet1')
column_names = df.columns.tolist()  #获取第1行名称
excel_rows = df.shape[0]            #获取行数

# 设置横轴数据,可以在Excel中获取,这里直接将行数从1开始遍历到末尾
x = [i for i in range(1, excel_rows+1)]
# 遍历第一行的列名
for col_name in column_names:
    # 通过列名提取画图的数据
    y = df[col_name].to_numpy()
    # 画图,执行横轴坐标,将线条图例名设置为第一行的列名
    plt.plot(x, y, label=col_name)

# 设置属性
plt.legend()  # 显示图例标题
plt.xlabel('横坐标名称')
plt.ylabel('纵坐标名称')
plt.title('折线图标题')

# plt.savefig('./filename.jpg')  # 保存图片
plt.show()  # 查看图片

绘制结果如下

2.1.2. 设置折线图格式

代码如下(在2.1.1目录的代码基础上增加了:图片长宽、标记样式、网格线、横纵轴参考线)

python 复制代码
import pandas
import matplotlib.pyplot as plt

# 防止乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 读取Excel文件内容,如果读取csv文件,则使用pandas.read_csv
df = pandas.read_excel(r'E:\test.xlsx', sheet_name='Sheet1')
column_names = df.columns.tolist()  #读取第1行名称
excel_rows = df.shape[0]             #读取行数

# 定义图表大小(长15,高8),必须放在plt.plot前面
plt.figure(figsize=(15,8))

# 设置横轴数据,可以在Excel中获取,这里直接将行数从1开始遍历到末尾
x = [i for i in range(1, excel_rows+1)]
# 遍历第一行的列名
for col_name in column_names:
    # 通过列名提取画图的数据
    y = df[col_name].to_numpy()
    # 画图,执行横轴坐标,将线条图例名设置为第一行的列名
    plt.plot(x, y, label=col_name, marker='o', markersize=3)    #marker设置标记样式和大小

# 设置属性
plt.legend()  # 显示图例标题
plt.xlabel('横坐标名称')
plt.ylabel('纵坐标名称')
plt.title('折线图标题')
plt.grid()              #显示网格线
plt.axhline(y=2, color='r', linestyle='--')   #在y轴上添加横向参考线
plt.axvline(x=1, color='r', linestyle='--')   #在x轴上添加纵向参考线

# plt.savefig('./aa.jpg')  # 保存图片
plt.show()  # 查看图片

绘制结果如下

2.2. 生成柱状图

2.2.1. 简单生成图表

代码如下(单行数据)

python 复制代码
import pandas
import matplotlib.pyplot as plt

# 防止乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 读取Excel文件内容
df = pandas.read_excel(r'E:\test.xlsx', sheet_name='Sheet1')

# 获取第一行的名称
column_names = df.columns.tolist()

# 去除第一行,并转置数据
data = df.T

# 创建柱状图,指定绘制的类型为柱状图(line:折线图(默认),bar:柱状图,barh:水平柱状图,hist:直方图,box:箱线图,kde:核密度估计图,density:密度图,area:面积图,scatter:散点图,hexbin:Hexbin 图(用于显示二维数据的分布情况))
data.plot(kind='bar')

# 设置柱子的名称(rotation旋转柱子标题的度数)
plt.xticks(range(len(column_names)), column_names, rotation=0)

# 添加标题和坐标轴标签
plt.title('图表标题')
plt.xlabel('横轴标题')
plt.ylabel('纵轴标题')

# 显示柱状图
plt.show()

绘制结果如下

多行数据需要增加修改图例名称的方法,默认从0开始,设置为从1开始。每个图例表示行数,比例1:第一行;2:第二行...

python 复制代码
import pandas
import matplotlib.pyplot as plt

# 防止乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 读取Excel文件内容
df = pandas.read_excel(r'E:\test.xlsx', sheet_name='Sheet2')

# 获取第一行的名称
column_names = df.columns.tolist()

# 去除第一行,并转置数据
data = df.T

# 创建柱状图,指定绘制的类型为柱状图(line:折线图(默认),bar:柱状图,barh:水平柱状图,hist:直方图,box:箱线图,kde:核密度估计图,density:密度图,area:面积图,scatter:散点图,hexbin:Hexbin 图(用于显示二维数据的分布情况))
data.plot(kind='bar')

# 设置柱子的名称(rotation旋转柱子标题的度数)
plt.xticks(range(len(column_names)), column_names, rotation=0)

# 添加标题和坐标轴标签
plt.title('图表标题')
plt.xlabel('横轴标题')
plt.ylabel('纵轴标题')

# 修改图例名称(从1开始,1表示第1行数据...)
handles, labels = plt.gca().get_legend_handles_labels()
labels = [int(label)+1 for label in labels]
plt.legend(handles, labels)

# 显示柱状图
plt.show()

2.2.2. 设置柱状图格式

颜色代码

python 复制代码
'b' 表示蓝色
'g' 表示绿色
'r' 表示红色
'c' 表示青色
'm' 表示品红色
'y' 表示黄色
'k' 表示黑色
'w' 表示白色。

代码如下(在2.2.1目录的代码基础上增加了:图片长宽、柱子宽度/颜色、边框宽度/颜色)

python 复制代码
import pandas
import matplotlib.pyplot as plt

# 防止乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 读取Excel文件内容
df = pandas.read_excel(r'E:\test.xlsx', sheet_name='Sheet1')

# 设置图片大小(长15,宽8)
fig = plt.figure(figsize=(15, 8))
ax = fig.add_subplot()

# 获取第一行的名称
column_names = df.columns.tolist()

# 去除第一行,并转置数据
data = df.T

# 创建柱状图
data.plot(
    kind='bar', #指定绘制的类型为柱状图(line:折线图(默认),bar:柱状图,barh:水平柱状图,hist:直方图,box:箱线图,kde:核密度估计图,density:密度图,area:面积图,scatter:散点图,hexbin:Hexbin 图(用于显示二维数据的分布情况))
    color='y',  #设置柱子颜色(黄色,见颜色代码)
    width=0.8,  # 设置柱子宽度
    edgecolor='k',  #设置柱子边框颜色(黑色,见颜色代码)
    linewidth=2,    #设置柱子边框宽度
    ax=ax           #设置图片大小
)


# 设置柱子的名称(rotation旋转柱子标题的度数)
plt.xticks(range(len(column_names)), column_names, rotation=0)

# 添加标题和坐标轴标签
plt.title('图表标题')
plt.xlabel('横轴标题')
plt.ylabel('纵轴标题')

# 显示柱状图
plt.show()

绘制结果如下

3. 将生成的折线图写入html文件

3.1. 直接写入图片

使用 MarkupPy 将图片写入html文件

python 复制代码
from MarkupPy import markup

# 添加图片,设置长、宽
page = markup.page()
page.add('<img src="./filename.png" alt="csv生成的折线图" width="800" height="500">')


# 写入文件
with open('./tmp.html', 'w') as file:
    file.write(str(page))

代码如下(以csv生成的折线图为例)

python 复制代码
import pandas
import matplotlib.pyplot as plt
from MarkupPy import markup

# 设置csv文件路径
file = r'E:\test.csv'

# 防止中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

# 通过pandas读取文件内容
df = pandas.read_csv(file)
# 将文件第一行设置为序列名称
series_names = df .columns

# 将文件数据绘制为折线图
plt.plot(df)
plt.legend(series_names)  #设置序列名称
plt.xlabel('横轴标题')     #设置横坐标名称
plt.ylabel('纵轴标题')     #设置纵坐标名称
plt.title('图表标题')      #设置图表标题

# 保存图表为png文件
plt.savefig('./filename.png')

# 添加图片
page = markup.page()
page.add('<img src="./filename.png" alt="csv生成的折线图" width="800" height="500">')


# 写入文件
with open('./tmp.html', 'w') as file:
    file.write(str(page))

结果如下

3.2. 添加文字描述

文件描述见 MarkupPy 的详细使用方法

超链接:Python模块MarkupPy & 自定义html报告

相关推荐
Niuguangshuo8 分钟前
Python设计模式:代理模式
开发语言·python·代理模式
www_pp_11 分钟前
# 实时人脸识别系统:基于 OpenCV 和 Python 的实现
人工智能·python·opencv
带娃的IT创业者2 小时前
《Python实战进阶》No39:模型部署——TensorFlow Serving 与 ONNX
pytorch·python·tensorflow·持续部署
Bruce-li__2 小时前
深入理解Python asyncio:从入门到实战,掌握异步编程精髓
网络·数据库·python
九月镇灵将2 小时前
6.git项目实现变更拉取与上传
git·python·scrapy·scrapyd·gitpython·gerapy
小张学Python2 小时前
AI数字人Heygem:口播与唇形同步的福音,无需docker,无需配置环境,一键整合包来了
python·数字人·heygem
跳跳糖炒酸奶2 小时前
第四章、Isaacsim在GUI中构建机器人(2):组装一个简单的机器人
人工智能·python·算法·ubuntu·机器人
步木木3 小时前
Anaconda和Pycharm的区别,以及如何选择两者
ide·python·pycharm
星始流年3 小时前
解决PyInstaller打包PySide6+QML应用的资源文件问题
python·llm·pyspider
南玖yy3 小时前
Python网络爬虫:从入门到实践
爬虫·python