JuliaPy / JuliaPy/PyPlot.jl

2d array vs 1d array inconsistency with optional argument to Plot3D

オープン
#58 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Julia
スター
488
フォーク
90
PR マージ指標
30日以内にマージされた PR はありません

説明

The problem is based on the way that julia distinguishes between singleton arrays and nx1 two-dimensional arrays. The optional argument `zs` for `plot3D( xs, ys, zs=zs )` is not robust to these two different representations but the first two arguments `xs, ys` are.

Say a matrix of data is generated and three sets of points for plotting are extracted from the columns of the matrix:

```
mat = [ 1 4 7;2 5 8;3 6 9 ]
x = mat[ :,1 ]
y = mat[ :,2 ]
z = mat[ :,3 ]
```

Each vector `x, y, z` is a `3-element Array{Int64,1}`. These can be plotted using:

```
using PyPlot
close( gcf() )
plot3D( x, y, zs=z )
display( gcf() )
```

However, say the matrix is transposed and the rows are spliced and transposed:

```
x = mat'[ 1,: ]'
y = mat'[ 2,: ]'
z = mat'[ 3,: ]'
```

Each vector is now a `3x1 Array{Int64,2}` and plotting as above gives:

```
using PyPlot
close( gcf() )
plot3D( x, y, zs=z )
display( gcf() )
```

```
PyError (PyObject_Call)
ValueError('could not broadcast input array from shape (3,1) into shape (3)',)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/backend_bases.py", line 2177, in print_figure
**kwargs)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/backends/backend_agg.py", line 509, in print_png
FigureCanvasAgg.draw(self)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/backends/backend_agg.py", line 455, in draw
self.figure.draw(self.renderer)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/artist.py", line 59, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/figure.py", line 1050, in draw
func(*args)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/mpl_toolkits/mplot3d/axes3d.py", line 275, in draw
Axes.draw(self, renderer)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/artist.py", line 59, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/axes/_base.py", line 2076, in draw
a.draw(renderer)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/mpl_toolkits/mplot3d/art3d.py", line 124, in draw
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/mpl_toolkits/mplot3d/proj3d.py", line 198, in proj_transform
vec = vec_pad_ones(xs, ys, zs)
File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/mpl_toolkits/mplot3d/proj3d.py", line 187, in vec_pad_ones
vec = np.array([xs,ys,zs,np.ones(xs.shape)])

while loading In[16], in expression starting on line 4
in pyerr_check at /Users/user/.julia/v0.3/PyCall/src/exception.jl:58
in pycall at /Users/user/.julia/v0.3/PyCall/src/PyCall.jl:85
in fn at /Users/user/.julia/v0.3/PyCall/src/conversions.jl:181
in writemime at /Users/user/.julia/v0.3/pyplot/src/pyplot.jl:140
in base64 at base64.jl:125
in display_dict at /Users/user/.julia/v0.3/IJulia/src/execute_request.jl:30
in display at /Users/user/.julia/v0.3/IJulia/src/inline.jl:34
in display at multimedia.jl:150
```

Clearly Plot3D cannot handle this difference well. However, it turns out that the required arguments `xs, ys` are robust to this whereas `zs` is not. Using the `3x1 Array{Int64,2}` vectors again:

```
using PyPlot
close( gcf() )
plot3D( x, y )
display( gcf() )
```

Works fine.

Sorry for the very contrived example but this caused me some confusion earlier!
Thanks

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。