Python实现生成两个散点图的图表并保存为图片。
- 导入所需的库:
import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt
首先导入pandas
和matplotlib
库,并设置matplotlib
使用Agg
后端,以便在无图形界面的环境中生成图表。
- 定义
chart()
函数:
def chart(): ...
创建名为chart
的函数。
- 设置字体和绘图参数:
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
设置matplotlib
的字体为"Microsoft YaHei",以显示中文,并禁用Unicode减号。
- 读取Excel数据:
data = pd.read_excel(filename, sheet_name=sheetname)
使用pandas
的read_excel
函数读取指定文件名filename
和工作表名sheetname
的Excel数据,并将结果存储在data
变量中。
- 初始化画布1:
# 初始化画布1
plt.subplot(1, 2, 1)
x = data['运行时间ms']
y = data['与上一包的间隔ms']
plt.scatter(x, y, s=10, marker='o', color='r', edgecolor='k')
plt.title(label='广播间隔图表', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 18}, loc='center')
plt.xlabel('run_time(ms)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=1)
plt.ylabel('adv_interval(ms)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=1)
plt.grid(visible=True, axis='y', color='b', linestyle='dotted', linewidth=1)
# plt.ylim(0,5000) # y坐标刻度
# 初始化画布2
plt.subplot(1, 2, 2)
x = data['运行时间ms']
y = data['rssi值']
plt.scatter(x, y, s=10, marker='o', color='r', edgecolor='k')
plt.title(label='RSSI图表', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 18}, loc='center')
plt.xlabel('run_time(ms)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=1)
# plt.ylabel('RSSI值', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=2)
plt.grid(visible=True, axis='y', color='b', linestyle='dotted', linewidth=1)
使用plt.subplot()
函数初始化第一个子图,设置数据和绘图参数,包括散点图的大小、标记样式、颜色、边缘颜色等。设置标题、x轴和y轴的标签,并添加网格线。
使用plt.subplot()
函数初始化第二个子图,设置数据和绘图参数,与第一个子图类似。
- 保存图表为图片:
plt.savefig('doc/Adv+RSSI图表.png', dpi=300)
使用plt.savefig()
函数将图表保存为名为"Adv+RSSI图表.png"的图片文件,设置dpi为300,即每英寸像素数。
- 关闭绘图窗口:
plt.close()
关闭当前的绘图窗口,释放资源。
- 返回信息并结束函数:
self.thread.update_signal.emit("图表生成完成-存放路径:doc/Adv+RSSI图表.png")
这里是本人做了qt上位机,发送信号告知图表生成完成,并提供图表保存路径。
- 设置文件名和工作表名,并调用
chart()
函数:
filename = 'doc/gw_data.xlsx' sheetname = 'gw_data' chart()
设置Excel文件名为"doc/gw_data.xlsx",工作表名为"gw_data",然后调用chart()
函数开始生成图表。
原始代码如下:
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel(filename, sheet_name=sheetname)
# 初始化画布1
plt.subplot(1, 2, 1)
x = data['运行时间ms']
y = data['与上一包的间隔ms']
plt.scatter(x, y, s=10, marker='o', color='r', edgecolor='k')
plt.title(label='广播间隔图表', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 18}, loc='center')
plt.xlabel('run_time(ms)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=1)
plt.ylabel('adv_interval(ms)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=1)
plt.grid(visible=True, axis='y', color='b', linestyle='dotted', linewidth=1)
# plt.ylim(0,5000) # y坐标刻度
# 初始化画布2
plt.subplot(1, 2, 2)
x = data['运行时间ms']
y = data['rssi值']
plt.scatter(x, y, s=10, marker='o', color='r', edgecolor='k')
plt.title(label='RSSI图表', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 18}, loc='center')
plt.xlabel('run_time(ms)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=1)
# plt.ylabel('RSSI值', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=2)
plt.grid(visible=True, axis='y', color='b', linestyle='dotted', linewidth=1)
plt.savefig('doc/Adv+RSSI图表.png', dpi=300)
plt.close()
self.thread.update_signal.emit("图表生成完成-存放路径:doc/Adv+RSSI图表.png")
# plt.show()
filename = 'doc/gw_data.xlsx'
sheetname = 'gw_data'
chart()