45244


何度も申し訳ないです。  
以下の3dbarのｚ=0の値のプロットを無くしたいのですが、`np.nanmin`,
`np.nanmax`の使い方がいまいちわかりません（エラーの言っている意味が分かりません）。  
以下にサンプルコードと図を乗っけます。

力足らずで申し訳ないです(TT)  
頑張ります。  
（それと、コードが上手くのっけられません）

[code]

    from mpl_toolkits.mplot3d import axes3d
    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib import style
    style.use('ggplot')
    
    fig = plt.figure()
    ax1 = fig.add_subplot(111, projection='3d')
    
    x3 = [1,2,3,4,5,6,7,8,9,10]
    y3 = [1,2,3,4,5,6,7,8,9,10]
    X,Y=np.meshgrid(x3,y3)
    z3 = np.zeros([10,10])
    
    dz = np.zeros([10,10])
    dz[3,3]=0
    dz[5,5]=2
    dz[1,7]=0
    dz[5,2]=1
    dz[1,0]=2
    dz[dz<=0.0]=np.nan
    np.nanmin(dz, axis=None, out=None)
    np.nanmax(dz, axis=None, out=None)
    ax1.bar3d(X.ravel(), Y.ravel(), z3.ravel(), 0.5, 0.5, dz.ravel(),color="red")
    
    ax1.set_xlabel('x axis')
    ax1.set_ylabel('y axis')
    ax1.set_zlabel('z axis')
    
    plt.show()
    
[/code]

**変化前**  
[![変化前](https://i.stack.imgur.com/DjRqA.png)](https://i.stack.imgur.com/DjRqA.png)

**変化後**  
[![変化後](https://i.stack.imgur.com/ahp46.png)](https://i.stack.imgur.com/ahp46.png)


CC BY-SA 4.0
2018-07-02T07:21:57.127
45233
2018-07-02T20:28:51.427
2018-07-02T20:28:51.427
19110
29111
question
python python3 matplotlib
3dbar np.nanの使い方がいまいちわかりません


このコードでは `np.nanmin`, `np.nanmax`
を実行しているものの、計算結果を利用していないので特に描画結果に影響は与えていません。試しに `nanmin`, `nanmax`
の行をコメントアウトしても同じ結果になると思います。

本質的なのは bar3d の引数 `dz` に `np.nan`
を与えたときの挙動で、これは仕様なのかバグなのか[ドキュメント](https://matplotlib.org/2.0.2/mpl_toolkits/mplot3d/api.html#mpl_toolkits.mplot3d.axes3d.Axes3D.bar3d)からは判断付きませんが「変化後」のように描画が荒れることがあるようです。

今回の用途ですとおそらく棒を描画したくないのだと思うので、そうであれば欠損値を使う代わりに最初からデータを与えない方法があります。具体的には `dz >
0.0` の部分の `X`, `Y`, `z3`, `dz` だけマスクして残せば良いです。つまり、

[code]

    mask = dz > 0.0
    
[/code]

のようにして、

[code]

    ax1.bar3d(X[mask].ravel(), Y[mask].ravel(), z3[mask].ravel(), 0.5, 0.5, dz[mask].ravel(), color="r")
    
[/code]

とすると描画は正しくなります。

更に「変化前」と完璧に一致させるには、軸の最小値・最大値を明示的に設定する必要があります。描画本数の時点で減らしたので、元々どの領域を描画しようとしていたか自動的には判定できないからです。

[code]

    ax1.set_xlim([min(x3), max(x3)])
    ax1.set_ylim([min(y3), max(y3)])
    
[/code]


CC BY-SA 4.0
2018-07-02T20:27:43.670
45244
2018-07-02T20:27:43.670
19110
45233
answer