aaa - H3m1sphere/test GitHub Wiki
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import griddata import os
def read_all_csv_files(directory): dataframes = [] for filename in os.listdir(directory): if filename.endswith(".csv"): df = pd.read_csv(os.path.join(directory, filename)) dataframes.append(df) return dataframes
def read_csv_in_input(): return read_all_csv_files("./input")
def dataframe_to_list(df): df_melted = df.melt(id_vars=['x', 'y'], var_name='variable', value_name='value') df_list = [df_melted[df_melted['variable'] == col].drop('variable', axis=1) for col in df_melted['variable'].unique()] return df_list
def get_scale(df, scale_mode='individual', user_defined_range=None, df_list=None): if scale_mode == 'individual': return df['value'].min(), df['value'].max() elif scale_mode == 'shared': if df_list is None: raise ValueError("df_list must be provided for scale_mode 'shared'") global_min = min(df['value'].min() for df in df_list) global_max = max(df['value'].max() for df in df_list) return global_min, global_max elif scale_mode == 'user_defined': if user_defined_range is None: raise ValueError("user_defined_range must be provided for scale_mode 'user_defined'") return user_defined_range elif scale_mode == 'frequency_based': if df_list is None: raise ValueError("df_list must be provided for scale_mode 'frequency_based'") global_mode = df['value'].value_counts(bins=10).idxmax().mid global_width = max((df['value'].max() - df['value'].min() for df in df_list)) return global_mode - global_width / 2, global_mode + global_width / 2 else: raise ValueError(f"Invalid scale_mode: {scale_mode}")
def create_heatmap(df_list, scale_mode='individual', fixed_range=None): if isinstance(df_list, pd.DataFrame): df_list = [df_list]
figs = []
for df in df_list:
plt.rcParams['font.family'] = 'Tahoma'
# グリッドデータの生成
x = np.linspace(df['x'].min(), df['x'].max(), 50)
y = np.linspace(df['y'].min(), df['y'].max(), 50)
x_grid, y_grid = np.meshgrid(x, y)
# 補間
grid_z = griddata(df['x', 'y'](/H3m1sphere/test/wiki/'x',-'y'), df['value'], (x_grid, y_grid), method='cubic')
# スケールの設定
vmin, vmax = get_scale(df, scale_mode, fixed_range, df_list)
# ヒートマップの描画
im = plt.imshow(grid_z, extent=(df['x'].min(), df['x'].max(), df['y'].min(), df['y'].max()), origin='lower', aspect='auto', cmap='viridis', vmin=vmin, vmax=vmax)
plt.xticks(np.linspace(df['x'].min(), df['x'].max(), 5))
plt.yticks(np.linspace(df['y'].min(), df['y'].max(), 5))
# カラーバーの追加
cbar = plt.colorbar(im)
cbar.set_ticks(np.linspace(vmin, vmax, 7))
# 測定点を表す小さな丸を描画
plt.scatter(df['x'], df['y'], color='red', s=10)
# タイトルの追加
plt.title(str(df.columns[2]), fontsize=14)
plt.axis('equal')
plt.tight_layout()
figs.append(plt.gcf())
plt.show()
return figs
***** MAIN *****
file = read_csv_in_input() data = file[0]
data_list = dataframe_to_list(data)
create_heatmap(data_list,'frequency_based')
print("Done!") print("over!")