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

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

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

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

Q&A

1回答

1164閲覧

pythonでワイヤーフレーム出力時,小数が混ざると出力されない

ryotk

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/02/14 05:23

編集2021/02/14 12:16

前提・実現したいこと

Pythonで3次元ワイヤーフレームを出力しようとしています.
エクセルから読み込む,X,Y,Z座標を使用しています.

以下のようなエラーが出て出力されませんでした.
データに小数が混ざるとエラーになるようですが,どうすれば出力できますでしょうか.

出力できたエクセルデータ
x y z
2 1 9
3 1 8
4 1 7
5 1 6
6 1 6
7 1 7
8 1 8
9 1 9
10 1 10
・・・

出力できないエクセルデータ
x y z
2 1 0.9
3 1 0.8
4 1 0.7
5 1 0.6
6 1 0.6
7 1 0.7
8 1 0.8
9 1 0.9
10 1 010

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

KeyError Traceback (most recent call last)
<ipython-input-22-f926eb29563d> in <module>
45 plt.show()
46 if name == 'main':
---> 47 wireframe_plot()

<ipython-input-22-f926eb29563d> in wireframe_plot(xidx, yidx, zidx, xlabel, ylabel, zlabel, title)
32 Z.append([])
33 for xUniqIdx, x in enumerate(xuniq):
---> 34 Z[yUniqIdx].append(zDict[(x, y)])
35 Z = np.array(Z)
36

KeyError: (1.0, 0.003)`

該当のソースコード

%matplotlib notebook
import pandas as pd
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_excel('sample.xls')

nmp=df.to_numpy().tolist()

nmp1=df_nom.to_numpy().tolist()
print(nmp)

_data = nmp# Array<Array<number>>

def wireframe_plot(xidx=0, yidx=1, zidx=2, xlabel='STA', ylabel='BL', zlabel='Deviation',
title=''):

xuniq = sorted(list(set(list(map(lambda x: x[xidx], _data))))) yuniq = sorted(list(set(list(map(lambda x: x[yidx], _data))))) X, Y = np.meshgrid(xuniq, yuniq) zDict = dict() for row in _data: zDict[(row[xidx], row[yidx])] = row[zidx] Z = [] for yUniqIdx, y in enumerate(yuniq): Z.append([]) for xUniqIdx, x in enumerate(xuniq): Z[yUniqIdx].append(zDict[(x, y)]) Z = np.array(Z) fig = plt.figure() ax = Axes3D(fig) ax.set_xlabel(xlabel, fontname="MS Gothic") ax.set_ylabel(ylabel, fontname="MS Gothic") ax.set_zlabel(zlabel, fontname="MS Gothic") ax.set_title(title, fontname="MS Gothic") surf=ax.plot_wireframe(X, Y, Z) plt.show()

if name == 'main':
wireframe_plot()

試したこと

エクセルの元データが整数であればワイヤーフレームの出力ができるところまでは確認しました.

補足情報(FW/ツールのバージョンなど)

jupyter notebookを使用しています.

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

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

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

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

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

ppaul

2021/02/14 10:44

ワイヤーフレームの出力ができたエクセルのデータの中身を載せてください。
ryotk

2021/02/14 12:17

コメントありがとうございます。 出力できたデータ・できなかったデータを前提欄に追記しました. ご確認お願い致します.
jbpb0

2021/02/14 19:51

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
guest

回答1

0

KeyError: (1.0, 0.003)
が出るということは、yの値として0.003があったことになります。
入力データのyがすべて1 であることと整合性がありません。

yuniq = sorted(list(set(list(map(lambda x: x[yidx], _data)))))
の下に、
print(yuniq)
を入れて実行すると何が表示されるでしょうか。
そこに0.003が含まれているなら、それよりも前にエラーがあるか、あるいは入力データが間違っています。

投稿2021/02/14 13:33

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問