🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4990閲覧

pythonで3Dカラーマップ表示について

bkts94441

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/10/31 06:10

編集2017/11/02 01:39

#目的
csv形式で保存している実験計測データをpythonのプログラミングによって3Dカラーマップ表示で実験の差異を可視化させたい。

#実現したいこと・問題点
計測データを3Dグラフで表示するプログラムが書けませんでした。
pythonについて知識が浅いため、csvファイルを読み込んで3Dグラフを表示させる必要モジュールが何かわかりません。
また、[該当データ.csv]の1つ上のディレクトリに存在する日付ファイルの日付を3DグラフのX軸に代入したいのですが、方法を考えられませんでした。

以上の問題を解決したいと思っています。お手数掛けますが、ご教授をお願い致します。

#target.csv内容

freq amp phase 1 0.664948882 458.4664087 3.13683197 2 1.329897764 1.083234728 1.19046451 3 1.994846646 1.639368087 0.28532487 . . . . . . . . . . . .

#該当ソースコード

# coding: UTF-8 import matplotlib.pyplot as plt import numpy as np import pandas as pd import os import glob from mpl_toolkits.mplot3d import Axes3D from scipy import genfromtxt #特定ファイルの検出,*は日別のファイルディレクトリ files = glob.glob("./*/datafile/target.csv") #グラフ描画の定義 fig = plt.figure(figsize=(30,15)) ########FFT3次元カラーマップ表示関数############# def colormapFFT(): #特定ファイルを特定パス内に存在する数だけグラフに描画 for i, file in enumerate(files,1): np = pd.read_csv(file, encoding="UTF-8") x = np.plot(x='*') #時間軸(該当データの1つ上のディレクトリ) y = np.plot(y='freq') #周波数(2列目) z = np.plot(z='amp') #振幅(3列目) #グラフ作成 fig = plt.figure() ax = Axes3D(fig) #グラフ描画 ax.plot(x,y,z) plt.tight_layout() plt.show() #################################### colormapFFT() #上記関数呼び出し

#使用環境
python3.5.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

magichan

2017/10/31 23:48

できましたら、各データ(target.csv)の形式を記述してください
bkts94441

2017/11/01 01:07

csvファイルの中身を追加致しました。
bkts94441

2017/11/02 01:11

申し訳ありません。解決済みとしてしまいましたが、説明内容に不備がありました。パス("./*/target.csv")となっていますが、正しくは、("./*/datafile/target.csv")でした。os.path.dirnameですと、1階層上のパスしか見られなくて、datafileを参照出来ません。色々思考しましたが上手く実行出来ませんでしたので、ご教授お願い致します。
bkts94441

2017/11/07 06:56

お礼のご返事が遅れてしまいまして申し訳ありません。この度は質問に回答して頂きありがとうございます。また、ご丁寧に解説して頂きプログラムの内容が理解しやすく助かりました。もしまた不明点がありましたら質問させて頂きますので、その際はよろしくお願い致します。
guest

回答1

0

ベストアンサー

各CSVデータを読み込んだ後

  1. 各日付ごとの DataFrame に対し 'date' Column を追加
  2. 上記の DataFrame を全て結合

し、その結合した DataFrameにて描写処理を行うとよいのではないでしょうか

Python

1import matplotlib.pyplot as plt 2from mpl_toolkits.mplot3d import Axes3D 3import pandas as pd 4import glob 5import os 6from datetime import datetime 7 8# 特定ファイルの検出,*は日別のファイルディレクトリ 9files = glob.glob("../*/target.csv") 10 11# 全てのDataFrameを読み込んだ後に結合 12df_list = [] 13for file in files: 14 date_str = os.path.split(os.path.dirname(file))[1] 15 # フォルダ名を日時データに変換 (formatは仕様に合わせてください) 16 date = datetime.strptime(date_str, '%Y%m%d') 17 tmp_df = pd.read_csv(file, encoding="UTF-8") 18 tmp_df['date'] = date 19 df_list.append(tmp_df) 20df = pd.concat(df_list, ignore_index=True) 21# print(df) 22 23# 3D Graphにて 日時データが入力できないようだったので変換 24xdata = df.date.astype('int64') // 10**9 25xbins = xdata.sort_values().unique() 26xformat = [datetime.fromtimestamp(d).strftime('%m/%d') for d in xbins] 27 28# 3Dグラフを表示(適当) 29ax = plt.gca(projection='3d') 30cm = ax.scatter(xdata, df['freq'], df['amp'], c=df['amp'], cmap='jet') 31ax.xaxis.set_ticks(xbins) 32ax.xaxis.set_ticklabels(xformat) 33plt.colorbar(cm) 34plt.tight_layout() 35plt.show()

【追記】

ターゲットのファイルが
files = glob.glob("./*/target.csv")
から
files = glob.glob("./*/datafile/target.csv")
に変更されたとのことなので、一応説明。

例えば、
file = "./AAA/BBB/CCC/target.csv"
の場合、
os.path.dirname(file)
を使うと
./AAA/BBB/CCC/target.csv から ./AAA/BBB/CCC を抜き出すことができます。

更にこの戻り値 ./AAA/BBB/CCCに対し
os.path.split()
を使うと
['./AAA/BBB', 'CCC'] と分割したリストを得ることができますので
このリストの2個目の要素を取得することで CCC を得ることができます。

つまり現状は

Python

1date_str = os.path.split(os.path.dirname(file))[1] 2# files = "./AAA/BBB/CCC/target.csv" 3# にて 'CCC' が得られる

という実装になっております。

で、今回は更に上の階層のフォルダ名は BBB を取得したいとのことですので、
上記リストの1番目の要素 ./AAA/BBB を更にもう一度
os.path.split()
を使うことにより ['./AAA', 'BBB'] に分割し、このリストの2番目の要素を使用するとよいのではないでしょうか。

つまり

Python

1date_str =os.path.split(os.path.split(os.path.dirname(file))[0])[1] 2# files = "./AAA/BBB/CCC/target.csv" 3# にて 'BBB' が得られる

に書き換えると良いと思います。

投稿2017/11/01 06:28

編集2017/11/02 02:47
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問