2012-08-23 33 views
5

Tôi có một vài ô trong matplotlib mà tôi muốn phóng to trên một phạm vi y cụ thể ([0,0.1]) sử dụng inset axes. Nó không phải là rõ ràng với tôi từ example trong tài liệu hướng dẫn làm thế nào tôi nên làm điều này cho nhiều ô trên cùng một con số. Tôi đã cố gắng sửa đổi mã được cung cấp ví dụ này, nhưng có quá nhiều sự phức tạp không cần thiết. Mã của tôi khá đơn giản:matplotlib: inset trục cho nhiều ô vuông

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

Làm cách nào để thêm trục vào và phóng to hộp đầu tiên của hai? Làm thế nào tôi có thể làm điều đó cho cả hai?

EDIT: Tôi đã thử đoạn code dưới đây, nhưng đây là những gì tôi nhận: enter image description here

gì đã xảy ra?

# 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) 
+0

Tôi không chắc chắn tôi biết những gì bạn có ý nghĩa bởi "nhiều boxplots trên con số tương tự". Bạn có nhiều subplots? – samb8s

+0

Không, 'dataToPlot' chứa nhiều hơn một mẫu dữ liệu và' plt.boxplot' coi nó như vậy: nó vẽ nhiều ô như có các mẫu trong đầu vào của nó. –

+0

Vì vậy, bạn không thể chỉ thực hiện một số khác 'axins = zoomed_inset_axes (ax, 6, loc = 2)' và đặt phạm vi tọa độ khác cho ô tiếp theo này? – samb8s

Trả lời

14

Các loc xác định vị trí của trục zoom, 1 cho upper right, 2 cho upper left và vân vân. Tôi đã sửa đổi mã ví dụ một chút để tạo nhiều trục được thu phóng.

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() 

enter image description here

Edit1:

Tương tự, bạn cũng có thể thêm trục phóng to boxplot. Dưới đây là một ví dụ

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() 

enter image description here

Edit2

Trong trường hợp phân phối là không đồng nhất, tức là, hầu hết các giá trị nhỏ với vài giá trị rất lớn, các thủ tục phóng to ở trên có thể không hoạt động, vì nó sẽ phóng to cả x cũng như trục y. Trong trường hợp đó, tốt hơn là thay đổi tỷ lệ của y-axis thành 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() 

enter image description here

+0

Cảm ơn bạn. Các tài liệu về điều này vẫn còn quá phức tạp cho các mục đích của tôi. Tôi đã chỉnh sửa bài đăng gốc của mình để nhấn mạnh những gì tôi đang làm ngay bây giờ và xóa tất cả các dòng không cần thiết khỏi ví dụ trực tuyến. Bạn có thể vui lòng sửa đổi mã của tôi, vì vậy tôi có thể xem những gì tôi thực sự nên làm gì? Cảm ơn. –

+1

Kiểm tra câu trả lời đã chỉnh sửa. Nếu bạn gặp khó khăn trong việc hiểu bất kỳ phần cụ thể nào của mã, hãy cho tôi biết. – imsc

+0

Cảm ơn bạn. Tôi đã chỉnh sửa bài đăng của mình và thêm đầu ra của mã và các câu hỏi của bạn vào một số tham số được sử dụng. –

Các vấn đề liên quan