質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.52%

  • Python 3.x

    6316questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 983

bkts94441

score 11

目的

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • magichan

    2017/11/01 08:48

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

    キャンセル

  • bkts94441

    2017/11/01 10:07

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

    キャンセル

  • bkts94441

    2017/11/02 10:11

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

    キャンセル

  • bkts94441

    2017/11/07 15:56

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

    キャンセル

回答 1

checkベストアンサー

+2

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

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

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

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
import glob
import os
from datetime import datetime

# 特定ファイルの検出,*は日別のファイルディレクトリ
files = glob.glob("../*/target.csv")

# 全てのDataFrameを読み込んだ後に結合
df_list = []
for file in files:
    date_str = os.path.split(os.path.dirname(file))[1]
    # フォルダ名を日時データに変換 (formatは仕様に合わせてください)
    date = datetime.strptime(date_str, '%Y%m%d')
    tmp_df = pd.read_csv(file, encoding="UTF-8")
    tmp_df['date'] = date
    df_list.append(tmp_df)
df = pd.concat(df_list, ignore_index=True)
# print(df)

# 3D Graphにて 日時データが入力できないようだったので変換
xdata = df.date.astype('int64') // 10**9
xbins  = xdata.sort_values().unique()
xformat = [datetime.fromtimestamp(d).strftime('%m/%d') for d in xbins]

# 3Dグラフを表示(適当)
ax = plt.gca(projection='3d')
cm = ax.scatter(xdata, df['freq'], df['amp'], c=df['amp'], cmap='jet')
ax.xaxis.set_ticks(xbins)
ax.xaxis.set_ticklabels(xformat)
plt.colorbar(cm)
plt.tight_layout()
plt.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 を得ることができます。

つまり現状は

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


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

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

つまり

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    matplotlibで横軸のラベルを縦書きにしたい

    pythonのmatplotライブラリの質問です. あるグラフを作成する際に,横軸のラベルを日本語の文字列にしています. デフォルトだと,文字列は横書きで表示されるのですが

  • 受付中

    Matplotlib(Python)のフォントに関して

    前提・実現したいこと Pythonのmatplotlibについて、フォントに関する質問があります。x軸とy軸のラベルフォントを「sans-serif」に設定した上で一部の文字を斜

  • 解決済

    三次元グラフ同時に表示できるようにしたい

    前提・実現したいこと 同時に2枚(またはそれ以上)表示されるようにしたい 発生している問題・エラーメッセージ 2枚表示はされるが完全に重なった位置に表示されてしまうため、

  • 解決済

    グラフへの自動プロット

    いつもお世話になっております。 前提・実現したいこと プログラム(グラフ)を実行した状態のままCSVファイル(aiueo.csv)に値を追加(削除)した時に実行中のファイルに値

  • 受付中

    大量のCSVデータの処理方法

    100個ほどCSVファイルがあり、 それぞれのファイルで、30×30のセルに数値が入力されています。 この100個のCSVファイルに対して、同じセル座標について最大値最小値を計算し

  • 解決済

    pythonで特定のパス内に存在する複数の特定のcsvファイルのグラフ出力について

    前提・実現したいこと 現在、大学のゼミで行っている実験で得たデータを、pythonでデータをまとめて管理を行っています。 そこで、pythonで日付ごとに分けたデータを特定のフ

  • 解決済

    python 3Dサーフェスグラフのプログラムについて

    実現したいこと 3D散布図でグラフを描画していましたが、それを3Dサーフェスグラフにして描画したいです。 問題点 エラーコードAttributeError: Unknown p

  • 解決済

    Pandas Dataframe で column毎に indexを設定してグラフ化したい

    前提・実現したいこと 任意の波形を組み合わせて 比較分析する際、データの検索や表示がエクセルでは重くなりすぎて扱いづらく、 Python・Pandas で解決できないか考えています

同じタグがついた質問を見る

  • Python 3.x

    6316questions

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