Cómo ampliar una parte de la imagen e insertarla en la misma plot en matplotlib

Me gustaría ampliar una parte de los datos / imágenes y trazarlos dentro de la misma figura. Se parece algo a esta figura.

parcela ampliada

¿Es posible insertar una porción de imagen ampliada dentro de la misma plot? Creo que es posible dibujar otra figura con una ttwig secundaria, pero dibuja dos figuras diferentes. También leí para agregar un parche para insertar un rectángulo / círculo, pero no estoy seguro de si es útil insertar una parte de la imagen en la figura. Básicamente, cargo datos del archivo de texto y los grapo usando los simples comandos de trazado mostrados a continuación.

Encontré un ejemplo relacionado de la galería de imágenes de matplotlib aquí pero no estoy seguro de cómo funciona. Su ayuda es muy apreciada.

from numpy import * import os import matplotlib.pyplot as plt data = loadtxt(os.getcwd()+txtfl[0], skiprows=1) fig1 = plt.figure() ax1 = fig1.add_subplot(111) ax1.semilogx(data[:,1],data[:,2]) plt.show() 

Related of "Cómo ampliar una parte de la imagen e insertarla en la misma plot en matplotlib"

Jugar con código ejecutable es una de las maneras más rápidas de aprender Python.

Así que comencemos con el código de la galería de ejemplos de matplotlib .

Dados los comentarios en el código, parece que el código se divide en 4 estrofas principales. La primera estrofa genera algunos datos, la segunda estrofa genera la ttwig principal, la tercera y cuarta estrofas crean los ejes de inserción.

Sabemos cómo generar datos y trazar la ttwig principal, así que concentrémonos en la tercera estrofa:

 a = axes([.65, .6, .2, .2], axisbg='y') n, bins, patches = hist(s, 400, normed=1) title('Probability') setp(a, xticks=[], yticks=[]) 

Copie el código de ejemplo en un nuevo archivo, llamado, digamos, test.py

¿Qué pasa si cambiamos los .65 a .3 ?

 a = axes([.35, .6, .2, .2], axisbg='y') 

Ejecute el script:

 python test.py 

Encontrarás el recuadro “Probabilidad” movido a la izquierda. Así que la función de axes controla la colocación del recuadro. Si juegas un poco más con los números, descubrirás que (.35, .6) es la ubicación de la esquina inferior izquierda de la inserción, y (.2, .2) es el ancho y la altura de la inserción. Los números van de 0 a 1 y (0,0) es el que se encuentra en la esquina inferior izquierda de la figura.

Bien, ahora estamos cocinando. En la siguiente línea tenemos:

 n, bins, patches = hist(s, 400, normed=1) 

Es posible que reconozca esto como el comando matplotlib para dibujar un histogtwig , pero si no lo hace, cambiar el número 400 a, digamos, 10, producirá una imagen con un histogtwig mucho más grueso, así que nuevamente jugando con los números que pronto descubrirá que esta línea tiene algo que ver con la imagen dentro del recuadro.

semilogx(data[3:8,1],data[3:8,2]) llamar a semilogx(data[3:8,1],data[3:8,2]) aquí.

El title('Probability') línea title('Probability') obviamente genera el texto sobre el recuadro.

Finalmente llegamos a setp(a, xticks=[], yticks=[]) . No hay números para jugar, así que, ¿qué pasa si solo comentamos toda la línea colocando un # al principio de la línea?

 # setp(a, xticks=[], yticks=[]) 

Vuelva a ejecutar el script. Oh! ahora hay muchas marcas y marcas de marcas en los ejes de inserción. Multa. Así que ahora sabemos que setp(a, xticks=[], yticks=[]) elimina las marcas de verificación y las tags de los ejes a .

Ahora, en teoría, tiene suficiente información para aplicar este código a su problema. Pero hay otro bloque de tropiezo potencial: el ejemplo de matplotlib se usa from pylab import * mientras que se usa import matplotlib.pyplot as plt .

La FAQ de matplotlib dice que import matplotlib.pyplot as plt es la forma recomendada de usar matplotlib al escribir scripts, mientras que from pylab import * es para usar en sesiones interactivas. Así que lo estás haciendo de la manera correcta (aunque recomendaría usar import numpy as np lugar de también from numpy import * ).

Entonces, ¿cómo convertimos el ejemplo de matplotlib para ejecutar con import matplotlib.pyplot as plt ?

Hacer la conversión requiere algo de experiencia con matplotlib. En general, solo se agrega plt. delante de nombres simples como axes y setp , pero a veces la función proviene de numpy y, a veces, la llamada debe provenir de un objeto de ejes, no del módulo plt . Se necesita experiencia para saber de dónde provienen todas estas funciones. Buscar en Google los nombres de las funciones junto con “matplotlib” puede ayudar. Leer el código de ejemplo puede generar experiencia, pero no hay un atajo fácil.

Así, el código convertido se convierte en

 ax2 = plt.axes([.65, .6, .2, .2], axisbg='y') ax2.semilogx(t[3:8],s[3:8]) plt.setp(ax2, xticks=[], yticks=[]) 

Y podrías usarlo en tu código así:

 from numpy import * import os import matplotlib.pyplot as plt data = loadtxt(os.getcwd()+txtfl[0], skiprows=1) fig1 = plt.figure() ax1 = fig1.add_subplot(111) ax1.semilogx(data[:,1],data[:,2]) ax2 = plt.axes([.65, .6, .2, .2], axisbg='y') ax2.semilogx(data[3:8,1],data[3:8,2]) plt.setp(ax2, xticks=[], yticks=[]) plt.show() 

La forma más sencilla es combinar “zoomed_inset_axes” y “mark_inset”, cuya descripción y ejemplos relacionados se pueden encontrar aquí: Descripción general del kit de herramientas AxesGrid

introduzca la descripción de la imagen aquí

La mejor manera que conozco para hacer esto es usar mpl_toolkits.axes_grid1.inset_locator (parte de matplotlib).

Hay un gran ejemplo con el código fuente aquí: introduzca la descripción de la imagen aquí https://github.com/NelleV/jhepc/tree/master/2013/entry10

Los pasos básicos para ampliar una parte de una figura con matplotlib

 import numpy as np from matplotlib import pyplot as plt # Generate the main data X = np.linspace(-6, 6, 1024) Y = np.sinc(X) # Generate data for the zoomed portion X_detail = np.linspace(-3, 3, 1024) Y_detail = np.sinc(X_detail) # plot the main figure plt.plot(X, Y, c = 'k') # location for the zoomed portion sub_axes = plt.axes([.6, .6, .25, .25]) # plot the zoomed portion sub_axes.plot(X_detail, Y_detail, c = 'k') # insert the zoomed figure # plt.setp(sub_axes) plt.show() 

introduzca la descripción de la imagen aquí