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

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

ただいまの
回答率

90.83%

  • Python 3.x

    4897questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 101

jackson5

score 29

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

import numpy as np
import matplotlib.pyplot as plt
import math
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
#import matplotlib.animation as animation

#環境設定
n=30  #tの範囲
m=10  #偶数

P = [[-1/2, 1/2, 1/2, 1/2],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
Q = [[0,0,0,0],[1/2, -1/2, 1/2, 1/2],[0,0,0,0],[0,0,0,0]]
R = [[0,0,0,0],[0,0,0,0],[1/2, 1/2, -1/2, 1/2],[0,0,0,0]]
S = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[1/2, 1/2, 1/2, -1/2]]

t_list = []
x_list = []
y_list = []

phi_map = np.zeros((2*m+1, 2*m+1,4)) #np.zeros((行,列,[]の中身の数))
phi_map[m,m,0]= 1

p_map=np.zeros([2*m+1,2*m+1])

for i in range(0,2*m+1):
    p = np.dot(phi_map[i,i], np.conj(phi_map[i,i]))
    p_map[i,i]=p
    x_list.append(i)
    y_list.append(i)
#print(p_map)

for t in range(0,n+1):
    t_list.append(t)
    if t == 0:
        phi_map
        p_map
    else:
        next_phi_map = np.zeros((2*m+1,2*m+1, 4))
        for x in range(0,2*m+1):
            if x == 0:
                for y in range(0,2*m+1):
                    if y == 0:
                        next_phi_map[x,y] = np.array([np.inner(P, phi_map[x+1,y]) + np.inner(R, phi_map[x,y+1])])
                    elif y == 2*m:
                        next_phi_map[x,y] = np.array([np.inner(P, phi_map[x+1,y]) + np.inner(S, phi_map[x,y-1])])
                    else:
                        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])])
            elif x == 2*m:
                for y in range(0,2*m+1):
                    if y == 0:
                        next_phi_map[x,y] = np.array([np.inner(Q, phi_map[x-1,y]) + np.inner(R, phi_map[x,y+1])])
                    elif y == 2*m:
                        next_phi_map[x,y] = np.array([np.inner(Q, phi_map[x-1,y]) + np.inner(S, phi_map[x,y-1])])
                    else:
                        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])])
            else:
                for y in range(0,2*m+1):
                    if y == 0:
                        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])])
                    elif y == 2*m:
                        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])])
                    else:
                        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])])
                    p_map[x,y] = np.dot(next_phi_map[x,y], np.conj(next_phi_map[x,y]))
        phi_map = next_phi_map

    print(t,p_map)

    #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,1)
    #ax.plot_wireframe(X, Y, p_map, color ="red", linewidth=1)
    #plt.pause(0.01)
    #plt.cla()




#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(x_list,y_list,p_map,width=0.1)
fig.colorbar(surf)
plt.show()


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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 22: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)
    と出たのですが、、(すいません、チンプンカンプンです)

    キャンセル

  • 2018/05/14 22:48

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

    キャンセル

  • 2018/05/14 22:58 編集

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

    キャンセル

  • 2018/05/14 23:07

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

    キャンセル

  • 2018/05/14 23:09

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

    キャンセル

  • 2018/05/14 23:12

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

    キャンセル

  • 2018/05/14 23:16

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

    キャンセル

  • 2018/05/14 23: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()

    キャンセル

  • 2018/05/14 23:39

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

    キャンセル

  • 2018/05/14 23:50

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

    キャンセル

  • 2018/05/14 23:51

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

    キャンセル

  • 2018/05/14 23:51

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

    キャンセル

  • 2018/05/14 23:54

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

    キャンセル

  • 2018/05/15 00:15

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

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    4897questions

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