1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- import os
- import pandas as pd
- from datetime import datetime
- 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
- import matplotlib.cm as cm
- from matplotlib.ticker import MultipleLocator
- from matplotlib.colors import Normalize
- from .analyst import Analyst
- from .utils.directoryUtil import DirectoryUtil as dir
- from confBusiness import Field_NameOfTurbine, ConfBusiness
- class GeneratorSpeedPowerAnalyst(Analyst):
- """
- 风电机组发电机转速-有功功率分析
- """
- def typeAnalyst(self):
- return "speed_power"
- def turbinesAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
- self.create_and_save_plots(
- dataFrameMerge, outputAnalysisDir, confData, confData.field_gen_speed, confData.field_power)
- def create_and_save_plots(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness, field_Generator_Speed, field_Active_Power):
- x_name = 'generator_speed'
- y_name = 'power'
- grouped = dataFrameMerge.groupby(Field_NameOfTurbine)
- for name, group in grouped:
- # 创建图形和坐标轴
- fig, ax = plt.subplots()
- cmap = cm.get_cmap('rainbow')
- # 绘制散点图
- scatter = ax.scatter(x=group[confData.field_gen_speed]*confData.value_gen_speed_multiple if not self.common.isNone(confData.value_gen_speed_multiple) else group[confData.field_gen_speed],
- y=group[confData.field_power], c=group['monthIntTime'], cmap=cmap, s=5)
- # g = sns.lmplot(x=field_Generator_Speed, y=field_Active_Power, data=group,
- # fit_reg=False, scatter_kws={"s": 5, "color": "b"}, legend=False, height=6, aspect=1.2)
- # g = sns.lmplot(x=field_Generator_Speed, y=field_Active_Power, data=group,
- # fit_reg=False, scatter_kws={"s": 5}, legend=False, height=6, aspect=1.2)
- # for ax in g.axes.flat:
- # # ax.xaxis.set_major_locator(MultipleLocator(100))
- # ax.set_xlim(confData.value_gen_speed_min, confData.value_gen_speed_max)
- # ax.set_xlabel(x_name)
- # ax.set_ylabel(y_name)
-
- # 设置图形标题和坐标轴标签
- ax.set_title(f'turbine_name={name}')
- ax.set_xlim(confData.value_gen_speed_min,
- confData.value_gen_speed_max)
- # 设置x轴的刻度步长
- # 假设您想要每100个单位一个刻度
- if not self.common.isNone(confData.value_gen_speed_step):
- loc = MultipleLocator(confData.value_gen_speed_step) # 创建每100个单位一个刻度的定位器
- ax.xaxis.set_major_locator(loc) # 将定位器应用到x轴上
- ax.set_xlabel(x_name)
- ax.set_ylabel(y_name)
- # 显示图例,并调整位置
- ax.legend(loc='lower right')
- # 设置颜色条
- unique_months = len(group['年月'].unique())
- ticks = np.linspace(group['monthIntTime'].min(
- ), group['monthIntTime'].max(), min(unique_months, 6)) # 减少刻度数量
- ticklabels = [datetime.fromtimestamp(
- tick).strftime('%Y-%m') for tick in ticks]
- norm = Normalize(group['monthIntTime'].min(),
- group['monthIntTime'].max())
- sm = cm.ScalarMappable(norm=norm, cmap=cmap)
- # 添加颜色条
- cbar = fig.colorbar(sm, ax=ax)
- cbar.set_ticks(ticks)
- cbar.set_ticklabels(ticklabels)
- # 旋转x轴刻度标签
- plt.xticks(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()
|