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

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

ただいまの
回答率

90.75%

  • Python 3.x

    5332questions

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

  • Matplotlib

    250questions

    MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 503

bkts94441

score 11

実現したいこと

3D散布図でグラフを描画していましたが、それを3Dサーフェスグラフにして描画したいです。

問題点

エラーコードAttributeError: Unknown property cと出力されてしまいます。また、エラー内容を辿ろうとしたものの、プログラムがどのように動作しているか理解しておらず、手を付けることが出来ませんでした。修正箇所の指摘をお願い致します。

参照URL

プログラムは以前質問した内容から引用していますので、参照したURLを載せます。
https://teratail.com/questions/98585

ソースコード

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
from datetime import datetime
from pathlib import Path
import sys

#グローバル変数定義
files = glob.glob("./*/data/target.csv")

#グラフラベル
def graphlabel():
    plt.xlabel("Frequency")
    plt.ylabel("Amplitude")

##########################################
########FFT3次元カラーマップ図関数#############
##########################################
def ColormapFFT():
    #グラフ描画の定義
    fig = plt.figure(figsize=(30,20))
    # 全てのDataFrameを読み込んだ後に結合
    df_list = []
    for file in files:
        date_str = os.path.split(os.path.split(os.path.dirname(file))[0])[1]
        # フォルダ名を日時データに変換
        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')
    surf = ax.plot_surface(xdata, df['freq'], df['amp'], c=df['amp'], cmap='jet')
    ax.xaxis.set_ticks(xbins)
    ax.xaxis.set_ticklabels(xformat)
    plt.colorbar(surf)
    plt.tight_layout()
    plt.show()
##################################################
ColormapFFT() #FFT3次元カラーマップ関数呼び出し

エラーコード

AttributeError                            Traceback (most recent call last)
<ipython-input-1-5f90f47f22c7> in <module>()
     46     plt.show()
     47 ##################################################
---> 48 ColormapFFT() #FFT3次元カラーマップ関数呼び出し

<ipython-input-1-5f90f47f22c7> in ColormapFFT()
     39     #3Dグラフを表示
     40     ax = plt.gca(projection='3d')
---> 41     surf = ax.plot_surface(xdata, df['freq'], df['amp'], c=df['amp'], cmap='jet')
     42     ax.xaxis.set_ticks(xbins)
     43     ax.xaxis.set_ticklabels(xformat)

C:.\Local\Continuum\Anaconda2\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py in plot_surface(self, X, Y, Z, *args, **kwargs)
   1657             normals = []
   1658 
-> 1659         polyc = art3d.Poly3DCollection(polys, *args, **kwargs)
   1660 
   1661         if fcolors is not None:

C:.\Local\Continuum\Anaconda2\lib\site-packages\mpl_toolkits\mplot3d\art3d.py in __init__(self, verts, *args, **kwargs)
    517         '''
    518         zsort = kwargs.pop('zsort', True)
--> 519         PolyCollection.__init__(self, verts, *args, **kwargs)
    520         self.set_zsort(zsort)
    521         self._codes3d = None

C:.\Local\Continuum\Anaconda2\lib\site-packages\matplotlib\collections.py in __init__(self, verts, sizes, closed, **kwargs)
    863         %(Collection)s
    864         """
--> 865         Collection.__init__(self, **kwargs)
    866         self.set_sizes(sizes)
    867         self.set_verts(verts, closed)

C:.\Local\Continuum\Anaconda2\lib\site-packages\matplotlib\collections.py in __init__(self, edgecolors, facecolors, linewidths, linestyles, antialiaseds, offsets, transOffset, norm, cmap, pickradius, hatch, urls, offset_position, zorder, **kwargs)
    137 
    138         self._path_effects = None
--> 139         self.update(kwargs)
    140         self._paths = None
    141 

C:.\Local\Continuum\Anaconda2\lib\site-packages\matplotlib\artist.py in update(self, props)
    854                 func = getattr(self, 'set_' + k, None)
    855                 if func is None or not six.callable(func):
--> 856                     raise AttributeError('Unknown property %s' % k)
    857                 func(v)
    858             changed = True

AttributeError: Unknown property c

3Dサーフェスグラフ画像追加

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • wakame

    2017/11/15 21:13

    エラーコードAttributeError: Unknown property cと出力されてしまいます。出力されたコードはこれだけですか?もう少し吐き出されると思うのですが・・・あれば質問内容に全て記載するようにしてください。

    キャンセル

  • bkts94441

    2017/11/15 21:22

    失礼致しました。明日エラーコード内容を記載致します。

    キャンセル

  • bkts94441

    2017/11/15 21:22

    失礼致しました。明日エラーコード内容を記載致します。

    キャンセル

回答 1

checkベストアンサー

+2

とりあえず修正してみました。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import os
import glob
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.dates as mpd
from scipy import genfromtxt
from datetime import datetime
from pathlib import Path
import sys

#グローバル変数定義
files = glob.glob("./*/data/target.csv")

#グラフラベル
def graphlabel():
    plt.xlabel("Frequency")
    plt.ylabel("Amplitude")

##########################################
########FFT3次元カラーマップ図関数#############
##########################################
def ColormapFFT():
    #グラフ描画の定義
    fig = plt.figure(figsize=(30,20))
    # 全てのDataFrameを読み込んだ後に結合
    df_list = []
    for file in files:
        date_str = os.path.split(os.path.split(os.path.dirname(file))[0])[1]
        # フォルダ名を日時データに変換
        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)

    df['date'] = df['date'].map(mpd.date2num)
    data = df.pivot('freq', 'date', 'amp')
    #print(data)
    x = data.columns.values
    y = data.index.values
    X,Y = np.meshgrid(x,y)
    Z = data.as_matrix()

    #3Dグラフを表示
    ax = plt.gca(projection='3d')
    surf = ax.plot_surface(X, Y, Z, cmap='jet')
    ax.xaxis_date()
    plt.colorbar(surf)
    plt.tight_layout()
    plt.show()
##################################################
ColormapFFT() #FFT3次元カラーマップ関数呼び出し

plot_surface() の場合、データを時間軸と周波数軸で格子状に並べた2次元データにする必要があります。
ですので、pandas.pivot() で DataFrameをpivot tableに変換した後に2次元配列の形に変換してZのデータ渡すようにします。
また、X,Yのデータはnumpy.meshgrid()で作成できます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/16 15:15

    ご回答ありがとうございます。詳しく教えていただいて理解も深まり、3Dサーフェスグラフの出力が出来ました。読み込んだCSVファイルで、異常値は赤色の出力を想定していたのですが、青色になっているのでグラフのラベルの値を変更したのですが、どの関数を使用するか教えていただけないでしょうか。

    キャンセル

  • 2017/11/16 16:18

    Z値(amp)の値に対する色は plot_surface() の引数 cmap で指定します。
    現在 'jet' が指定されておりますので
    https://matplotlib.org/examples/color/colormaps_reference.html
    を参考に、好みに応じて変更してください。
    次に、上記 ColorMapとZ値の対応は、plot_surface() の引数に vmax, vmin 引数を指定することで変更できます。

    キャンセル

  • 2017/11/17 09:26

    丁寧に教えていただき、誠にありがとうございます。色合いがZ値のcmapで指定しているとは知りませんでした。また、範囲指定はplot_surface()の引数で出来たのですね。お陰様で理想のグラフを描画することが出来ました、ありがとうございました。

    キャンセル

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

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

関連した質問

  • 解決済

    matplotlib.pyplot.scatter で軸の値を変更

    前提・実現したいこと 現在、pythonでmatplotlib.pyplot.scatterを用いて散布図を書こうとしています。 そのときに、軸の値を変更する方法を知りたいです。

  • 解決済

    グラフへの自動プロット

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

  • 解決済

    ImportErrorが解消できない件

    以下に記すエラーの解消方法が分からないのでアドバイスを頂きたいです。 pythonのバージョンに合ったnumpyをインストールしていない時に出るエラーだと思います。 pipでmat

  • 解決済

    クラスタ毎の色変更ができません

    前提・実現したいこと クラスタリングの勉強をしています. scikit-learnでクラスタリングしようと思っています. 下記の2つの記事を参考にさせていただいています. こちらの

  • 解決済

    matplotlib contourマップの値の制限とanimation

    import numpy as np import matplotlib.pyplot as plt E=np.zeros((10,10)) for i in range(1,1

  • 解決済

    matplotlibの値が0の点の非表示

    from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np

  • 受付中

    python3 seabornが反映されない

    前提・実現したいこと python3.6系にseaborn(ver. 0.8.1)をpipからインストールし,以下の簡単な ヒストグラムを描画してみたのですが,結果の図がmatpl

  • 解決済

    python棒グラフの順番

     前提・実現したいこと 数値とラベルを持つあるデータをについて、数値でソートして その結果を棒グラフとして出力したいと思っています。  発生している問題・エラーメッセージ ソー

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

  • Python 3.x

    5332questions

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

  • Matplotlib

    250questions

    MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。