import pandas as pd  
import plotly.graph_objects as go  
from plotly.subplots import make_subplots  
  
# 假设你的DataFrame叫做df，并且已经包含了所需字段  
# 如果你的数据是CSV文件，可以使用pd.read_csv('your_file.csv')来加载数据  
# df = pd.read_csv('your_file.csv')  
  
# 示例数据  
data = {  
    '机组名': ['机组A', '机组B', '机组C', '机组D'],  
    '时间': ['2024-01-09 09:13:29', '2024-01-10 10:14:30', '2024-02-09 08:13:29', '2024-02-10 09:14:30'],  
    '年月': ['2024-01', '2024-01', '2024-02', '2024-02'],  
    '风速': [5.0, 6.0, 4.5, 5.5],  
    '有功功率': [1000, 1200, 900, 1100]  
}  
  
df = pd.DataFrame(data)  
  
# 创建颜色映射，将每个年月映射到一个唯一的颜色  
unique_months = df['年月'].unique()  
colors = [f'rgb({i}, {150 - i}, 50)' for i in range(len(unique_months))]  
color_map = dict(zip(unique_months, colors))  
  
# 使用make_subplots创建3D散点图  
fig = make_subplots(rows=1, cols=1, specs=[[{"type": "scatter3d"}]])  
  
# 遍历DataFrame的每一行，为每个点添加数据  
for index, row in df.iterrows():  
    x = row['风速']  
    y = row['年月']  
    z = row['有功功率']  
    color = color_map[y]  
      
    # 添加散点到子图  
    fig.add_trace(go.Scatter3d(x=[x], y=[y], z=[z], mode='markers', marker=dict(color=color)), row=1, col=1)  
  
# 更新子图的布局，设置y轴为category类型，并设置其类别顺序  
fig.update_layout(  
    title='3D散点图：风速、年月与有功功率',  
    margin=dict(l=0, r=0, b=0, t=0),  
    scene=dict(  
        xaxis=dict(title='风速'),  
        yaxis=dict(title='年月', tickmode='array', tickvals=unique_months, ticktext=unique_months, categoryorder='category ascending'),  
        zaxis=dict(title='有功功率')  
    )  
)  
  
# 显示图形  
fig.show()