当前位置: 首页 > 知识库问答 >
问题:

如何在Python中绘制子图并将其保存为新的类方法?

巢皓君
2023-03-14

我想在Python(v2.7.12)中创建一个单独的类,它将把情节保存到文件中(这里是“test.eps”),并使用用户给出的一些标签、标题等作为参数(*args和**kwargs)。

背景故事是,我必须为科学数据创建绘图,我希望Python类简单且适合我的情况。

import matplotlib.pyplot as plt 

# class of figures for channel flow
# with one subfigure
class Homfig(plt.Figure):

    # *args: list of plot features for ax1.plot
    #     (xdata,ydata,str linetype,str label)
    # **kwargs: list of axes features for ax1.set_$(STH)
    #     possible keys:
    #     title,xlabel,ylabel,xlim,ylim,xscale,yscale

    def __init__(self,*args,**kwargs):

        self.arg_lst = []
        for key,value in kwargs.iteritems():
            setattr(self,key,value)
            self.arg_lst.append(key)
        i=0
        for value in args:
            setattr(self,'plot'+str(i),value)
            i=i+1
        print 'list of attributes set: ', self.__dict__.keys()


    def hdraw(self):
        fig2=plt.figure()
        ax1 = fig2.add_subplot(111)
        for key in self.arg_lst:
            setattr(ax1,'set_'+key,getattr(self,key))
            print getattr(ax1,'set_'+key)


        ax1.plot([0, 1, 2, 3, 4], [0, 1, 2, 3, 4], label="Test", color='g')
        leg = ax1.legend(loc=4)
        plt.savefig('test.eps')
        plt.clf()

ff = Homfig(title='very important title',xlabel="xxx",ylabel="yyy")
ff.hdraw()

方法"hDraw"应该绘制我的数据并将其保存到文件中。代码没有给出错误html" target="_blank">消息,但是没有看到情节标题或轴标签的变化。属性被赋予ax1并绘制了图表。

你能帮我理解这个问题并找到解决办法吗?

我在控制台中运行脚本:pythonhomfigs。派克

输出是:属性集列表:['title','ylabel','xlabel','arg_lst']yyy xxx非常重要的标题

共有1个答案

吴浩皛
2023-03-14

注意两者之间的区别

ax.set_title = "some title"

ax.set_title("some title")

第一个将class属性set\u title从方法更改为字符串。第二种方法使用class方法set\u title,该方法设置轴的标题。

使用setattr相当于第一种情况。因此,通过用字符串覆盖它,您正在破坏有用的classmethod。之后,您(a)不能再使用该方法(b)仍然没有设置标题(甚至不能再这样做,因为(a))。

虽然我不相信您正在使用的类的结构,但一种方法是准确地调用相应的方法

for key in self.arg_lst:
    getattr(ax1,'set_'+key)(getattr(self,key))

如果可以的话,我建议不要将属性存储在图类的属性中。似乎没有必要子类反正。相反,您可以只将args和kwargs存储在类变量中;例如,kwargs已经是一个字典,其中包含用作绘图属性的值,这样就不需要self.arg_lst存在。

import matplotlib.pyplot as plt 

# class of figures for channel flow
# with one subfigure
class Homfig():

    # *args: list of plot features for ax1.plot
    #     (xdata,ydata,str linetype,str label)
    # **kwargs: list of axes features for ax1.set_$(STH)
    #     possible keys:
    #     title,xlabel,ylabel,xlim,ylim,xscale,yscale

    def __init__(self,*args,**kwargs):
        self.args = args
        self.kwargs = kwargs
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111)

        for key, val in self.kwargs.iteritems():
            getattr(self.ax,'set_'+key)(val)

    def hdraw(self):
        self.ax.plot([0, 1, 2, 3, 4], [0, 1, 2, 3, 4], label="Test", color='g')
        leg = self.ax.legend(loc=4)

    def save(self, name="text"):
        self.fig.savefig(name+'.eps')


ff = Homfig(title='very important title',xlabel="xxx",ylabel="yyy")
ff.hdraw()
ff.save()
plt.show()
 类似资料:
  • 我正在尝试开发一个应用程序,允许我在录制视频时绘制视频,然后将录制的视频和视频保存在一个mp4文件中供以后使用。另外,我想使用camera2库,特别是我需要我的应用程序在高于API 21的设备上运行,我总是避免使用不推荐的库。 我尝试了很多方法,包括FFmpeg,其中我放置了TextureView的覆盖层。getBitmap()(来自摄影机)和从画布获取的位图。它工作正常,但由于它的功能很慢,视频

  • 问题内容: 我必须使用JavaScript创建一个表单,用户将上载JPG文件并与其他信息(例如名称,电子邮件等)一起提交。当用户单击提交时,表单中的所有信息将被加载到值对象中。对于图像文件,我将其设置为。 所以假设: 我还设置了一个servlet来处理提交,但是我不确定如何开始。上传如何进行?用户提交时,如何获取图像信息?这是屏幕截图:http : //imageshack.us/f/32/776

  • 我是Python的大一新生,我有一个问题是如何在python中绘制直方图。 首先,我有十个间隔,根据花的花瓣长度平均划分,从最小到最大。因此,我可以根据花瓣将花分成十个间隔。 花的种类是三个,所以我想画一个直方图来描述不同种类的花在不同间隔(箱)中的分布。在同一个垃圾桶里,不同的花有不同的颜色。 我知道Matplotlib中的函数,但是我不知道如何使用它来绘制像下面这样的图片。 数据是和

  • 我尝试了以下代码(): 但我得到了这个错误: 我期望最终的

  • 问题内容: 我有一些Pandas DataFrame共享相同的价值规模,但具有不同的列和索引。调用时,我得到了单独的绘图图像。我真正想要的是将它们与子图放置在同一块图上,但是不幸的是,我未能提出解决方案,并且希望获得一些帮助。 问题答案: 您可以使用matplotlib手动创建子图,然后使用关键字在特定子图上绘制数据框。例如,对于4个子图(2x2): 这是一个包含不同子图轴的数组,您可以仅通过in

  • 本文向大家介绍python 实现在一张图中绘制一个小的子图方法,包括了python 实现在一张图中绘制一个小的子图方法的使用技巧和注意事项,需要的朋友参考一下 有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法。 以上这篇python 实现在一张图中绘制一个小的子图方法就是小编分享给大家的