回答編集履歴

2

修正

2020/01/30 04:37

投稿

can110
can110

スコア38278

test CHANGED
@@ -42,9 +42,9 @@
42
42
 
43
43
  意図(欲しい結果)として
44
44
 
45
- - 各座標軸に直行する平面ごとに、ある高さで平面を抽出する。
45
+ - 各座標軸に直行する平面ごとに、ある高さで平面上の)点を抽出する。
46
46
 
47
- - その平面上の値の大小を高さ方向として表示する
47
+ - その平面上の点が持つ値を高さ方向として表示する
48
48
 
49
49
 
50
50
 

1

追記

2020/01/30 04:37

投稿

can110
can110

スコア38278

test CHANGED
@@ -23,3 +23,171 @@
23
23
  gridY = dataXY[:,1].reshape((42,-1))
24
24
 
25
25
  ```
26
+
27
+
28
+
29
+ 追記
30
+
31
+ -----
32
+
33
+ ちょっとこの問題の前提、意図を考えてみたのですが
34
+
35
+
36
+
37
+ 前提として
38
+
39
+ - 3次元空間上`x,y,z`の一定範囲内に格子状に配置された点があり、各点ごとになんらかの値を持っている。
40
+
41
+
42
+
43
+ 意図(欲しい結果)として
44
+
45
+ - 各座標軸に直行する平面ごとに、ある高さで平面を抽出する。
46
+
47
+ - その平面上の値の大小を高さ方向として表示する
48
+
49
+
50
+
51
+ といった感じですかね。
52
+
53
+
54
+
55
+ とすると描画のためのグリッド座標を求めるための`reshape`数って各平面ごとに異なる値を与えるべきなんじゃないかと思います。
56
+
57
+ 以下、簡単な検証コードと結果例です。
58
+
59
+ ```Python
60
+
61
+ import numpy as np
62
+
63
+ import matplotlib.pyplot as plt
64
+
65
+ from mpl_toolkits.mplot3d import Axes3D
66
+
67
+ import itertools
68
+
69
+
70
+
71
+ XYZ = [3,4,5] # 各軸の点の数
72
+
73
+ C = 0 # 描画対象の基準面からの高さ
74
+
75
+
76
+
77
+ # テストデータ
78
+
79
+ data = []
80
+
81
+ for xyz in itertools.product(*[list(range(i)) for i in XYZ]):
82
+
83
+ data.append((*xyz,1)) # とりあえず値は全部1に
84
+
85
+ data = np.array(data)
86
+
87
+
88
+
89
+ # 特定の点だけ分かりやすいように値を変える
90
+
91
+ data[ (data[:,0] == C) & (data[:,1] == 1) & (data[:,2] == 2),3] = 2 # X=C のYZ平面(1,2)上の点の値
92
+
93
+ data[ (data[:,0] == 1) & (data[:,1] == C) & (data[:,2] == 2),3] = 3 # Y=C のXZ平面(1,2)上の点の値
94
+
95
+ data[ (data[:,0] == 1) & (data[:,1] == 2) & (data[:,2] == C),3] = 4 # Z=C のXY平面(1,2)上の点の値
96
+
97
+
98
+
99
+
100
+
101
+ # X,Y,Z軸に直行する平面の順に表示する
102
+
103
+ for i in range(3):
104
+
105
+ fig = plt.figure()
106
+
107
+ ax = fig.add_subplot(111, projection='3d')
108
+
109
+
110
+
111
+ # 平面を構成する2つの軸の列位置
112
+
113
+ col = [0,1,2]
114
+
115
+ del col[i]
116
+
117
+
118
+
119
+ # 平面の軸ラベル
120
+
121
+ label = ['X','Y','Z']
122
+
123
+ del label[i]
124
+
125
+
126
+
127
+ # 描画のためのreshape数
128
+
129
+ xyz = XYZ.copy()
130
+
131
+ del xyz[i]
132
+
133
+ reshape_cnt = xyz[0]
134
+
135
+
136
+
137
+ # X(orYorZ) = C 上の平面上の点のみ抽出
138
+
139
+ data01 = data[data[:,i]==C,:]
140
+
141
+
142
+
143
+ # 描画用の座標を取得
144
+
145
+ grid0 = data01[:,col[0]].reshape((reshape_cnt,-1))
146
+
147
+ grid1 = data01[:,col[1]].reshape((reshape_cnt,-1))
148
+
149
+ out = data01[:,3].reshape((reshape_cnt,-1))
150
+
151
+
152
+
153
+ # 確認表示
154
+
155
+ print('i={}, {}平面, line cnt={}, reshape_cnt={}, shape={}'.format(i, label, data01.shape[0], reshape_cnt, grid0.shape))
156
+
157
+
158
+
159
+ #i=0, ['Y', 'Z']平面, line cnt=20, reshape_cnt=4, shape=(4, 5)
160
+
161
+ #i=1, ['X', 'Z']平面, line cnt=15, reshape_cnt=3, shape=(3, 5)
162
+
163
+ #i=2, ['X', 'Y']平面, line cnt=12, reshape_cnt=3, shape=(3, 4)
164
+
165
+
166
+
167
+ # 軸の設定
168
+
169
+ ax.set_xlabel(label[0] + "-axis")
170
+
171
+ ax.set_xticks(range(max(XYZ)))
172
+
173
+ ax.set_ylabel(label[1] + "-axis")
174
+
175
+ ax.set_yticks(range(max(XYZ)))
176
+
177
+ ax.set_zlabel("Value-axis")
178
+
179
+ ax.set_zticks(range(max(XYZ)))
180
+
181
+
182
+
183
+ surf = ax.scatter(grid0, grid1, out, cmap='bwr')
184
+
185
+ plt.savefig('ret_{}_{}.png'.format(i,''.join(label)),transparent=True)
186
+
187
+ ```
188
+
189
+ ![イメージ説明](a124d4563963fdb2bd2dbd09b508ef49.png)
190
+
191
+ ![イメージ説明](2200e7bf212b0f99f28959f19154fede.png)
192
+
193
+ ![イメージ説明](c0a51c576d459f4d468a569936a067d2.png)