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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

420閲覧

ax_bar3dとリアルタイムプロットについて

Fallout_18

総合スコア124

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/05/14 11:25

z軸の値を3D棒グラフでそれぞれ表したいのですがうまくできないことと、オフィシャルサイトを見ても、dx,dy,dz云々、よく理解できず、コードを書くのに苦労しています。

python

1import numpy as np 2import matplotlib.pyplot as plt 3import math 4from mpl_toolkits.mplot3d import Axes3D 5from matplotlib import cm 6#import matplotlib.animation as animation 7 8#環境設定 9n=30 #tの範囲 10m=10 #偶数 11 12P = [[-1/2, 1/2, 1/2, 1/2],[0,0,0,0],[0,0,0,0],[0,0,0,0]] 13Q = [[0,0,0,0],[1/2, -1/2, 1/2, 1/2],[0,0,0,0],[0,0,0,0]] 14R = [[0,0,0,0],[0,0,0,0],[1/2, 1/2, -1/2, 1/2],[0,0,0,0]] 15S = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[1/2, 1/2, 1/2, -1/2]] 16 17t_list = [] 18x_list = [] 19y_list = [] 20 21phi_map = np.zeros((2*m+1, 2*m+1,4)) #np.zeros((行,列,[]の中身の数)) 22phi_map[m,m,0]= 1 23 24p_map=np.zeros([2*m+1,2*m+1]) 25 26for i in range(0,2*m+1): 27 p = np.dot(phi_map[i,i], np.conj(phi_map[i,i])) 28 p_map[i,i]=p 29 x_list.append(i) 30 y_list.append(i) 31#print(p_map) 32 33for t in range(0,n+1): 34 t_list.append(t) 35 if t == 0: 36 phi_map 37 p_map 38 else: 39 next_phi_map = np.zeros((2*m+1,2*m+1, 4)) 40 for x in range(0,2*m+1): 41 if x == 0: 42 for y in range(0,2*m+1): 43 if y == 0: 44 next_phi_map[x,y] = np.array([np.inner(P, phi_map[x+1,y]) + np.inner(R, phi_map[x,y+1])]) 45 elif y == 2*m: 46 next_phi_map[x,y] = np.array([np.inner(P, phi_map[x+1,y]) + np.inner(S, phi_map[x,y-1])]) 47 else: 48 next_phi_map[x,y] = np.array([np.inner(P, phi_map[x+1,y]) + np.inner(S, phi_map[x,y-1]) + np.inner(R, phi_map[x,y+1])]) 49 elif x == 2*m: 50 for y in range(0,2*m+1): 51 if y == 0: 52 next_phi_map[x,y] = np.array([np.inner(Q, phi_map[x-1,y]) + np.inner(R, phi_map[x,y+1])]) 53 elif y == 2*m: 54 next_phi_map[x,y] = np.array([np.inner(Q, phi_map[x-1,y]) + np.inner(S, phi_map[x,y-1])]) 55 else: 56 next_phi_map[x,y] = np.array([np.inner(Q, phi_map[x-1,y]) + np.inner(S, phi_map[x,y-1]) + np.inner(R, phi_map[x,y+1])]) 57 else: 58 for y in range(0,2*m+1): 59 if y == 0: 60 next_phi_map[x,y] = np.array([np.inner(P, phi_map[x+1,y]) + np.inner(Q, phi_map[x-1,y]) + np.inner(R, phi_map[x,y+1])]) 61 elif y == 2*m: 62 next_phi_map[x,y] = np.array([np.inner(P, phi_map[x+1,y]) + np.inner(Q, phi_map[x-1,y]) + np.inner(S, phi_map[x,y-1])]) 63 else: 64 next_phi_map[x,y] = np.array([np.inner(P, phi_map[x+1,y]) + np.inner(Q, phi_map[x-1,y]) + np.inner(R, phi_map[x,y+1]) + np.inner(S, phi_map[x,y-1])]) 65 p_map[x,y] = np.dot(next_phi_map[x,y], np.conj(next_phi_map[x,y])) 66 phi_map = next_phi_map 67 68 print(t,p_map) 69 70 #fig = plt.figure()#リアルタイムプロット 71 #ax = Axes3D(fig) 72 #X,Y = np.meshgrid(x_list,y_list) 73 74 #ax.set_xlabel("x") 75 #ax.set_ylabel("y") 76 #ax.set_zlabel("probability") 77 78 #ax.set_xlim(2*m,0) 79 #ax.set_ylim(0,2*m) 80 #ax.set_zlim(0,1) 81 #ax.plot_wireframe(X, Y, p_map, color ="red", linewidth=1) 82 #plt.pause(0.01) 83 #plt.cla() 84 85 86 87 88#3D_plot 89fig = plt.figure() 90ax = Axes3D(fig) 91X,Y = np.meshgrid(x_list,y_list) 92 93ax.set_xlabel("x") 94ax.set_ylabel("y") 95ax.set_zlabel("probability") 96 97ax.set_xlim(2*m,0) 98ax.set_ylim(0,2*m) 99ax.set_zlim(0,0.35) 100#ax = fig.add_subplot(111, projection="3d") 101surf = ax.plot_surface(X, Y, p_map, cmap =cm.coolwarm , linewidth=0) 102#ax.bar3d(x_list,y_list,p_map,width=0.1) 103fig.colorbar(surf) 104plt.show()

どなたか、bar3dについて、教えて頂けないでしょうか。。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

pandas+matplotlibで3D棒グラフを作る - HPCメモ

x,y,zは同じ長さで、棒のてっぺんの座標になるようにします((x[0], y[0], z[0])で一つの座標)。dx, dy, dzは棒の幅らしいので、適当に0.1とか入れとけば良いでしょう(見た目を見て調整)。
手元でplot_surfaceと重ねてplotしようとしたら上手く行かなかったので、それをやろうとしているなら工夫が必要だと思います(か、そもそもできない)。

投稿2018/05/14 11:40

hayataka2049

総合スコア30933

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

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

Fallout_18

2018/05/14 13:44

そのサイトは見たのですが、う~んって感じです。。 dx = 0.1 dy = 0.1 dz = 0.1 ax.bar3d(x_list,y_list,p_map,dx,dy,dz) plt.show() としたら、 ValueError: incompatible dimensions for cross product (dimension must be 2 or 3) と出たのですが、、(すいません、チンプンカンプンです)
hayataka2049

2018/05/14 13:48

それはp_mapの形がx_list,y_listと違うからですね。加工して然るべき形にしてください(xとyも作る必要がありそう)
Fallout_18

2018/05/14 13:59 編集

?????p_mapのdimensionは2だと思うのですが。。。 それを1次元に変えるということですか? それだと、上の注意文を満たしていないと思ったのですが。
Fallout_18

2018/05/14 14:07

あ、、諦めます。 理解力がなさすぎて、わけわかめです。
hayataka2049

2018/05/14 14:09

たとえば ax.bar3d(np.arange(20),np.arange(20),np.ones(20),0.1, 0.1, 0.1) としてどんな挙動なのか理解してください。 打ちたい点すべてのxyz座標があればできるということです
hayataka2049

2018/05/14 14:12

重ねてplotも今やりなおしたら綺麗にできてたので(fig.add_subplotが余計だった)、あとは頑張り次第でできそうですよ
Fallout_18

2018/05/14 14:16

fig.add_subplotが余計だったとありますが、これがないと棒グラフが何も出てきません。。
hayataka2049

2018/05/14 14:18

こんな感じになっています #3D_plot fig = plt.figure() ax = Axes3D(fig) X,Y = np.meshgrid(x_list,y_list) #ax.set_xlabel("x") #ax.set_ylabel("y") #ax.set_zlabel("probability") #ax.set_xlim(2*m,0) #ax.set_ylim(0,2*m) #ax.set_zlim(0,0.35) #ax = fig.add_subplot(111, projection="3d") surf = ax.plot_surface(X, Y, p_map, cmap =cm.coolwarm , linewidth=0) ax.bar3d(np.arange(20),np.arange(20),np.ones(20),0.1, 0.1, 0.1) #fig.colorbar(surf) plt.show()
hayataka2049

2018/05/14 14:39

ax.bar3d(X.ravel(), Y.ravel(), p_map.ravel(),1, 1, -p_map.ravel()) これでそれっぽくなりました。ravelしてぜんぶ一次元に変換してあげたらできました。あと、dzは配列でしかも負の長さにしてあげないとそれっぽい表示になりませんでした
Fallout_18

2018/05/14 14:50

いま、youtubeで見てたのですが、なんか難しくてわからないですな
Fallout_18

2018/05/14 14:51

とりあえず、”棒”で表現するには、配列をすべて1次元に変換しなければいけないということはわかりました。
Fallout_18

2018/05/14 14:51

youtubeを見てても、dzに関しては、良くわかりません。
hayataka2049

2018/05/14 14:54

実際に置いているのは「棒」というか立方体というイメージです。x,y,zは座標の指定、dx,dy,dzは立方体のx,y,z方向の辺の長さですね
Fallout_18

2018/05/14 15:15

ありがとうございます、ちょっと考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問