# 绘制图表
def plt_show(x: dict,
y: Union[dict, List[dict]],
size: Tuple[int, int],
subplot: Tuple[int, int] = (2, 2),
isSubplot: bool = True) -> None:
"""
根据传入的数据进行折线图的绘制
:param x: x轴坐标数据
x = dict(
data=, # 数据集
name= # x轴名称
xlim=(1, 100) # x轴数据范围
)
:param y: y轴需要绘制的数据
y = dict(
data=, # 数据集
name=, # y轴名称
line="r-", # 绘制线条及颜色,r:red, -:直线,其余样式自行网查
label=, # 表格上提示部分的线段名称
title=
# 表格title)
:param size: 画布大小
size = (8, 4) # width, height
:param subplot: 同时绘制图表的网格尺寸, 当isSubplot为True是才需要设置, 默认设置(2, 2)
subplot = (2, 2) # 在2*2的网格中分别绘制图表
:param isSubplot: 是否使用网格绘制图表
isSubplot: True/False
:return: None
"""
# 获取x轴数据、名称、数据范围
x_data = x["data"]
x_name = x.get("name", "")
x_lim = x.get("xlim", None)
# size判断,如果输入有误,则默认使用(8, 4)
if not size or not all([isinstance(x, int) for x in size]):
size = (8, 4)
# 准备画布
plt.figure(figsize=size)
# 修改字体,设置中文正常显示
plt.rcParams["font.sans-serif"] = ["simHei"]
# 添加x轴名称
plt.xlabel(x_name)
# 获取y轴数据,如果为dict则生成List[dict]
if isinstance(y, dict):
y = [y]
# 1.绘制曲线
# 遍历y轴数据集
data_length = len(y)
start_index = 1
for y_ in y:
if start_index > data_length: # 如果index超过数据总长度则break
break
# 获取需要绘制的y轴数据
y_data = y_["data"] # 数据集
y_name = y_.get("name", "") # y轴名称
y_lim = y_.get("ylim", None) # y轴数据限制
line_type = y_.get("line", "b-") # 线条类型及颜色,默认为"b-"
line_label = y_.get("label", None) # 提示部分线条名称
title = y_.get("title", None) # 表格title
# 如果使用网格,则在网格中逐个添加图片
if isSubplot:
plt.subplot(subplot[0], subplot[1], start_index)
# 开始绘制数据
plt.plot(x_data, y_data, line_type, label=line_label)
# 修改y轴显示名称
plt.ylabel(y_name)
# x轴名称旋转90°,防止文本过长,导致字符叠加
plt.xticks(rotation=90)
# 添加图表title
plt.title(title)
# 如果添加了y轴数据限制,则添加ylim
if y_lim and isinstance(y_lim, Iterable) and all([isinstance(i, Number) for i in x_lim]):
plt.ylim(y_lim[0], y_lim[1])
start_index += 1
# 如果添加了x轴数据限制,则添加xlim
if x_lim and isinstance(x_lim, Iterable) and all([isinstance(i, Number) for i in x_lim]):
plt.xlim(x_lim[0], x_lim[1])
# 显示图表中线段提示部分
plt.legend()
# 开始绘制图片
plt.show()