<div dir="ltr"><div><div><div><div>Jean-Philippe,<br><br></div>To answer your second question, you can use the `view_init()` method of the axes to change the orientation of the axes:<br><a href="http://matplotlib.org/mpl_toolkits/mplot3d/api.html#mpl_toolkits.mplot3d.axes3d.Axes3D.view_init">http://matplotlib.org/mpl_toolkits/mplot3d/api.html#mpl_toolkits.mplot3d.axes3d.Axes3D.view_init</a><br><br></div>An example using it to do a "rotation":<br><a href="http://matplotlib.org/examples/mplot3d/rotate_axes3d_demo.html">http://matplotlib.org/examples/mplot3d/rotate_axes3d_demo.html</a><br><br><br></div>I hope that helps!<br></div>Ben Root<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 21, 2017 at 9:57 AM, <a href="mailto:vincent.adrien@gmail.com">vincent.adrien@gmail.com</a> <span dir="ltr"><<a href="mailto:vincent.adrien@gmail.com" target="_blank">vincent.adrien@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear Jean-Philippe,<br>
<br>
(If I correctly understood your question 1.:) `fig.add_subplot` creates an Axes<br>
instance where you can then plot more or less *any* kind of plot that Matplotlib<br>
supports (line, scatter, hist, patch, etc.). *It is not specific to the '3d'<br>
projection.* `fig.add_subplot(1, 1, 1)` (or `fig.add_subplot(111)` if your<br>
prefer a syntax closer to MATLAB) simply means that you want to create a single<br>
(sub)plot area on your figure canvas. If you are confused because in 2D you<br>
could get a line plot simply with `plt.plot([0, 1, 2])`, understand that under<br>
the hood it is only some kind of wrapper for the (OO-)equivalent:<br>
```python<br>
fig = plt.figure()<br>
ax = fig.add_subplot(1, 1, 1)<br>
ax.plot([0, 1, 2])<br>
```<br>
The difference here to get a 3D Axes instance is that you have to precise the<br>
projection when you create it (`fig.add_subplot(1, 1, 1, projection='3d')`).<br>
<br>
Besides (if I am correct), please note that “we” tend to promote using an<br>
equivalent (but more OO-)wrapper, namely `plt.subplots` (the final *s* is<br>
important!). In 2D, you can thus write<br>
```python<br>
fig, ax = plt.subplots()  # create a "111-subplot"<br>
ax.plot([0, 1, 2])<br>
```<br>
and you can pass different **kwargs to it, among which a 'subplot_kw' dictionary<br>
that allows you to precise the projection. For example if you want to get a<br>
"111-subplot" 3d Axes:<br>
```<br>
fig, ax = plt.subplots(subplot_kw={'<wbr>projection': '3d'})<br>
```<br>
It is a bit verbose is this simple situation but becomes rather convenient for<br>
grids with several subplots.<br>
<br>
About 2. you may want to have a look at the following properties and methods:<br>
- ax.dist<br>
- ax.azim<br>
- ax.elev<br>
- ax.view_init(elev=..., azim=...)<br>
<br>
Here is a small script (PNG output is attached) that demonstrate their usage:<br>
```python<br>
import numpy as np<br>
import matplotlib.pyplot as plt<br>
from mpl_toolkits.mplot3d import Axes3D<br>
<br>
<br>
def dummy_plot(ax):<br>
    X, Y = np.meshgrid(np.arange(-5, 5, 0.25), np.arange(-5, 5, 0.25))<br>
    Z = np.sin(np.sqrt(X**2 + Y**2))<br>
    ax.plot_surface(X, Y, Z, cmap='coolwarm')<br>
    # Remove all the ticks for eye pleasure<br>
    ax.xaxis.set_major_locator(<wbr>plt.NullLocator())<br>
    ax.yaxis.set_major_locator(<wbr>plt.NullLocator())<br>
    ax.zaxis.set_major_locator(<wbr>plt.NullLocator())<br>
    return ax<br>
<br>
# Here is a way to instantiate all the 2x2 subplots at once, without using<br>
# the `fig.add_subplot` method. *axs* is a 2x2-array of Axes instances.<br>
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(6.4, 4.8),<br>
                        num="Demo_Jean-Philippe_<wbr>GRIVET_2",  # <- figure label<br>
                        subplot_kw={'projection': '3d'})<br>
<br>
ax = dummy_plot(axs[0, 0])<br>
ax.set_title("Forced defaults: dist=10 (a.u.),\nazim=-60 (deg), elev=30 (deg)")<br>
# NB: these values does not seem to be exactly the (1, 1, 1) direction to me.<br>
ax.dist = 10<br>
ax.view_init(azim=-60, elev=30)<br>
# From the docstring of `ax.view_init`:<br>
# Set the elevation and azimuth of the axes. This can be used to rotate<br>
# the axes programatically:<br>
# - 'elev' stores the elevation angle in the z plane.<br>
# - 'azim' stores the azimuth angle in the x,y plane.<br>
<br>
ax = dummy_plot(axs[0, 1])<br>
ax.set_title("Doubled 'dist' value")<br>
ax.dist *= 2<br>
<br>
# NB: one can also directly set the `ax.azim` and `ax.elev` properties<br>
ax = dummy_plot(axs[1, 0])<br>
ax.set_title("'azim' increased of 45 deg.")<br>
ax.azim += 45<br>
<br>
ax = dummy_plot(axs[1, 1])<br>
ax.set_title("'elev' set to 60 deg.")<br>
ax.elev = 60<br>
<br>
plt.tight_layout()<br>
plt.show()<br>
```<br>
<br>
Hopefully it will help you to plot what you want :).<br>
<br>
Best,<br>
Adrien<br>
<div class="HOEnZb"><div class="h5"><br>
On 18/03/2017 17:56, Jean-Philippe GRIVET wrote:<br>
> Thank you so much Vincent  (and Amit) for your detailed answers.<br>
><br>
> I have two questions remaining.<br>
><br>
> 1. All the code examples that I have looked at (including the "getting<br>
> started" example on page 1798 of the user manual for Matplotlib 2.0)<br>
> uses the "add_subplot" metod. Why should a 3d projection be included<br>
> in a subplot and not in a plot ?<br>
><br>
> 2. In all the examples, the figure seems to be viewed down the 1,1,1<br>
> direction towards the origin. How can the view point be changed from<br>
> within the program ?<br>
><br>
> Thanks again,<br>
> Jean-Philippe<br>
<br>
<br>
</div></div><br>______________________________<wbr>_________________<br>
Matplotlib-users mailing list<br>
<a href="mailto:Matplotlib-users@python.org">Matplotlib-users@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/matplotlib-users" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/matplotlib-<wbr>users</a><br>
<br></blockquote></div><br></div>