使用matplotlib自定义的绘图接口,绘图时,行数固定为2行,列数会根据提供的数据自动扩展,奇数时,最后一列数据会占据两行,接口中x轴为时间格式,可以根据自己的需求手动更改。
有任何其他的设置要查询,可以参考官网中文文档:
matplotlib.axes — Matplotlib 3.7.1 documentation
示例中的colors只定义了十个颜色,可以根据自己实际的绘图需求更改即可。
注意使用十字线标记时,使用MultiCursor同时标记多个子图,参考官网,水平线默认关闭,如果开启后,所有子图的y坐标相同,不利于显示,使用时,需要将所有的ax传递进去
multi = MultiCursor(fig.canvas, axesList, useblit=True, horizOn=False, color='gray', lw=1)
matplotlib.widgets_Matplotlib 中文网
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
from matplotlib.widgets import Cursor, MultiCursor
# 通用绘图接口,每组数据绘制一个折线图
def plotApi(filePath, suptitle: str, xLable: str, yLables: 'tuple|list', index: int=None, header: int=None):
'''
通用绘图接口,每组数据绘制一个折线图
:param filePath: 要分析的文件路径,为xlsx格式的文件
:param suptitle: 图表的总标题
:param xLables: 各个子图的x label
:param yLables: 各个子图的y label
:param index: 执行行索引是哪一列
:param header: 执行数据中列索引是哪一行
:return: None
'''
sns.set(style='darkgrid')
df = pd.read_excel(filePath, header=header, index_col=index)
column_number = df.shape[-1]
odd_flag = column_number%2
ncols = column_number//2 + odd_flag
header_lst = df.columns.tolist()
# fig = plt.figure(figsize=(9, 6), constrained_layout=True)
fig = plt.figure(figsize=(12, 7), tight_layout=True)
gs = fig.add_gridspec(2, ncols)
colors = ('#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf')
for x in range(column_number):
if odd_flag:
if x < 2 * (ncols-1):
ax = fig.add_subplot(gs[x // (ncols-1), x % (ncols-1)])
else:
ax = fig.add_subplot(gs[:, ncols-1])
else:
ax = fig.add_subplot(gs[x // ncols, x % ncols])
ax.set_title(header_lst[x])
ax.set_xlabel(xLable)
ax.set_ylabel(yLables[x])
ax.grid(True) # Axes对象设置网格
ax.xaxis.set_major_formatter(mdate.DateFormatter('%m/%d %H:%M')) # 设置时间标签显示格式
ax.plot(df.iloc[:, x], color=colors[x])
# plt.xticks(rotation=45) # 单独设置每个axes对象的x坐标轴旋转
# ax.minorticks_on() # 显示次要刻度,sns.set(style='darkgrid')有样式设置时无效
# 去除相同纵坐标的label,由于每个子图占据的空间大小相同,所以去除ylabel的图标会有空隙
# if x not in (0, column_number//2, column_number-1):
# ax.set_ylabel('')
fig.suptitle(suptitle, fontsize=15, color='indigo') # 设置图标大标题
fig.align_labels() # 对齐 xlabel 和 ylabel
plt.tight_layout()
# plt.xticks(rotation=45) # 只能对当前的Axes对象起作用
fig.autofmt_xdate() # 会自动调整x轴的日期格式,存在多个子图时,会自动share对应的x轴
plt.show()