23.08.04 简单概述通过python从excel获取横纵坐标制作散点图
注:excel中已具有根据两组数据进行散点图绘制功能,若单一需求可以直接框选所需数据并点击插入后点击图表进行选择所绘制图表类型
本文适用于具有批量需求或懒得点excel的人群
获取数据
通过导入xlrd对excle中数据进行获取,通过输入行数索引列表、列数索引列表与文件名称,对行列内容形成数组并输出。
适用于excel内数据为矩阵的情况,零散数据需要细化操作,自行修改代码。
实例代码如下:
# 输入excel,行数索引列表,列数索引列表,返回对应array数组
def code_03(l_list, h_list, excel_name):
return_array = np.zeros((len(l_list), len(h_list)))
data = xlrd.open_workbook(f"./EXCEL/{excel_name}.xls")
table = data.sheet_by_name("Sheet1")
l_num = 0
h_num = 0
for i in l_list:
for j in h_list:
print(l_num, h_num)
return_array[l_num, h_num] = table.cell_value(i, j)
h_num = h_num + 1
h_num = 0
l_num = l_num + 1
return return_array
通过对EXCEL文件夹内.xls后缀表格进行获取数据并返回
绘制散点图
导入 matplotlib.pyplot ,通过以下代码进行字体与正负号配置:
plt.rcParams['font.sans-serif'] = ['Simhei'] # 设置黑体
plt.rcParams['axes.unicode_minus'] = False # 正常显示正负号
通过.scatter进行散点图绘制,其中,s代表散点像素,c为颜色,这里选择绿色,label为点名称,代码如下:
plt.scatter(x_list, y_list, s=0.5, c="g", alpha=1, label="PSNR = f(ERROR)")
通过对输入行列列表进行横纵坐标系最大值最小值确定,这里选用通俗易懂的代码,也可以选择直接使用函数直接得出最大值与最小值,代码如下:
# 获取xy两端极值
x_min = 0
x_max = 0
y_min = 0
y_max = 0
for i in x_list:
if i < x_min:
x_min = i
if i >x_max:
x_max = i
for i in y_list:
if i < y_min:
y_min = i
if i >y_max:
y_max = i
确定X轴Y轴范围:
plt.xlim([x_min-10, x_max+10])
plt.ylim([y_min-10, y_max+10])
设置标题并保存,保存再文件夹image_SDT下,代码如下:
plt.title(image_name)
plt.savefig(f'./image_SDT/{image_name}.png')
代码示例
import matplotlib.pyplot as plt
import xlrd
import numpy as np
# 输入x轴列表,y轴列表,散点图名称,输出存储图像
def code_02(x_list, y_list, image_name):
plt.rcParams['font.sans-serif'] = ['Simhei'] # 设置黑体
plt.rcParams['axes.unicode_minus'] = False # 正常显示正负号
# 散点图,颜色为绿色,透明度100%
plt.scatter(x_list, y_list, s=0.5, c="g", alpha=1, label="ERROR = f(PSNR)")
# 获取xy两端极值
x_min = 0
x_max = 0
y_min = 0
y_max = 0
for i in x_list:
if i < x_min:
x_min = i
if i >x_max:
x_max = i
for i in y_list:
if i < y_min:
y_min = i
if i >y_max:
y_max = i
# 更改X轴和Y轴的范围
plt.xlim([x_min-10, x_max+10])
plt.ylim([y_min-10, y_max+10])
# 显示图例
plt.legend(loc="best")
# 标题
plt.title(image_name)
plt.savefig(f'./image_SDT/{image_name}.png')
# 输入excel,行数索引列表,列数索引列表,返回对应array数组
def code_03(l_list, h_list, excel_name):
return_array = np.zeros((len(l_list), len(h_list)))
data = xlrd.open_workbook(f"./EXCEL/{excel_name}.xls")
table = data.sheet_by_name("Sheet1")
l_num = 0
h_num = 0
for i in l_list:
for j in h_list:
print(l_num, h_num)
return_array[l_num, h_num] = table.cell_value(i, j)
h_num = h_num + 1
h_num = 0
l_num = l_num + 1
return return_array
def main():
# code_01()
L_LIST = list(range(1, 3363))
H_LIST = list(range(1, 3))
EXCLE_NAME = '3362 拼贴误差与psnr对应关系'
SDT_NAME = 'psnr_PT_sdt'
array = code_03(L_LIST, H_LIST, EXCLE_NAME)
code_02(array[:, 0], array[:, 1, ],SDT_NAME)
if __name__ == '__main__':
main()
通过代码对'3362 拼贴误差与psnr对应关系.xls'内数据进行获取并绘制散点图保存。其中,对于excel表格内容行列都是从0开始索引。