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报告

相关推荐
来自天蝎座的孙孙44 分钟前
洛谷P1595讲解(加强版)+错排讲解
python·算法
张子夜 iiii2 小时前
机器学习算法系列专栏:主成分分析(PCA)降维算法(初学者)
人工智能·python·算法·机器学习
跟橙姐学代码3 小时前
学Python像学做人:从基础语法到人生哲理的成长之路
前端·python
Keying,,,,3 小时前
力扣hot100 | 矩阵 | 73. 矩阵置零、54. 螺旋矩阵、48. 旋转图像、240. 搜索二维矩阵 II
python·算法·leetcode·矩阵
桃源学社(接毕设)3 小时前
基于人工智能和物联网融合跌倒监控系统(LW+源码+讲解+部署)
人工智能·python·单片机·yolov8
yunhuibin4 小时前
pycharm2025导入anaconda创建的各个AI环境
人工智能·python
杨荧4 小时前
基于Python的电影评论数据分析系统 Python+Django+Vue.js
大数据·前端·vue.js·python
python-行者4 小时前
akamai鼠标轨迹
爬虫·python·计算机外设·akamai
R-G-B5 小时前
【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数)
python·opencv·视频加载·摄像头调用·获取视频基本信息·获取视频帧率·获取视频帧数
赵英英俊5 小时前
Python day46
python·深度学习·机器学习