Python绘制不同的图形失败

Python绘制不同的图形失败,python,matplotlib,plot,figures,Python,Matplotlib,Plot,Figures,编辑:我发现如果一个人试图绘制两个不同的图形列表,问题总是会出现的。这是否意味着不能在同一循环中绘制不同的图形列表?请参阅最新代码,以获取更简单的问题示例 我试图分析一组复杂的数据,这些数据基本上是关于不同条件下的电气设备的测量。因此,代码有点复杂,但我试图将其分解为一个工作示例,但它仍然相当长。因此,让我解释一下你所看到的::你看到3类晶体管代表一个电子设备。它的属性Y表示测量数据-由两组测量组成。在本例中,每个晶体管都属于第2组。有些组属于同一个系列-在本例中,两个组都包括在一个系列中 现在

编辑:我发现如果一个人试图绘制两个不同的图形列表,问题总是会出现的。这是否意味着不能在同一循环中绘制不同的图形列表?请参阅最新代码,以获取更简单的问题示例

我试图分析一组复杂的数据,这些数据基本上是关于不同条件下的电气设备的测量。因此,代码有点复杂,但我试图将其分解为一个工作示例,但它仍然相当长。因此,让我解释一下你所看到的::你看到3类晶体管代表一个电子设备。它的属性Y表示测量数据-由两组测量组成。在本例中,每个晶体管都属于第2组。有些组属于同一个系列-在本例中,两个组都包括在一个系列中

现在的目标是绘制每个晶体管(未显示)的所有测量数据,然后在一个图中绘制属于同一组的所有数据,并将同一系列的所有数据绘制到一个图中。为了以一种高效的方式编程,而不需要太多的循环,我的想法是使用matplotlib面向对象的特性-我将为每个级别的绘图(在initGrpPlt和initSeriesPlt中初始化)提供图形和子图,然后在所有晶体管上只填充一个循环(在MainPlt中:toGPlt和toSPlt)。最后,它应该只打印/保存到文件/任何文件(PltGrp和PltSeries)

问题:即使我指定了打印位置,python也会将系列打印打印到组打印中。您可以通过使用“toSPlt(trans,j)”行和不使用该行运行代码来检查这一点。我不知道python为什么会这样做,因为在函数toSPlt中,我明确地说python应该使用序列子批列表中的子批。有人知道为什么会这样,以及如何以一种优雅的方式解决这个问题吗

从头到尾阅读代码,这将有助于理解

问候

# -*- coding: utf-8 -*-


import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

maxNrVdrain = 2


X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
A = [[1*np.cos(X),2*np.cos(X),3*np.cos(X),4*np.cos(X)],[1*np.tan(X),2*np.tan(X),3*np.tan(X),4*np.tan(X)]]
B = [[2* np.sin(X),4* np.sin(X),6* np.sin(X),8* np.sin(X)],[2*np.cos(X),4*np.cos(X),6*np.cos(X),8*np.cos(X)]]

class Transistor(object):
    _TransRegistry = []

    def __init__(self,y1,y2):
        self._TransRegistry.append(self)
        self.X = X
        self.Y = [y1,y2]
        self.group = ''

class Groups():
    _GroupRegistry = []

    def __init__(self,trans):
        self._GroupRegistry.append(self)
        self.transistors = [trans]
        self.figlist = []
        self.axlist = []

class Series():
    _SeriesRegistry = []

    def __init__(self,group):
        self._SeriesRegistry.append(self)
        self.groups = [group]
        self.figlist = []
        self.axlist = []


def initGrpPlt():
    for group in Groups._GroupRegistry:
        for j in range(maxNrVdrain):
            group.figlist.append(plt.figure(j))
            group.axlist.append(group.figlist[j].add_subplot(111))
    return

def initSeriesPlt():
    for series in Series._SeriesRegistry:
        for j in range(maxNrVdrain):
            series.figlist.append(plt.figure(j))
            series.axlist.append(series.figlist[j].add_subplot(111))
    return

def toGPlt(trans,j):
    colour = cm.rainbow(np.linspace(0, 1, 4))
    group = trans.group
    group.axlist[j].plot(trans.X,trans.Y[j], color=colour[group.transistors.index(trans)], linewidth=1.5, linestyle="-")
    return

def toSPlt(trans,j):
    colour = cm.rainbow(np.linspace(0, 1, 2))
    series = Series._SeriesRegistry[0]
    group = trans.group
    if group.transistors.index(trans) == 0:
        series.axlist[j].plot(trans.X,trans.Y[j],color=colour[series.groups.index(group)], linewidth=1.5, linestyle="-", label = 'T = nan, RH = nan' )
    else:
        series.axlist[j].plot(trans.X,trans.Y[j],color=colour[series.groups.index(group)], linewidth=1.5, linestyle="-")
    return

def PltGrp(group,j):
    ax = group.axlist[j]
    ax.set_title('Test Grp')
    return

def PltSeries(series,j):
    ax = series.axlist[j]
    ax.legend(loc='upper right', frameon=False)
    ax.set_title('Test Series')
    return


def MainPlt():
    initGrpPlt()
    initSeriesPlt()
    for trans in Transistor._TransRegistry:
        for j in range(maxNrVdrain):
            toGPlt(trans,j)
            toSPlt(trans,j)#plots to group plot for some reason
    for j in range(maxNrVdrain):
        for group in Groups._GroupRegistry:
            PltGrp(group,j)
    plt.show()
    return

def Init():
    for j in range(4):
        trans = Transistor(A[0][j],A[1][j])
        if j == 0:
            Groups(trans)
        else:
            Groups._GroupRegistry[0].transistors.append(trans)
        trans.group = Groups._GroupRegistry[0]
    Series(Groups._GroupRegistry[0])
    for j in range(4):
        trans = Transistor(B[0][j],B[1][j])
        if j == 0:
            Groups(trans)
        else:
            Groups._GroupRegistry[1].transistors.append(trans)
        trans.group = Groups._GroupRegistry[1]
    Series._SeriesRegistry[0].groups.append(Groups._GroupRegistry[1])
    return

def main():
    Init()
    MainPlt()
    return


main()

不起作用的最新示例:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np



X = np.linspace(-np.pi, np.pi, 256,endpoint=True)

Y1 = np.cos(X)
Y2 = np.sin(X)

figlist1 = []
figlist2 = []

axlist1 = []
axlist2 = []



for j in range(4):
    figlist1.append(plt.figure(j))
    axlist1.append(figlist1[j].add_subplot(111))
    figlist2.append(plt.figure(j))#this should be a new set of figures!
    axlist2.append(figlist2[j].add_subplot(111))
    colour = cm.rainbow(np.linspace(0, 1, 4))
    axlist1[j].plot(X,j*Y1, color=colour[j], linewidth=1.5, linestyle="-")
    axlist1[j].set_title('Test Grp 1')
    colour = cm.rainbow(np.linspace(0, 1, 4))
    axlist2[j].plot(X,j*Y2, color=colour[int(j/2)], linewidth=1.5, linestyle="-")
    axlist2[j].set_title('Test Grp 2')
plt.show()

好吧,愚蠢的错误,如果一个人想到背景,但可能有人有类似的问题,无法看到原因,因为我是第一个。因此,解决方案如下:

问题在于,像figlist1[j]这样的ListObject的名称并没有定义地物——它们只是指向实际地物对象的指针。如果这样一个对象是由plt创建的。图(j)必须确保每个图的j是不同的-因此,在多个图被初始化的循环中,需要以某种方式更改图的编号,否则第一个对象将被覆盖。希望有帮助!干杯