import os import pandas as pd import numpy as np import plotly.graph_objects as go from plotly.subplots import make_subplots import seaborn as sns import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator from behavior.analyst import Analyst from utils.directoryUtil import DirectoryUtil as dir from algorithmContract.confBusiness import * class PitchGeneratorSpeedAnalyst(Analyst): """ 风电机组变桨-发电机转速分析 """ def typeAnalyst(self): return "pitch_generator_speed" def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness): self.plot_speed_pitch_angle( dataFrameMerge, outputAnalysisDir, confData, confData.field_pitch_angle1, confData.field_gen_speed) def plot_speed_pitch_angle(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness, fieldPitchAngle, fieldGeneratorSpeed): x_name = 'generator_speed' y_name = 'pitch_angle' # 按设备名分组数据 grouped = dataFrameMerge.groupby(Field_NameOfTurbine) sns.set_palette('deep') # 遍历每个设备并绘制散点图 for name, group in grouped: groupNew = group.copy() if not self.common.isNone(confData.value_gen_speed_multiple): groupNew[fieldGeneratorSpeed] = group[fieldGeneratorSpeed] * \ confData.value_gen_speed_multiple # sns.lmplot函数参数scatter_kws: 设置为{"s": 5}时,会出现颜色丢失问题; g = sns.lmplot(x=fieldGeneratorSpeed, y=fieldPitchAngle, data=groupNew, fit_reg=False, scatter_kws={"s": 5, "color": "b"}, legend=False, height=6, aspect=1.2) # g = sns.lmplot(x=fieldGeneratorSpeed, y=fieldPitchAngle, data=group, # fit_reg=False, scatter_kws={"s": 5}, legend=False, height=6, aspect=1.2) # 设置x轴和y轴的刻度 for ax in g.axes.flat: ax.set_xlim(confData.graphSets["generatorSpeed"]["min"] if not self.common.isNone( confData.graphSets["generatorSpeed"]["min"]) else 1000, confData.graphSets["generatorSpeed"]["max"] if not self.common.isNone(confData.graphSets["generatorSpeed"]["max"]) else 2000) # 设置x轴的刻度步长 # 假设您想要每100个单位一个刻度 loc = MultipleLocator(confData.graphSets["generatorSpeed"]["step"] if not self.common.isNone( confData.graphSets["generatorSpeed"]) and not self.common.isNone( confData.graphSets["generatorSpeed"]["step"]) else 200) ax.xaxis.set_major_locator(loc) # 将定位器应用到x轴上 ax.yaxis.set_major_locator(MultipleLocator(confData.graphSets["pitchAngle"]["step"] if not self.common.isNone( confData.graphSets["pitchAngle"]["step"]) else 2)) ax.set_ylim(confData.graphSets["pitchAngle"]["min"] if not self.common.isNone( confData.graphSets["pitchAngle"]["min"]) else -2, confData.graphSets["pitchAngle"]["max"] if not self.common.isNone(confData.graphSets["pitchAngle"]["max"]) else 28) ax.set_xlabel(x_name) ax.set_ylabel(y_name) # 设置x轴刻度值旋转角度为45度 plt.tick_params(axis='x', rotation=45) # 调整布局和设置标题 plt.tight_layout() plt.title(f'{Field_NameOfTurbine}={name}') # 保存图像并关闭绘图窗口 output_file = os.path.join(outputAnalysisDir, f"{name}.png") plt.savefig(output_file, bbox_inches='tight', dpi=120) plt.close()