Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—将残差添加到for循环生成的子图中_Python_For Loop_Matplotlib_Subplot - Fatal编程技术网

Python—将残差添加到for循环生成的子图中

Python—将残差添加到for循环生成的子图中,python,for-loop,matplotlib,subplot,Python,For Loop,Matplotlib,Subplot,当使用add\u轴添加残差时,我就是无法让子批次工作。它在没有残差的情况下运行良好,我可以将残差添加到一个绘图中。这是我正在做的一个例子: 首先,让大家了解我正在绘制的内容,(t,y)是我要绘制的数据,fit是数据的拟合,diff是拟合和数据之间的差异 t, s, fit = [], [], [] diff = [] for i in range(12): t.append(x / y[i]) s.append(np.linspace(0, 1, num=100, endpoi

当使用
add\u轴
添加残差时,我就是无法让子批次工作。它在没有残差的情况下运行良好,我可以将残差添加到一个绘图中。这是我正在做的一个例子:

首先,让大家了解我正在绘制的内容,(t,y)是我要绘制的数据,fit是数据的拟合,diff是拟合和数据之间的差异

t, s, fit = [], [], []
diff = []
for i in range(12):
    t.append(x / y[i])

    s.append(np.linspace(0, 1, num=100, endpoint=True))
    fit.append(UnivariateSpline(t[i], y, er, s=5e20))
    diff.append(fit[i](t[i]) - y)
这是一个数字:

fig = plt.figure()
for i in range(12):
    plt.subplot(4,3,i+1)
    fig.add_axes((0.,0.3,0.7,0.9))
    plt.plot(s[i], fit[i](s[i]), 'r-') # this is the fit
    plt.errorbar(t[i], y, er, fmt='.k',ms=6) # this is the data 
    plt.axis([0,1, 190, 360])

    fig.add_axes((0.,0.,0.7,0.3))       
    plot(t[i],diff[i],'or') # this are the residuals
    plt.axis([0,1, 190, 360])
正如你所看到的,我正在生成12个子图,在我添加
fig.add_axes
将每个子图在数据+拟合和残差之间分开之前,效果很好,但我得到的是子图顶部的一个混乱图(图已经缩小,以查看下面的子图):

我想要的是12个子图,每个子图都是这样的:

通常
plt。子批次(..)
图添加轴(..)
是互补的。这意味着这两个命令都会在图形中创建轴

但是,它们的用法会有点不同。要使用
subplot
创建12个子地块,您需要

for i in range(12):
    plt.subplot(4,3,i+1)
    plt.plot(x[i],y[i])
要使用
add_axes
创建12个子图,您需要执行以下操作

for i in range(12):
    ax = fig.add_axes([.1+(i%3)*0.8/3, 0.7-(i//3)*0.8/4, 0.2,.18])
    ax.plot(x[i],y[i])
其中需要将轴的位置传递到
添加轴

两者都很好。但是组合它们不是直接的,因为子地块是根据网格定位的,而使用
添加轴
时,您需要已经知道网格位置

所以我建议从零开始。创建子地块的合理且干净的方法是使用
plt.subplot()

通过使用轴分隔器()可以将每个子批次划分为2个

因此,在轴上循环并对每个轴执行上述操作可以获得所需的网格

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
plt.rcParams["font.size"] = 8

x = np.linspace(0,2*np.pi)
amp = lambda x, phase: np.sin(x-phase)
p = lambda x, m, n: m+x**(n)

fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(8,6), sharey=True, sharex=True)

def createplot(ax, x, m, n, size="20%", pad=0):
    divider = make_axes_locatable(ax)
    ax2 = divider.append_axes("bottom", size=size, pad=pad)
    ax.figure.add_axes(ax2)
    ax.plot(x, amp(x, p(x,m,n)))
    ax2.plot(x, p(x,m,n), color="crimson")
    ax.set_xticks([])

for i in range(axes.shape[0]):
    for j in range(axes.shape[1]):
        phase = i*np.pi/2
        createplot(axes[i,j], x, i*np.pi/2, j/2.,size="36%")

plt.tight_layout()        
plt.show()

很抱歉解释得不好,我已对我的问题进行了编辑以使其更清楚。我混合了这两种方法,试图在同一个子地块上绘制我的数据+拟合和剩余数据。哦,这与最初的问题完全不同。;-)我以后再看。这太棒了!我花了一段时间来实现它,但现在它工作得很好。还有一件事,我可以用
pyplot.axis
控制绘图底部的轴限制,但我还没有成功地使其适用于上部。处理轴限制有什么建议吗?当使用多个轴时,最好不要使用pyplot(因为您在知道当前轴是哪个轴时会遇到问题,您的工作)。最好直接在轴上工作:
ax.set\u xlim(0,4)
ax2.set\u xlim(5,10)
。同样适用于
ylim
。或
ax.轴([0,4,0,1])
ax2.轴([0,4,0,1])
from mpl_toolkits.axes_grid1 import make_axes_locatable
divider = make_axes_locatable(ax)
ax2 = divider.append_axes("bottom", size=size, pad=pad)
ax.figure.add_axes(ax2)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
plt.rcParams["font.size"] = 8

x = np.linspace(0,2*np.pi)
amp = lambda x, phase: np.sin(x-phase)
p = lambda x, m, n: m+x**(n)

fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(8,6), sharey=True, sharex=True)

def createplot(ax, x, m, n, size="20%", pad=0):
    divider = make_axes_locatable(ax)
    ax2 = divider.append_axes("bottom", size=size, pad=pad)
    ax.figure.add_axes(ax2)
    ax.plot(x, amp(x, p(x,m,n)))
    ax2.plot(x, p(x,m,n), color="crimson")
    ax.set_xticks([])

for i in range(axes.shape[0]):
    for j in range(axes.shape[1]):
        phase = i*np.pi/2
        createplot(axes[i,j], x, i*np.pi/2, j/2.,size="36%")

plt.tight_layout()        
plt.show()