前提・実現したいこと
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を使用しています.