pitchTSRCpAnalyst.py 4.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import os
  2. import pandas as pd
  3. import numpy as np
  4. import plotly.graph_objects as go
  5. from plotly.subplots import make_subplots
  6. from behavior.analyst import Analyst
  7. from utils.directoryUtil import DirectoryUtil as dir
  8. from algorithmContract.confBusiness import *
  9. import plotly.offline as offline
  10. class PitchTSRCpAnalyst(Analyst):
  11. def typeAnalyst(self):
  12. return "pitch_tsr_cp"
  13. def turbinesAnalysis(self, dataFrameMerge, outputAnalysisDir, confData: ConfBusiness):
  14. self.windRoseAnalysis(dataFrameMerge, outputAnalysisDir, confData)
  15. def windRoseAnalysis(self, dataFrameMerge: pd.DataFrame, outputAnalysisDir, confData: ConfBusiness):
  16. """
  17. 绘制3D曲面图。
  18. 参数:
  19. df: pandas.DataFrame, 必须包含confData.field_pitch_angle1, Field_TSR, 和 Field_Cp这三个字段。
  20. 返回:
  21. 一个Plotly图形对象。
  22. """
  23. # 检查所需列是否存在
  24. required_columns = {confData.field_pitch_angle1, Field_TSR, Field_Cp}
  25. if not required_columns.issubset(dataFrameMerge.columns):
  26. raise ValueError(f"DataFrame缺少必要的列。需要的列有: {required_columns}")
  27. # 按设备名分组数据
  28. grouped = dataFrameMerge.groupby(Field_NameOfTurbine)
  29. for name, group in grouped:
  30. layout = go.Layout(
  31. title={
  32. "text": f'3D scatter plot: Cp vs. Pitch Angle vs. TSR {name}',
  33. "x": 0.5
  34. },
  35. scene=dict(
  36. xaxis=dict(
  37. title='Pitch Angle',
  38. dtick=confData.graphSets["pitchAngle"]["step"] if not self.common.isNone(
  39. confData.graphSets["pitchAngle"]["step"]) else 2, # 设置y轴刻度间隔为0.1
  40. range=[confData.graphSets["pitchAngle"]["min"] if not self.common.isNone(
  41. confData.graphSets["pitchAngle"]["min"]) else -2, confData.graphSets["pitchAngle"]["max"] if not self.common.isNone(confData.graphSets["pitchAngle"]["max"]) else 28], # 设置y轴的范围从0到1
  42. ),
  43. yaxis=dict(
  44. title='TSR',
  45. dtick=confData.graphSets["tsr"]["step"] if not self.common.isNone(
  46. confData.graphSets["tsr"]["step"]) else 5, # 设置y轴刻度间隔为0.1
  47. range=[confData.graphSets["tsr"]["min"] if not self.common.isNone(
  48. confData.graphSets["tsr"]["min"]) else 0, confData.graphSets["tsr"]["max"] if not self.common.isNone(confData.graphSets["tsr"]["max"]) else 20], # 设置y轴的范围从0到1
  49. ),
  50. zaxis=dict(
  51. title='Cp',
  52. dtick=confData.graphSets["cp"]["step"] if not self.common.isNone(
  53. confData.graphSets["cp"]["step"]) else 0.5, # 设置y轴刻度间隔为0.1
  54. range=[confData.graphSets["cp"]["min"] if not self.common.isNone(
  55. confData.graphSets["cp"]["min"]) else 0, confData.graphSets["cp"]["max"] if not self.common.isNone(confData.graphSets["cp"]["max"]) else 2], # 设置y轴的范围从0到1
  56. )
  57. ),
  58. margin=dict(t=50, b=10) # t为顶部(top)间距,b为底部(bottom)间距
  59. )
  60. # 创建 3D 散点图
  61. fig = go.Figure(data=[go.Scatter3d(
  62. x=group[confData.field_pitch_angle1],
  63. y=group[Field_TSR],
  64. z=group[Field_Cp],
  65. mode='markers', # 设置模式为 markers,表示绘制散点图
  66. marker=dict(
  67. size=1, # 设置散点的大小
  68. # 你还可以设置其他属性,如颜色、透明度等
  69. # color='blue',
  70. # opacity=0.8
  71. )
  72. )], layout=layout) # 假设 layout 已经定义好了
  73. # 保存html
  74. outputFileHtml = os.path.join(outputAnalysisDir, f"{name}.html")
  75. fig.write_html(outputFileHtml)
  76. # 保存图表为HTML文件
  77. # offline.plot(fig, filename=outputFileHtml, auto_open=False)
  78. # 保存图像
  79. # output_file = os.path.join(outputAnalysisDir, f"{name}.png")
  80. # fig.write_image(output_file)