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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

761閲覧

pythonで3次元の折れ線グラフ作成時にエラーが出てしまう

iktm

総合スコア18

Matplotlib

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/01/08 23:37

前提・実現したいこと

csvデータからループ処理で三次元の折れ線グラフを作成しようとすると,エラーになってしまいます。
id_==1でbreakさせた場合はグラフが出力されますが,id_==2以降になると以下のようなエラーが発生します。
おそらくid_==2以降はインデックスの参照が0から開始されないためエラーになってしまうと思うのですが,上手く解決できませんでした。

発生しているエラーメッセージ

Traceback (most recent call last): File "C:/Users/XXXXXX/graph_line.py", line 26, in <module> ax.plot(xt, yt, zt) # id==2以降からエラーになってしまう File "C:\Users\XXXXXX\AppData\Local\Programs\Python\Python36-32\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 1524, in plot if len(args[0]) == 0 or cbook.is_scalar(args[0][0]) : File "C:\Users\XXXXXX\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\core\series.py", line 767, in __getitem__ result = self.index.get_value(self, key) File "C:\Users\XXXXXX\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\core\indexes\base.py", line 3118, in get_value tz=getattr(series.dtype, 'tz', None)) File "pandas\_libs\index.pyx", line 106, in pandas._libs.index.IndexEngine.get_value File "pandas\_libs\index.pyx", line 114, in pandas._libs.index.IndexEngine.get_value File "pandas\_libs\index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc File "pandas\_libs\hashtable_class_helper.pxi", line 958, in pandas._libs.hashtable.Int64HashTable.get_item File "pandas\_libs\hashtable_class_helper.pxi", line 964, in pandas._libs.hashtable.Int64HashTable.get_item KeyError: 0

該当のソースコード

python

1import matplotlib.pyplot as plt 2from mpl_toolkits.mplot3d import Axes3D 3import pandas as pd 4 5df = pd.read_csv('data.csv', names=('id', 'time', 'x', 'y', 'z')) 6fig = plt.figure() 7ax = fig.add_subplot(111, projection='3d') 8 9 10for id_ in df["id"].unique(): 11 tmp = df.query("id==@id_") 12 xt, yt, zt = tmp["x"], tmp["y"], tmp["z"] 13 ax.plot(xt, yt, zt) # id==2以降からエラーになってしまう 14 if id_ == 2: # id_==1までは作図可能 15 break 16 17plt.show()

###サンプルCSV
|id|time|x|y|z|
|:--|:--:|--:|
|1| 0| -2.107227| 0.7345147| -7.195769|
|1| 0.49733| -1.828499| 0.5122257| -7.120043|
|1| 0.9856975| -1.51933| 0.4999981| -7.063078|
|1| 1.491172| -1.213579| 0.4999981| -7.049526|
|1| 1.996647| -0.8575201| 0.4999981| -7.09712|
|1| 2.485592| -0.3712597| 0.499999| -7.088724|
|1| 2.990747| 0.1331902| 0.4999981| -7.085234|
|1| 3.496319| 0.5924625| 0.4999981| -7.098866|
|1| 3.985729| 1.065119| 0.4999981| -7.130569|
|1| 4.490369| 1.56337| 0.499999| -7.161113|
|2| 0| -5.27637| 0.7345147| -6.805758|
|2| 0.49733| -5.046183| 0.5122257| -6.86202|
|2| 0.9856975| -4.656722| 0.499999| -6.795047|
|2| 1.491172| -4.204307| 0.499999| -6.750597|
|2| 1.996647| -3.915286| 0.4999981| -6.715219|
|2| 2.485592| -3.619803| 0.4999981| -6.793261|
|2| 2.990747| -3.348916| 0.4999981| -6.751401|
|2| 3.496319| -3.089452| 0.4999981| -6.797764|
|2| 3.985729| -2.924153| 0.4999981| -6.867144|
|2| 4.490369| -2.642242| 0.4999981| -6.865789|

試したこと

ilocを使用して,
xt, yt, zt = tmp["x"].iloc[id_], tmp["y"].iloc[id_], tmp["z"].iloc[id_]
としてみたところ,TypeErrorが吐き出されました
Traceback (most recent call last):
File "C:/Users/XXXXXX/graph_line.py", line 26, in <module>
ax.plot(xt, yt, zt) # id==2以降からエラーになってしまう
File "C:\Users\XXXXXX\AppData\Local\Programs\Python\Python36-32\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 1535, in plot
zs = np.ones(len(xs)) * zs
TypeError: object of type 'numpy.float64' has no len()

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

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

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

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

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

guest

回答2

0

当方環境において提示ソースとCSVでは、見出し行がデータ行として扱われるので
ValueError: could not convert string to float: 'z'エラーが発生しました。

以下のようにheader=0を追加すると正常に描画できると思います。

Python

1df = pd.read_csv('data.csv', names=('id', 'time', 'x', 'y', 'z'),header=0) 2# 略

イメージ説明

投稿2019/01/09 01:22

can110

総合スコア38266

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

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

iktm

2019/01/09 01:26

回答ありがとうございます。 サンプルで提示したCSVは参考までにヘッダーを入力したもので,実際のデータはヘッダーなしとなっております。本来の問題はhayataka2049さんにご指摘いただいた内容で解決いたしました。
can110

2019/01/09 01:30

ヘッダー行ない場合は、こちらでもhayataka2049さんと同じく正常に描画できました。 python,pandas,matplotlibのバージョンの違いによるものかもしれません。
iktm

2019/01/09 03:00

コメントありがとうございます。モジュールのバージョンに関しては考えが及んでいなかったので,そのあたりも含めて過去のエラーが解決できるか再度トライしてみたいと思います。
guest

0

ベストアンサー

質問文のデータは問題なく処理できたので、実はどうして失敗しているのかよくわからないのですが。

完全に山勘ですが、numpy配列型にしてplotに渡せば上手く行ったりしませんか。

python

1 xt, yt, zt = tmp["x"].values, tmp["y"].values, tmp["z"].values

投稿2019/01/09 01:00

hayataka2049

総合スコア30933

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

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

iktm

2019/01/09 01:23

前回の質問に引き続きありがとうございます。 ご指摘いただいたようにnumpy配列型に変更したところid_==2以降のデータもすべて出力することに成功しました。何がいけなかったのでしょうか。
hayataka2049

2019/01/09 01:40

ただの山勘なので理由はお答えできませんが、pythonの科学技術計算等のライブラリで一般的に想定されるデータ型としてはnumpy配列がデファクトスタンダードになっています。pandasのSeriesで行けるときもありますが、噛み合わないこともままあります。
iktm

2019/01/09 02:57

ありがとうございます。今後はデータ型についてもしっかり確認していこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問