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

相关推荐
觅远42 分钟前
python实现word转html
python·html·word
悠然的笔记本1 小时前
python2和python3的区别
python
西猫雷婶2 小时前
python学opencv|读取图像(十六)修改HSV图像HSV值
开发语言·python·opencv
lovelin+v175030409662 小时前
智能电商:API接口如何驱动自动化与智能化转型
大数据·人工智能·爬虫·python
赵谨言2 小时前
基于python+django的外卖点餐系统
经验分享·python·毕业设计
孤独的履行者2 小时前
入门靶机:DC-1的渗透测试
数据库·python·网络安全
CodeClimb2 小时前
【华为OD-E卷-最左侧冗余覆盖子串 100分(python、java、c++、js、c)】
java·python·华为od
深度学习lover2 小时前
<项目代码>YOLO Visdrone航拍目标识别<目标检测>
python·yolo·目标检测·计算机视觉·visdrone航拍目标识别
澂玙3 小时前
材料性质预测、分子生成、分类等研究方向的大语言模型构建与应用
python
杂七杂八的3 小时前
主要模型记录
python