<jupyter_start><jupyter_text>Gráficas en 3-D con Matplotlib Matplotlib se diseñó inicialmente pensando en representaciones bidimensionales únicamente.Llegada la versión 1.0, se empezaron a introducir pequeñas utilidades de trazado tridimensional sobre la representación bidimensional de Matplotlib, y el resultado nos permite hacernos una idea de la representación en 3 dimensiones (aunque sea algo limitado).Los gráficos tridimensionales se habilitan importando el kit de herramientas `` mplot3d ``, incluido con la instalación principal de Matplotlib:<jupyter_code>from mpl_toolkits import mplot3d<jupyter_output><empty_output><jupyter_text>Una vez que se importa este submódulo, se pueden crear ejes tridimensionales pasando el parámetro `` proyección = '3d'`` a cualquiera de las rutinas normales de creación de ejes:<jupyter_code># %matplotlib inline
%matplotlib widget
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')<jupyter_output><empty_output><jupyter_text>Con los ejes tridimensionales habilitados, ya podremos representar gráficos tridimensionales.El trazado tridimensional es una de las funcionalidades que se beneficia enormemente de ver las figuras de forma interactiva en lugar de estáticamente como estamos haciendo en estos notebooks. Sin embargo, para ello habría que realizar un proceso de instalación algo complejo y utilizar la sentencia ``% matplotlib widget `` en lugar de ``% matplotlib inline `` al ejecutar este código.Si quieres hacer pruebas, te dejo el siguiente repositorio con la [guía de instalación](https://github.com/matplotlib/ipympl) para usar ``%matplotlib widget``En resumen, podrías configurarlo ejecutando los siguientes comandos en el terminal de Anaconda:```conda install -c conda-forge ipympljupyter labextension install @jupyter-widgets/jupyterlab-managerjupyter lab build```Después tendremos que reiniciarlo todo (cerrando y abriendo Anaconda de nuevo), y ya podremos ejecutarlo.  Puntos y líneas tridimensionalesEl gráfico tridimensional más básico es un gráfico de línea o uno de dispersión, creados en los ejes (x, y, z).Análogamente a los gráficos bidimensionales más comunes que hemos visto anteriormente, estos se pueden crear usando las funciones `` ax.plot3D `` y `` ax.scatter3D ``.La forma de llamarles es prácticamente idéntica a la de sus contrapartes bidimensionales, por lo que podremos basarnos en los ntebooks vistos para obtener más información sobre cómo controlar la salida.A continuación, dibujaremos una espiral trigonométrica, junto con algunos puntos dibujados al azar cerca de la línea:<jupyter_code>ax = plt.axes(projection='3d')

# Data for a three-dimensional line
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, '-k')

# Data for three-dimensional scattered points
zdata = 15 * np.random.random(100)
xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap=plt.cm.autumn)<jupyter_output><empty_output><jupyter_text>Fíjate que, por defecto, los puntos de dispersión tienen su transparencia ajustada para dar una sensación de profundidad en la visualización.Si bien el efecto tridimensional a veces es difícil de ver dentro de una imagen estática, una vista interactiva puede llevar a una buena intuición sobre las características de los puntos.  Diagramas de contorno tridimensionalesDe manera análoga a las gráficas de contorno que que hemos visto, ``mplot3d`` contiene herramientas para crear gráficas de relieve tridimensionales utilizando las mismas entradas.Al igual que los gráficos bidimensionales `` ax.contour``, `` ax.contour3D `` requiere que todos los datos de entrada estén en forma de cuadrículas regulares bidimensionales, con los datos Z evaluados en cada punto.A continuación, mostraremos un diagrama de contorno con relieve de una función senoidal tridimensional:<jupyter_code>def f(x, y):
    return np.sin(np.sqrt(x ** 2 + y ** 2))

x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');<jupyter_output><empty_output><jupyter_text>A veces, el ángulo de visión predeterminado no es el óptimo, en cuyo caso podemos usar el método `` view_init `` para establecer los ángulos de elevación y azimutal. En el siguiente ejemplo, usaremos una elevación de 60 grados (es decir, 60 grados por encima del plano x-y) y un acimut de 35 grados (es decir, girado 35 grados en sentido antihorario sobre el eje z):<jupyter_code>ax.view_init(60, 35)
fig<jupyter_output><empty_output><jupyter_text>Para que entendamos mejor cómo interpretar estos valores, te dejo una sucesión de gráficas con varias combinaciones:<jupyter_code>fig = plt.figure(figsize=(20, 20))

elevacion = [0, 45, 90, 180, 270, 360]
azimut = [0, 45, 90, 180, 270, 360]

for i in range(0, len(elevacion)):
    for j in range(0, len(azimut)):
        ax = fig.add_subplot(6, 6, i*6+(j+1), projection='3d')
        ax.contour3D(X, Y, Z, 50, cmap='binary')
        ax.yaxis.set_major_formatter(plt.NullFormatter())
        ax.xaxis.set_major_formatter(plt.NullFormatter())
        ax.zaxis.set_major_formatter(plt.NullFormatter())
        ax.view_init(elevacion[i], azimut[j])
        ax.set_title(f"Elevación: {elevacion[i]}, Azimut: {azimut[j]}")<jupyter_output><empty_output><jupyter_text>Si hubiéramos activado la opción para la visión interactiva, no sería necesario explicar esto, ya que podríamos hacerlo moviéndolo con el ratón.  Gráficos de malla y superficieOtros dos tipos de gráficas tridimensionales que funcionan con datos cuadriculados son las gráficas de mallado y las gráficas de superficie.Estas toman una cuadrícula de valores y la proyectan sobre la superficie tridimensional especificada, generando una serie de figuras tridimensioneales bastante fáciles de visualizar.A continuación, se muestra un ejemplo del uso de una gráfica de mallas:<jupyter_code>fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='blue')
ax.set_title('wireframe');<jupyter_output><empty_output><jupyter_text>Un diagrama de superficie es al diagrama de malla, lo que el ``contourf`` era al ``contour``, es decir, se basa en él pero lo rellena realizando un degradado o cambio decolor en función de sus variaciones.Convertir una estructura de malla en una de superficie puede ayudar a la percepción de la topología de la superficie que se visualiza:<jupyter_code>ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                cmap='viridis', edgecolor='none')
ax.set_title('surface');<jupyter_output><empty_output><jupyter_text>Pero también podríamos hacerlo basándonos en coordenadas polares o cilíndricas, no solo cartesianas:<jupyter_code>r = np.linspace(0, 6, 20)
theta = np.linspace(-0.9 * np.pi, 0.8 * np.pi, 40)
r, theta = np.meshgrid(r, theta)

X = r * np.sin(theta)
Y = r * np.cos(theta)
Z = f(X, Y)

ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0861781848459617, 'fraction_numerical': 0.016930335831251735, 'mean_word_length': 5.605866177818515, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '196384', 'license': 'MIT', 'n_tokens_mistral': 2644, 'n_tokens_neox': 2543, 'n_words': 835, 'path': 'semana_10/dia_4/10-3D plotting.ipynb', 'repo_name': 'franciscocanon-thebridge/DS-part-time-sep2020', 'size': '7206'}