matplotlib: вставные оси для нескольких ящиков

У меня есть несколько ящиков в matplotlib, которые я хочу увеличить в определенном диапазоне y ([0,0.1]), используя вставные оси . Мне не ясно, из примера в документации, как я должен делать это для нескольких ящиков на одном рисунке. Я пытался изменить код, представленный в этом примере, но было слишком много ненужной сложности. Мой код довольно прост:

# dataToPlot is a list of lists, containing some data. plt.figure() plt.boxplot(dataToPlot) plt.savefig( 'image.jpeg', bbox_inches=0) 

Как добавить оси вставки и увеличить масштаб в первом квадратике? Как я могу сделать это для обоих?

EDIT: я попробовал код ниже, но вот что я получил: введите описание изображения здесь

Что пошло не так?

 # what's the meaning of these two parameters? fig = plt.figure(1, [5,4]) # what does 111 mean? ax = fig.add_subplot(111) ax.boxplot(data) # ax.set_xlim(0,21) # done automatically based on the no. of samples, right? # ax.set_ylim(0,300) # done automatically based on max value in my samples, right? # Create the zoomed axes axins = zoomed_inset_axes(ax, 6, loc=1) # zoom = 6, location = 1 (upper right) axins.boxplot(data) # sub region of the original image #here I am selecting the first boxplot by choosing appropriate values for x1 and x2 # on the y-axis, I'm selecting the range which I want to zoom in, right? x1, x2, y1, y2 = 0.9, 1.1, 0.0, 0.01 axins.set_xlim(x1, x2) axins.set_ylim(y1, y2) # even though it's false, I still see all numbers on both axes, how do I remove them? plt.xticks(visible=False) plt.yticks(visible=False) # draw a bbox of the region of the inset axes in the parent axes and # connecting lines between the bbox and the inset axes area # what are fc and ec here? where do loc1 and loc2 come from? mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5") plt.savefig( 'img.jpeg', bbox_inches=0) 

loc определяет местоположение увеличенной оси, 1 для upper right , 2 для upper left и так далее. Я немного изменил пример кода, чтобы создать многократную увеличенную ось.

 import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes from mpl_toolkits.axes_grid1.inset_locator import mark_inset import numpy as np def get_demo_image(): from matplotlib.cbook import get_sample_data import numpy as np f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) z = np.load(f) # z is a numpy array of 15x15 return z, (-3,4,-4,3) fig = plt.figure(1, [5,4]) ax = fig.add_subplot(111) # prepare the demo image Z, extent = get_demo_image() Z2 = np.zeros([150, 150], dtype="d") ny, nx = Z.shape Z2[30:30+ny, 30:30+nx] = Z # extent = [-3, 4, -4, 3] ax.imshow(Z2, extent=extent, interpolation="nearest", origin="lower") axins = zoomed_inset_axes(ax, 6, loc=1) # zoom = 6 axins.imshow(Z2, extent=extent, interpolation="nearest", origin="lower") # sub region of the original image x1, x2, y1, y2 = -1.5, -0.9, -2.5, -1.9 axins.set_xlim(x1, x2) axins.set_ylim(y1, y2) axins1 = zoomed_inset_axes(ax, 8, loc=2) # zoom = 6 axins1.imshow(Z2, extent=extent, interpolation="nearest", origin="lower") # sub region of the original image x1, x2, y1, y2 = -1.2, -0.9, -2.2, -1.9 axins1.set_xlim(x1, x2) axins1.set_ylim(y1, y2) plt.xticks(visible=False) plt.yticks(visible=False) # draw a bbox of the region of the inset axes in the parent axes and # connecting lines between the bbox and the inset axes area mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5") mark_inset(ax, axins1, loc1=2, loc2=4, fc="none", ec="0.5") plt.draw() plt.show() 

введите описание изображения здесь

Edit1:

Аналогично, вы также можете добавить увеличенную ось в boxplot. Вот пример

 from pylab import * from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes from mpl_toolkits.axes_grid1.inset_locator import mark_inset # fake up some data spread= rand(50) * 100 center = ones(25) * 50 flier_high = rand(10) * 100 + 100 flier_low = rand(10) * -100 data =concatenate((spread, center, flier_high, flier_low), 0) # fake up some more data spread= rand(50) * 100 center = ones(25) * 40 flier_high = rand(10) * 100 + 100 flier_low = rand(10) * -100 d2 = concatenate( (spread, center, flier_high, flier_low), 0 ) data.shape = (-1, 1) d2.shape = (-1, 1) data = [data, d2, d2[::2,0]] # multiple box plots on one figure fig = plt.figure(1, [5,4]) ax = fig.add_subplot(111) ax.boxplot(data) ax.set_xlim(0.5,5) ax.set_ylim(0,300) # Create the zoomed axes axins = zoomed_inset_axes(ax, 3, loc=1) # zoom = 3, location = 1 (upper right) axins.boxplot(data) # sub region of the original image x1, x2, y1, y2 = 0.9, 1.1, 125, 175 axins.set_xlim(x1, x2) axins.set_ylim(y1, y2) plt.xticks(visible=False) plt.yticks(visible=False) # draw a bbox of the region of the inset axes in the parent axes and # connecting lines between the bbox and the inset axes area mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5") show() 

введите описание изображения здесь

Edit2

В случае, если распределение является гетерогенным, т. Е. Большинство значений невелико с несколькими очень большими значениями, описанная выше процедура масштабирования может не работать, поскольку она будет увеличивать как ось x так y ось y . В этом случае лучше изменить масштаб y-axis на log .

 from pylab import * # fake up some data spread= rand(50) * 1 center = ones(25) * .5 flier_high = rand(10) * 100 + 100 flier_low = rand(10) * -100 data =concatenate((spread, center, flier_high, flier_low), 0) # fake up some more data spread= rand(50) * 1 center = ones(25) * .4 flier_high = rand(10) * 100 + 100 flier_low = rand(10) * -100 d2 = concatenate( (spread, center, flier_high, flier_low), 0 ) data.shape = (-1, 1) d2.shape = (-1, 1) data = [data, d2, d2[::2,0]] # multiple box plots on one figure fig = plt.figure(1, [5,4]) # Figure Size ax = fig.add_subplot(111) # Only 1 subplot ax.boxplot(data) ax.set_xlim(0.5,5) ax.set_ylim(.1,300) ax.set_yscale('log') show() 

введите описание изображения здесь