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

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

詳細はこちら
Matplotlib

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

Python 3.x

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

Q&A

解決済

1回答

791閲覧

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

bkts94441

総合スコア18

Matplotlib

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

Python 3.x

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

0グッド

2クリップ

投稿2017/11/15 07:09

編集2017/11/16 05:38

#実現したいこと
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サーフェスグラフ画像追加
イメージ説明

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

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

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

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

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

magichan

2017/11/15 07:46

1点質問です。Y軸の周波数データは各日時データで対応が取れているのでしょうか?(全ての日時データで同じ周波数値が使用されているのでしょうか?)
bkts94441

2017/11/15 08:18 編集

以前教えていただいたプログラムで実行したところ、問題なくY軸の周波数データは各日付別でデータが出力されています。
wakame

2017/11/15 12:13

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

2017/11/15 12:22

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

2017/11/15 12:22

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

回答1

0

ベストアンサー

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

Python

1import matplotlib.pyplot as plt 2import numpy as np 3import pandas as pd 4import os 5import glob 6from mpl_toolkits.mplot3d import Axes3D 7import matplotlib.dates as mpd 8from scipy import genfromtxt 9from datetime import datetime 10from pathlib import Path 11import sys 12 13#グローバル変数定義 14files = glob.glob("./*/data/target.csv") 15 16#グラフラベル 17def graphlabel(): 18 plt.xlabel("Frequency") 19 plt.ylabel("Amplitude") 20 21########################################## 22########FFT3次元カラーマップ図関数############# 23########################################## 24def ColormapFFT(): 25 #グラフ描画の定義 26 fig = plt.figure(figsize=(30,20)) 27 # 全てのDataFrameを読み込んだ後に結合 28 df_list = [] 29 for file in files: 30 date_str = os.path.split(os.path.split(os.path.dirname(file))[0])[1] 31 # フォルダ名を日時データに変換 32 date = datetime.strptime(date_str, '%Y%m%d') 33 tmp_df = pd.read_csv(file, encoding="UTF-8") 34 tmp_df['date'] = date 35 df_list.append(tmp_df) 36 df = pd.concat(df_list, ignore_index=True) 37 #print(df) 38 39 df['date'] = df['date'].map(mpd.date2num) 40 data = df.pivot('freq', 'date', 'amp') 41 #print(data) 42 x = data.columns.values 43 y = data.index.values 44 X,Y = np.meshgrid(x,y) 45 Z = data.as_matrix() 46 47 #3Dグラフを表示 48 ax = plt.gca(projection='3d') 49 surf = ax.plot_surface(X, Y, Z, cmap='jet') 50 ax.xaxis_date() 51 plt.colorbar(surf) 52 plt.tight_layout() 53 plt.show() 54################################################## 55ColormapFFT() #FFT3次元カラーマップ関数呼び出し

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

投稿2017/11/15 15:12

magichan

総合スコア15898

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

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

bkts94441

2017/11/16 06:15

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

2017/11/16 07:18

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

2017/11/17 00:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問