teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正

2020/01/30 04:37

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -20,8 +20,8 @@
20
20
  - 3次元空間上`x,y,z`の一定範囲内に格子状に配置された点があり、各点ごとになんらかの値を持っている。
21
21
 
22
22
  意図(欲しい結果)として
23
- - 各座標軸に直行する平面ごとに、ある高さで平面を抽出する。
23
+ - 各座標軸に直行する平面ごとに、ある高さで平面上の)点を抽出する。
24
- - その平面上の値の大小を高さ方向として表示する
24
+ - その平面上の点が持つ値を高さ方向として表示する
25
25
 
26
26
  といった感じですかね。
27
27
 

1

追記

2020/01/30 04:37

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -10,4 +10,88 @@
10
10
  print(dataXY.shape) # (42の倍数, 4)であるはず!
11
11
  gridX = dataXY[:,0].reshape((42,-1))
12
12
  gridY = dataXY[:,1].reshape((42,-1))
13
- ```
13
+ ```
14
+
15
+ 追記
16
+ -----
17
+ ちょっとこの問題の前提、意図を考えてみたのですが
18
+
19
+ 前提として
20
+ - 3次元空間上`x,y,z`の一定範囲内に格子状に配置された点があり、各点ごとになんらかの値を持っている。
21
+
22
+ 意図(欲しい結果)として
23
+ - 各座標軸に直行する平面ごとに、ある高さで平面を抽出する。
24
+ - その平面上の値の大小を高さ方向として表示する
25
+
26
+ といった感じですかね。
27
+
28
+ とすると描画のためのグリッド座標を求めるための`reshape`数って各平面ごとに異なる値を与えるべきなんじゃないかと思います。
29
+ 以下、簡単な検証コードと結果例です。
30
+ ```Python
31
+ import numpy as np
32
+ import matplotlib.pyplot as plt
33
+ from mpl_toolkits.mplot3d import Axes3D
34
+ import itertools
35
+
36
+ XYZ = [3,4,5] # 各軸の点の数
37
+ C = 0 # 描画対象の基準面からの高さ
38
+
39
+ # テストデータ
40
+ data = []
41
+ for xyz in itertools.product(*[list(range(i)) for i in XYZ]):
42
+ data.append((*xyz,1)) # とりあえず値は全部1に
43
+ data = np.array(data)
44
+
45
+ # 特定の点だけ分かりやすいように値を変える
46
+ data[ (data[:,0] == C) & (data[:,1] == 1) & (data[:,2] == 2),3] = 2 # X=C のYZ平面(1,2)上の点の値
47
+ data[ (data[:,0] == 1) & (data[:,1] == C) & (data[:,2] == 2),3] = 3 # Y=C のXZ平面(1,2)上の点の値
48
+ data[ (data[:,0] == 1) & (data[:,1] == 2) & (data[:,2] == C),3] = 4 # Z=C のXY平面(1,2)上の点の値
49
+
50
+
51
+ # X,Y,Z軸に直行する平面の順に表示する
52
+ for i in range(3):
53
+ fig = plt.figure()
54
+ ax = fig.add_subplot(111, projection='3d')
55
+
56
+ # 平面を構成する2つの軸の列位置
57
+ col = [0,1,2]
58
+ del col[i]
59
+
60
+ # 平面の軸ラベル
61
+ label = ['X','Y','Z']
62
+ del label[i]
63
+
64
+ # 描画のためのreshape数
65
+ xyz = XYZ.copy()
66
+ del xyz[i]
67
+ reshape_cnt = xyz[0]
68
+
69
+ # X(orYorZ) = C 上の平面上の点のみ抽出
70
+ data01 = data[data[:,i]==C,:]
71
+
72
+ # 描画用の座標を取得
73
+ grid0 = data01[:,col[0]].reshape((reshape_cnt,-1))
74
+ grid1 = data01[:,col[1]].reshape((reshape_cnt,-1))
75
+ out = data01[:,3].reshape((reshape_cnt,-1))
76
+
77
+ # 確認表示
78
+ print('i={}, {}平面, line cnt={}, reshape_cnt={}, shape={}'.format(i, label, data01.shape[0], reshape_cnt, grid0.shape))
79
+
80
+ #i=0, ['Y', 'Z']平面, line cnt=20, reshape_cnt=4, shape=(4, 5)
81
+ #i=1, ['X', 'Z']平面, line cnt=15, reshape_cnt=3, shape=(3, 5)
82
+ #i=2, ['X', 'Y']平面, line cnt=12, reshape_cnt=3, shape=(3, 4)
83
+
84
+ # 軸の設定
85
+ ax.set_xlabel(label[0] + "-axis")
86
+ ax.set_xticks(range(max(XYZ)))
87
+ ax.set_ylabel(label[1] + "-axis")
88
+ ax.set_yticks(range(max(XYZ)))
89
+ ax.set_zlabel("Value-axis")
90
+ ax.set_zticks(range(max(XYZ)))
91
+
92
+ surf = ax.scatter(grid0, grid1, out, cmap='bwr')
93
+ plt.savefig('ret_{}_{}.png'.format(i,''.join(label)),transparent=True)
94
+ ```
95
+ ![イメージ説明](a124d4563963fdb2bd2dbd09b508ef49.png)
96
+ ![イメージ説明](2200e7bf212b0f99f28959f19154fede.png)
97
+ ![イメージ説明](c0a51c576d459f4d468a569936a067d2.png)