我试图像时尚一样在网格中安排一堆子图。问题是子图的数量随用户选择要绘制的数据而变化。现在我正试图以这种方式添加图:
l = len(clicked)
self.p=wx.Panel(self)
self.dpi=100
self.fig = Figure()
self.canvas = FigCanvas(self.p, -1, self.fig)
if l == 1:
self.splt = self.fig.add_subplot(1,1,1)
self.plt=self.splt.plot(np.arange(5),np.arange(5))
else:
for i in np.arange(l):
self.splt=self.fig.add_subplot(l+1,2,i+1)
self.fig.subplots_adjust(left=0.7, bottom=0.6, right=0.75, top=0.75)
self.plt=self.splt.plot(np.arange(5),np.arange(5))
我只是使用虚假数据进行调试。无论如何,我正在使用wxPython在框架内绘制它。 clicked
此处提供了用户所做的选择次数。我已经尝试使用subplots_adjust()
,结果与我想要的完全相反。这些阴谋正在缩小,无法辨认。有没有办法在某种网格中安排某些情节。我看到有一个选项subplot2grid
,但我还没有使用可变数量的子图。
答案 0 :(得分:2)
希望这会有所帮助:
from __future__ import division
import numpy as np
import pylab as plt
def divideSquare(N):
if N<1:
return 1,1
minX = max(1,int(np.floor(np.sqrt(N))))
maxX = max(minX+1, int(np.ceil(np.sqrt(5.0/3*N))))
Nx = range(minX, maxX+1)
Ny = [np.ceil(N/y) for y in Nx]
err = [np.uint8(y*x - N) for y in Nx for x in Ny]
ind = np.argmin(err)
y = Nx[int(ind/len(Ny))]
x = Ny[ind%len(Nx)]
return min(y,x), max(y,x)
Nlist = np.arange(0,101)
empty = np.zeros_like(Nlist)
ratio = np.zeros_like(Nlist, dtype = float)
for k, N in enumerate(Nlist):
y,x = divideSquare(N)
empty[k] = y*x - N
ratio[k] = 1.0 * x/y
print y,x,y/x
plt.figure(1)
plt.clf()
y,x = divideSquare(2)
plt.subplot(y,x,1)
plt.plot(Nlist, empty, 'k')
plt.xlabel('Number of plots')
plt.ylabel('Empty squares left')
plt.subplot(y,x,2)
plt.plot(Nlist, ratio, 'r')
plt.xlabel('Number of plots')
plt.ylabel('Ratio')
def divide2or3(N):
if N<1:
return 1,1
if N%2==0:
return int(np.ceil(N/2)), 2
return int(np.ceil(N/3)), 3
Nlist = np.arange(0,101)
empty = np.zeros_like(Nlist)
ratio = np.zeros_like(Nlist, dtype = float)
for k, N in enumerate(Nlist):
y,x = divide2or3(N)
empty[k] = y*x - N
ratio[k] = 1.0 * x/y
print y,x,y/x
plt.figure(2)
plt.clf()
y,x = divide2or3(2)
plt.subplot(y,x,1)
plt.plot(Nlist, empty, 'k')
plt.xlabel('Number of plots')
plt.ylabel('Empty squares left')
plt.subplot(y,x,2)
plt.plot(Nlist, ratio, 'r')
plt.xlabel('Number of plots')
plt.ylabel('Ratio')
plt.show()
divideSquare(N)尝试使比率接近1,但空位数最少。 divide2or3(N)给你一个2或3列的网格(如果你反转x和y,则为行),但我不确定这是否是你想要的90个图。