import pandas as pd import numpy as np import plotly.graph_objects as go import plotly.express as px import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import matplotlib.colors as mcolors import os # Set the style for better visualization plt.style.use('seaborn-v0_8-darkgrid') # Read the data df = pd.read_csv('محاسبات 2.csv') # Function to clean and prepare the data def prepare_data(df): # Split the data into two dataframes (area and production) area_df = df.iloc[:33].copy() production_df = df.iloc[34:].copy() # Clean the data area_df = area_df.dropna(subset=['اداره']) production_df = production_df.dropna(subset=['تولید']) # Rename columns for consistency production_df = production_df.rename(columns={'تولید': 'اداره'}) # Melt the dataframes to get long format area_melted = pd.melt(area_df, id_vars=['اداره', 'سن'], value_vars=['CP69', 'CP73', 'CP48', 'CP57', 'CP65', 'CP70', 'IR01-412', 'IRC99-07', 'IRC00-14'], var_name='واریته', value_name='مساحت') production_melted = pd.melt(production_df, id_vars=['اداره', 'سن'], value_vars=['CP69', 'CP73', 'CP48', 'CP57', 'CP65', 'CP70', 'IR01-412', 'IRC99-07', 'IRC00-14'], var_name='واریته', value_name='تولید') # Merge the dataframes merged_df = pd.merge(area_melted, production_melted, on=['اداره', 'سن', 'واریته']) # Convert numeric columns to float merged_df['مساحت'] = pd.to_numeric(merged_df['مساحت'], errors='coerce') merged_df['تولید'] = pd.to_numeric(merged_df['تولید'], errors='coerce') # Fill NaN values with 0 merged_df = merged_df.fillna(0) return merged_df # Prepare the data data = prepare_data(df) # Create output directory if it doesn't exist os.makedirs('visualizations', exist_ok=True) # 1. 3D Surface Histogram for Area by Department, Age, and Variety def create_3d_surface_area(): # Create a pivot table for the 3D surface pivot_data = data.pivot_table( values='مساحت', index='سن', columns='واریته', aggfunc='sum' ).fillna(0) # Create the 3D surface plot fig = go.Figure(data=[go.Surface( x=pivot_data.columns, y=pivot_data.index, z=pivot_data.values, colorscale='Viridis', showscale=True, colorbar=dict(title='مساحت (هکتار)') )]) # Update layout fig.update_layout( title='توزیع مساحت به تفکیک سن و واریته', scene=dict( xaxis_title='واریته', yaxis_title='سن', zaxis_title='مساحت (هکتار)', camera=dict( eye=dict(x=1.5, y=1.5, z=1.5) ) ), width=1000, height=800, font=dict(family="Vazirmatn, Arial", size=14) ) # Save the figure fig.write_html('visualizations/3d_surface_area.html') fig.write_image('visualizations/3d_surface_area.png', scale=2) return fig # 2. 3D Surface Histogram for Production by Department, Age, and Variety def create_3d_surface_production(): # Create a pivot table for the 3D surface pivot_data = data.pivot_table( values='تولید', index='سن', columns='واریته', aggfunc='sum' ).fillna(0) # Create the 3D surface plot fig = go.Figure(data=[go.Surface( x=pivot_data.columns, y=pivot_data.index, z=pivot_data.values, colorscale='Plasma', showscale=True, colorbar=dict(title='تولید (تن)') )]) # Update layout fig.update_layout( title='توزیع تولید به تفکیک سن و واریته', scene=dict( xaxis_title='واریته', yaxis_title='سن', zaxis_title='تولید (تن)', camera=dict( eye=dict(x=1.5, y=1.5, z=1.5) ) ), width=1000, height=800, font=dict(family="Vazirmatn, Arial", size=14) ) # Save the figure fig.write_html('visualizations/3d_surface_production.html') fig.write_image('visualizations/3d_surface_production.png', scale=2) return fig # 3. Area Chart by Department and Age def create_area_chart_by_dept_age(): # Group by department and age dept_age_data = data.groupby(['اداره', 'سن'])['مساحت'].sum().reset_index() # Create the area chart fig = px.area( dept_age_data, x='سن', y='مساحت', color='اداره', title='مساحت به تفکیک اداره و سن', labels={'مساحت': 'مساحت (هکتار)', 'سن': 'سن', 'اداره': 'اداره'}, color_discrete_sequence=px.colors.qualitative.Set3 ) # Update layout fig.update_layout( width=1000, height=600, font=dict(family="Vazirmatn, Arial", size=14), legend=dict( orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1 ) ) # Save the figure fig.write_html('visualizations/area_chart_by_dept_age.html') fig.write_image('visualizations/area_chart_by_dept_age.png', scale=2) return fig # 4. Area Chart by Department and Variety def create_area_chart_by_dept_variety(): # Group by department and variety dept_variety_data = data.groupby(['اداره', 'واریته'])['مساحت'].sum().reset_index() # Create the area chart fig = px.area( dept_variety_data, x='واریته', y='مساحت', color='اداره', title='مساحت به تفکیک اداره و واریته', labels={'مساحت': 'مساحت (هکتار)', 'واریته': 'واریته', 'اداره': 'اداره'}, color_discrete_sequence=px.colors.qualitative.Set3 ) # Update layout fig.update_layout( width=1000, height=600, font=dict(family="Vazirmatn, Arial", size=14), legend=dict( orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1 ) ) # Save the figure fig.write_html('visualizations/area_chart_by_dept_variety.html') fig.write_image('visualizations/area_chart_by_dept_variety.png', scale=2) return fig # 5. 3D Bar Chart for Area by Department, Age, and Variety def create_3d_bar_chart(): # Create a figure fig = plt.figure(figsize=(15, 10)) ax = fig.add_subplot(111, projection='3d') # Get unique values departments = data['اداره'].unique() ages = data['سن'].unique() varieties = data['واریته'].unique() # Create a color map colors = plt.cm.viridis(np.linspace(0, 1, len(varieties))) # Create the 3D bar chart for i, dept in enumerate(departments): for j, age in enumerate(ages): for k, variety in enumerate(varieties): # Get the value value = data[(data['اداره'] == dept) & (data['سن'] == age) & (data['واریته'] == variety)]['مساحت'].values if len(value) > 0 and value[0] > 0: # Create the bar ax.bar3d(i, j, k, 0.8, 0.8, value[0], color=colors[k], alpha=0.8) # Set labels ax.set_xlabel('اداره') ax.set_ylabel('سن') ax.set_zlabel('مساحت (هکتار)') # Set ticks ax.set_xticks(np.arange(len(departments)) + 0.4) ax.set_xticklabels(departments) ax.set_yticks(np.arange(len(ages)) + 0.4) ax.set_yticklabels(ages) # Set title plt.title('توزیع مساحت به تفکیک اداره، سن و واریته', fontsize=16) # Add a colorbar sm = plt.cm.ScalarMappable(cmap=plt.cm.viridis, norm=plt.Normalize(vmin=0, vmax=len(varieties)-1)) sm.set_array([]) cbar = plt.colorbar(sm, ax=ax, pad=0.1) cbar.set_label('واریته') cbar.set_ticks(np.arange(len(varieties))) cbar.set_ticklabels(varieties) # Save the figure plt.tight_layout() plt.savefig('visualizations/3d_bar_chart.png', dpi=300, bbox_inches='tight') return fig # 6. Heatmap for Area by Department and Age def create_heatmap_area(): # Create a pivot table for the heatmap pivot_data = data.pivot_table( values='مساحت', index='اداره', columns='سن', aggfunc='sum' ).fillna(0) # Create the heatmap fig = go.Figure(data=go.Heatmap( z=pivot_data.values, x=pivot_data.columns, y=pivot_data.index, colorscale='Viridis', colorbar=dict(title='مساحت (هکتار)') )) # Update layout fig.update_layout( title='مساحت به تفکیک اداره و سن', xaxis_title='سن', yaxis_title='اداره', width=900, height=600, font=dict(family="Vazirmatn, Arial", size=14) ) # Save the figure fig.write_html('visualizations/heatmap_area.html') fig.write_image('visualizations/heatmap_area.png', scale=2) return fig # 7. Heatmap for Production by Department and Age def create_heatmap_production(): # Create a pivot table for the heatmap pivot_data = data.pivot_table( values='تولید', index='اداره', columns='سن', aggfunc='sum' ).fillna(0) # Create the heatmap fig = go.Figure(data=go.Heatmap( z=pivot_data.values, x=pivot_data.columns, y=pivot_data.index, colorscale='Plasma', colorbar=dict(title='تولید (تن)') )) # Update layout fig.update_layout( title='تولید به تفکیک اداره و سن', xaxis_title='سن', yaxis_title='اداره', width=900, height=600, font=dict(family="Vazirmatn, Arial", size=14) ) # Save the figure fig.write_html('visualizations/heatmap_production.html') fig.write_image('visualizations/heatmap_production.png', scale=2) return fig # 8. Stacked Bar Chart for Area by Department and Variety def create_stacked_bar_chart(): # Create a pivot table for the stacked bar chart pivot_data = data.pivot_table( values='مساحت', index='اداره', columns='واریته', aggfunc='sum' ).fillna(0) # Create the stacked bar chart fig = go.Figure() for variety in pivot_data.columns: fig.add_trace(go.Bar( name=variety, x=pivot_data.index, y=pivot_data[variety], text=pivot_data[variety].round(1), textposition='auto', )) # Update layout fig.update_layout( title='مساحت به تفکیک اداره و واریته', xaxis_title='اداره', yaxis_title='مساحت (هکتار)', barmode='stack', width=1000, height=600, font=dict(family="Vazirmatn, Arial", size=14), legend=dict( orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1 ) ) # Save the figure fig.write_html('visualizations/stacked_bar_chart.html') fig.write_image('visualizations/stacked_bar_chart.png', scale=2) return fig # 9. 3D Scatter Plot for Area, Production, and Age def create_3d_scatter_plot(): # Create the 3D scatter plot fig = go.Figure(data=[go.Scatter3d( x=data['مساحت'], y=data['تولید'], z=data['سن'].map(lambda x: {'P': 0, 'R1': 1, 'R2': 2, 'R3': 3, 'R4': 4, 'R5': 5, 'R6': 6, 'R7': 7, 'R8': 8, 'R9': 9}.get(x, 0)), mode='markers', marker=dict( size=8, color=data['اداره'].map({'1': 0, '2': 1, '3': 2, '4': 3, 'دهخدا': 4}), colorscale='Viridis', opacity=0.8 ), text=data['واریته'], hovertemplate="واریته: %{text}
" + "مساحت: %{x:.2f} هکتار
" + "تولید: %{y:.2f} تن
" + "سن: %{z}
" + "" )]) # Update layout fig.update_layout( title='رابطه بین مساحت، تولید و سن', scene=dict( xaxis_title='مساحت (هکتار)', yaxis_title='تولید (تن)', zaxis_title='سن', zaxis=dict( ticktext=['P', 'R1', 'R2', 'R3', 'R4', 'R5', 'R6', 'R7', 'R8', 'R9'], tickvals=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ) ), width=1000, height=800, font=dict(family="Vazirmatn, Arial", size=14) ) # Save the figure fig.write_html('visualizations/3d_scatter_plot.html') fig.write_image('visualizations/3d_scatter_plot.png', scale=2) return fig # Generate all visualizations def generate_all_visualizations(): print("Generating 3D Surface Histogram for Area...") create_3d_surface_area() print("Generating 3D Surface Histogram for Production...") create_3d_surface_production() print("Generating Area Chart by Department and Age...") create_area_chart_by_dept_age() print("Generating Area Chart by Department and Variety...") create_area_chart_by_dept_variety() print("Generating 3D Bar Chart...") create_3d_bar_chart() print("Generating Heatmap for Area...") create_heatmap_area() print("Generating Heatmap for Production...") create_heatmap_production() print("Generating Stacked Bar Chart...") create_stacked_bar_chart() print("Generating 3D Scatter Plot...") create_3d_scatter_plot() print("All visualizations have been generated and saved to the 'visualizations' directory.") # Run the function to generate all visualizations if __name__ == "__main__": generate_all_visualizations()