質問: pandasでcsvファイルを読み込んで3Dのサーフェスのグラフを作りたいのですが、x,y,z成分に当たる要素をcsvファイルからどう割り当てればいいかわかりません。 csvファイルは、 ``` NAN 10,20,30,40,50,60,70,80,90 1 x x x x x x x x x 2 x x x x x x x x x 3 x x x x x x x x x 4 x x x x x x x x x 5 x x x x x x x x x ``` となっていて(ずれてますが6×10の行列の形です)、xのところにz成分の値が入り, x軸を一行目の10~90 y軸を一列目の1~5としたいです。 よろしくお願いいたします。
回答: サンプルプログラム ``` import pandas as pd from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np # CSVからデータを読み込む data = pd.read_csv('./example.csv', delim_whitespace=True, header=0) # 3Dグラフの初期化 fig = plt.figure() ax = fig.gca(projection='3d') # データの準備 Xgrid = data.columns.values.astype(np.float32) Ygrid = data.index.values.astype(np.float32) X, Y = np.meshgrid(Xgrid, Ygrid) Z = data.as_matrix() # プロット surf = ax.plot_surface(X, Y, Z) # 必要な場合はここでその他の設定をします。 # 表示 plt.show() ``` example.csv ``` 10 20 30 40 50 60 70 80 90 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 ``` 表示結果 !サンプルのプロット結果です 実行した環境: Ubuntu 17.04, Python 3.6.0, pandas 0.19.2, matplotlib 2.0.0, numpy 1.13.1 解説 サンプルのプログラムを書いてみました。ポイントは「どうやってCSVを読み込むか」と「どうやって3Dサーフェスプロットするか」です。 pandas で CSV を読み込むには `read_csv()` を使います。CSV のフォーマットに合わせて適当にオプションを設定する必要があります。 3Dプロットに関しては、matplotlib の公式チュートリアルが参考になります。具体的には "Surface plots" の節にあるサンプルがぴったしです。ソースコードも置いてあるので分かりやすいと思います。上に書いたソースコードはとりあえずデフォルトで表示させているだけですが、サーフェスの色など細かい設定をしたい場合はチュートリアルのソースコードを見ながらコードを追加すると良いでしょう。 細かい部分についても多少書いておきます。今回はCSVのデリミタが半角スペース複数文字のときを考えているので、そうなるように `delim_whitespace` 引数で設定します。CSVがカンマ区切りであればこれは必要ありません。詳しくは「pandas スペース区切り」などで検索してください。また、ヘッダー行が先頭のみであることが分かっているので、`header` 引数でついでに設定しています。その後「データの準備」の部分ではX軸・Y軸に相当する部分(グリッド)を作成しています。今回は dataframe の行・列ラベルをそのまま軸として使用しています。ただし場合によっては型 (dtype) を合わせておかないとエラーが出るため、最後の `astype()` で念の為 float32 にキャストしています。ここは float32 でなくても構いません。適当です。 参考 公式の解説です。 * pandas.read_csv -- pandas 0.20.3 documentation * mplot3d tutorial また、以下のような解説サイトは「pandas csv」や「matplotlib 3d」などで検索すると簡単に出てくるので、ひとまず検索してみるのもオススメです。 * CSVファイルの扱い -- pandasでよく使う文法まとめ -- Qiita * CSV, TSV を開く -- pandasの使い方まとめ -- Qiita * matplotlibで3Dプロット -- Qiita * Matplotlibで3Dグラフを描く -- Qiita