Python读取csv、Excel文件生成图表
简介
本文章介绍了通过读取 csv 或 Excel 文件内容,将其转换为折线图或柱状图的方法,并写入 html 文件中。
1. 读取CSV文件
1.1. 生成折线图
1.1.1. 简单生成图表
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目录的代码基础上增加了:图片长宽、标记样式、网格线、横纵轴参考线)
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. 简单生成图表
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. 设置柱状图格式
'b' 表示蓝色
'g' 表示绿色
'r' 表示红色
'c' 表示青色
'm' 表示品红色
'y' 表示黄色
'k' 表示黑色
'w' 表示白色。
代码如下(在1.2.1目录的代码基础上增加了:图片长宽、柱子宽度/颜色、边框宽度/颜色)
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. 简单生成图表
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目录的代码基础上增加了:图片长宽、标记样式、网格线、横纵轴参考线)
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. 简单生成图表
代码如下(单行数据)
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:第二行...
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. 设置柱状图格式
'b' 表示蓝色
'g' 表示绿色
'r' 表示红色
'c' 表示青色
'm' 表示品红色
'y' 表示黄色
'k' 表示黑色
'w' 表示白色。
代码如下(在2.2.1目录的代码基础上增加了:图片长宽、柱子宽度/颜色、边框宽度/颜色)
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文件
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生成的折线图为例)
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 的详细使用方法
定时同步数据库表(mysql+linux+crontab)
所有评论(0)