绘图层次结构中的Python错误:TypeError:unhable type:';列表';

绘图层次结构中的Python错误:TypeError:unhable type:';列表';,python,matplotlib,Python,Matplotlib,我正在为产品开发一个类层次结构我的风格图对我的目的很有用 当我试图从一个子类实例化绘图时,我在标题TypeError:unhabable type:'list'中收到了错误报告, 为了隔离错误,我简化了这个类,但是这些类可以被使用和测试,特别是当我试图从子类调用时,我才收到这个错误,我调用了我没有得到的顶级类,并且生成了绘图 现在让我来报告几个课程: 层次结构从一个抽象类开始: from abc import ABCMeta, abstractmethod import matplotlib.p

我正在为产品开发一个类层次结构我的风格图对我的目的很有用

当我试图从一个子类实例化绘图时,我在标题
TypeError:unhabable type:'list'
中收到了错误报告, 为了隔离错误,我简化了这个类,但是这些类可以被使用和测试,特别是当我试图从子类调用时,我才收到这个错误,我调用了我没有得到的顶级类,并且生成了绘图 现在让我来报告几个课程:

层次结构从一个抽象类开始:

from abc import ABCMeta, abstractmethod
import matplotlib.pyplot as plt
import numpy as np
from abc import ABCMeta, abstractmethod
from cycler import cycler

class BasePlot(metaclass=ABCMeta):

   def __init__(self, title : str = ' ' , filename : str = ' '):
      self.title = title
      self.filename = filename   

   def schemes(self, style:str = 'nb'):
         color = {} 
         color['nb']   = ['#8DA0CB', '#E58AC3', '#A6D853', '#FFD930', '#B2B2B2', '#5FC3A4', '#FC8D62', '#66C2A5']
         return color[style]

   def linestyles(self, style : str = 'ls1'):  
         linestyles = {}
         linestyles['paper'] = [(0, ()), (0, (3, 1, 1, 1, 1, 1)), (0, (5, 5)),(0, (5, 1)),(0, (3, 5, 1, 5)),(0, (3, 5, 1, 5, 1, 5)),(0, (1, 1)),(0, (5, 10)) ]
         return linestyles[style]                                                                                                   

   @abstractmethod
   def style(self,*args,**kwargs):
      pass
从这个基类继承了一个类,在这个类中,我需要的几乎所有东西都被定义了,这个类被命名为生成默认绘图的默认类

 class DefaultPlot(BasePlot) :

    def __init__(self, figsize,*args,**kwargs):
        self.var = [*args]
        self.params = kwargs
    def style(self,*args):
        self.variable = [*args]
    def cycle(self,n : str):
            if n == '0':
                  return plt.cycler("color", self.parameters['scheme'])      #colors)         
            elif n=='1':
                  return plt.cycler("color", self.parameters['scheme']) + plt.cycler("linestyles", self.parameters['linestyles'])
    def setparams(self, kwargs):
             self.parameters = kwargs
             if 'scheme' in self.parameters.keys():
                 v = self.parameters['scheme']  
                 self.parameters['scheme'] = self.schemes(v)

             if 'font' not in self.parameters.keys():
                self.parameters['font'] = 'serif'
             if 'scheme' not in self.parameters.keys():
                self.parameters['scheme'] = self.schemes('nb')
             if 'cycle' not in self.parameters.keys():
                self.parameters['cycle']  = self.cycle('0')
             if 'linestyles' not in self.parameters.keys():
                self.parameters['linestyles'] = self.linestyles('paper')


             myparams = {
               'axes.prop_cycle': self.parameters['cycle'],     
               'grid.color' : 'gray',
               'font.family': self.parameters['font'] ,
               'font.style' : 'italic'
             }

             plt.rcParams.update(myparams)

    def __call__ (self,nrows,ncols,*args,**kwargs):

       self.style(*args)
       self.setparams(kwargs)

       if nrows == ncols ==1:
            self.fig, self.axs = plt.subplots(nrows,ncols,figsize=(9.5,4.5))
       else:
            self.fig, self.axs = plt.subplots(nrows,ncols,figsize=(12,6))
       for i in range(nrows):
          for j in range(ncols):
             if nrows == ncols == 1:
                 self.axs.set_title('', color='#555555')
                 legend = leg = self.axs.legend()

             else:
                 self.axs[i,j].set_title('', color='#555555')
                 legend = leg = self.axs[i,j].legend()
             legend.get_frame().set_linewidth(1.2)
             plt.setp(legend.get_texts(), color='#555555')

             if nrows == ncols ==1 :
                plt.subplots_adjust(left=0.125 , bottom=0.125, right=0.95, top=0.87, wspace=0, hspace=0)
             else:   
                plt.subplots_adjust(left=0.06 , bottom=0.1, right=0.95, top=0.95, wspace=0.2, hspace=0.4)
       return self.fig,self.axs
最后,我继承了最后一个级别的类。这个类的用途(尽管这里没有显示)是替换上面默认类中定义的参数,以便创建几个这样的类来生成样式图(基本上在这个类中,我替换颜色、字体、记号等等)

这个类是从主脚本调用的:

import numpy as np
import matplotlib.pyplot as plt
#import defaultplot 
import qualityplot

def main():

    x = np.linspace(0,2*np.pi,50)
    y = np.sin(x)

    fig,axs = qualityplot.Standard(figsize=(9.5,4.5))(1,1,**{'scheme':'nb'})
    #fig,axs = defaultplot.DefaultPlot(figsize=(9.5,4.5))(1,1,**{'scheme':'nb'})

    axs.plot(x,y)
    plt.show()
现在,如果您尝试运行并调用qualityplot,您会收到错误:
TypeError:unhabable type:'list'
,但是如果您调用顶级defaultpolot.DefaultPlot(最后一条注释行),事情就会好起来!我不知道我错了什么!
我怎样才能修理这些东西

错误告诉您不能将列表用作字典键。也就是说,在python中,以下内容是不可能的

a = {[1,2,3] : "A"}
在代码中出现此问题是因为更改了
self.parameters['scheme']
的类型。它可能首先是字符串,然后在下面的代码段中转到列表

     self.parameters = kwargs
     if 'scheme' in self.parameters.keys():
          v = self.parameters['scheme']  
          self.parameters['scheme'] = self.schemes(v)

现在,这一部分在super方法中被第二次调用,
self.parameters['scheme']
已经是一个列表了。在这种情况下,
self.schemes(list)
无效,将导致错误

schemes
函数中,将颜色['nb']设置为列表

Standard.setparams
函数中,将此列表放入
self.parameters['scheme']
中,然后调用
DefaultPlot.setparams

DefaultPlot.setparams
中调用
BasePlot.schemes(v)
,v等于此列表


BasePlot.schemes
中调用
return color[style]
,其样式与此列表相同,但无法工作(样式应为字符串)

因此,您能否向我解释为什么使用defaultplot类它可以工作,而不适用于qualityplot。。我想我没有得到你的答案。对不起!可以修复吗?我说,“这件作品叫做第二次”。这只发生在子类中。如果直接使用
DefaultPlot
,则只调用一次,schemes的参数保持为字符串。作为修正,我建议不要更改同一个对象,而是使用不同的对象。始终从defaultplots继承的不同对象?请您向我解释一下如何组织代码?只是一些提示代码对我来说似乎是多余的,所以我只需要使用一个类就可以了。
     self.parameters = kwargs
     if 'scheme' in self.parameters.keys():
          v = self.parameters['scheme']  
          self.parameters['scheme'] = self.schemes(v)