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!")