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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

2回答

12732閲覧

Pythonでの3次元データの可視化

pusokungo

総合スコア13

Matplotlib

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

1グッド

5クリップ

投稿2018/08/04 08:45

前提・実現したいこと

Pythonで3次元の可視化を試みています.

https://teratail.com/questions/95095

この方の回答のように, 3次元配列に格納された値をヒートマップのように可視化させたいです.
このコードを走らせたところ, 以下のようなエラーが出ました.

回答宜しくお願い致します.

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

ValueError: c of shape (10, 10, 10) not acceptable as a color sequence for x with size 1000, y with size 1000

該当のソースコード

Python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import numpy as np 4 5# データは適当に作成 6data = np.fromfunction(lambda i,j,k : (i+j+k), (10,10,10), dtype=float) 7 8X,Y,Z = np.meshgrid(range(data.shape[0]), range(data.shape[1]), range(data.shape[2])) 9 10fig = plt.figure() 11ax = fig.add_subplot(111, projection='3d', aspect='equal') 12sc = ax.scatter(X, Y, Z, c=data, alpha=0.3, cmap='jet') 13fig.colorbar(sc) 14plt.show() 15

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

私は、python初級者ですが、自分でやったことがある内容に類似していたので答えてみようと思います。
上の書き方だと、X,Y,Zがそれぞれ3次元配列で

X,Y,Z = np.meshgrid.. ```. だと、次元があわないです。 私の経験上、meshgridを使うなら、X,Y,Zはそれぞれ1次元の配列をもってきます。 それとは別に、X,Y,Zに対応した、値P(X,Y,Z)を3次元配列として持ってくる必要があり、最後に

ax.scatter(X,Y,Z,p(x,y,z))
plt.show()

の用にプロットすると上手くいくはずです。 >重ねての質問申し訳ないのですが, こちらのコードではX, Y, Zそれぞれが3次元配列になっていると思います.例えば1つの3次元配列に対して可視化させたい場合, その配列を3つに分割させるといったことを行わなければならないのでしょうか. これどういう意味でしょうか。。。 自分なりのコードをのっけて置きます。 ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.colors as colors ############################# n=2 #x,y,z座標 x_list=[i for i in range(2*n+1)] y_list=[i for i in range(2*n+1)] z_list=[i for i in range(2*n+1)] #3次元データ p_map = np.zeros((2*n+1)*(2*n+1)*(2*n+1)).reshape(2*n+1,2*n+1,2*n+1) #適当に代入 p_map[0,0,0]=1 p_map[1,3,4]=3 p_map[3,1,0]=8 p_map[2,2,2]=4 #3次元プロット fig = plt.figure() ax = fig.add_subplot(111,projection="3d") #ax = Axes3D(fig, rect=(0.1,0.1,0.8,0.8)) mask = p_map>0 X,Y,Z=np.meshgrid(x_list,y_list,z_list) ax.set_xlabel("x",labelpad=10,fontsize=24) ax.set_ylabel("y",labelpad=10,fontsize=24) ax.set_zlabel("z",labelpad=10,fontsize=24) ax.set_xlim(2*n,0) ax.set_ylim(0,2*n) ax.set_zlim(0,2*n) ax.scatter(X[mask].ravel(),Y[mask].ravel(),Z[mask].ravel(), p_map[mask].ravel(), cmap=plt.hot()) plt.show()

結果
イメージ説明

投稿2018/08/06 07:47

編集2018/08/06 08:01
Fallout_18

総合スコア124

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

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

pusokungo

2018/08/09 05:54

ご丁寧にありがとうございます! 解決できました!
guest

0

動作確認しましたが、確かに現状のmatplotlib はエラーがでますね。

どのバージョンより仕様に変更があったのかの確認は取っておりませんが、c の値として3次元配列は渡す事ができなくなっているようで、1次元配列で渡す必要があるようです。

とりあえず私の環境では

Python

1sc = ax.scatter(X, Y, Z, c=data.ravel(), alpha=0.3, cmap='jet')

と変更したところ問題なく描画できておりますのでご確認ください。

投稿2018/08/06 01:42

magichan

総合スコア15898

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

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

pusokungo

2018/08/06 05:45

回答ありがとうございます! こちらの環境でも描画できました. 重ねての質問申し訳ないのですが, こちらのコードではX, Y, Zそれぞれが3次元配列になっていると思います.例えば1つの3次元配列に対して可視化させたい場合, その配列を3つに分割させるといったことを行わなければならないのでしょうか.
magichan

2018/08/06 07:54

どもです。 現状どのようにデータを持っているかによりますが、単に3Dの散布図を描きたいのだとすれば X = [X1,X2,X3,…,Xn] Y = [Y1,Y2,Y3,…,Yn] Z = [Z1,Z2,Z3,…,Zn] C = [C1,C2,C3,…,Cn] のようなデータを準備して sc = ax.scatter(X, Y, Z, c=C) のようにデータを渡しすとよいのではないでしょうか
pusokungo

2018/08/09 05:54

ありがとうございます. 解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問