如何在Python中将子图绘制并保存为新的class方法?
How to draw and save a subplot figure as a new class method in Python?
我想在 Python (v2.7.12) 中创建一个单独的 class,它将把绘图保存到文件中(此处 'test.eps')并使用一些标签、标题等。由用户作为参数给出(*args 和 **kwargs)。
背景故事是我必须为科学数据创建图表,我希望 Python class 简单且适合我的情况。
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" 应该绘制我的数据并将其保存到文件中。
该代码没有给出错误消息,但没有看到绘图标题或轴标签的变化。给 ax1 赋予属性并绘制绘图。
你能帮我理解这个问题并找到解决方案吗?
我运行控制台中的脚本:
pythonhomfigs.py
输出为:
属性集列表:['title'、'ylabel'、'xlabel'、'arg_lst']
yyy
xxx
非常重要的标题
问题:
注意区别
ax.set_title = "some title"
和
ax.set_title("some title")
第一个将 class 属性 set_title
从方法更改为字符串。第二个使用 class 方法 set_title
,它设置轴的标题。
使用setattr
相当于第一种情况。因此,您通过用字符串覆盖它来破坏有用的 class 方法。之后你 (a) 不能再使用该方法 (b) 还没有设置标题(甚至不能再这样做,因为 (a))。
解决方案:
虽然我不相信您正在使用的 class 的结构,但可以实际调用相应的方法
for key in self.arg_lst:
getattr(ax1,'set_'+key)(getattr(self,key))
推荐:
如果可以的话,我建议不要将属性存储在图的属性中 class。似乎没有必要 subclass Figure
反正。相反,您可以将 args 和 kwargs 存储在 class 变量中;例如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()
我想在 Python (v2.7.12) 中创建一个单独的 class,它将把绘图保存到文件中(此处 'test.eps')并使用一些标签、标题等。由用户作为参数给出(*args 和 **kwargs)。
背景故事是我必须为科学数据创建图表,我希望 Python class 简单且适合我的情况。
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" 应该绘制我的数据并将其保存到文件中。 该代码没有给出错误消息,但没有看到绘图标题或轴标签的变化。给 ax1 赋予属性并绘制绘图。
你能帮我理解这个问题并找到解决方案吗?
我运行控制台中的脚本: pythonhomfigs.py
输出为: 属性集列表:['title'、'ylabel'、'xlabel'、'arg_lst'] yyy xxx 非常重要的标题
问题:
注意区别
ax.set_title = "some title"
和
ax.set_title("some title")
第一个将 class 属性 set_title
从方法更改为字符串。第二个使用 class 方法 set_title
,它设置轴的标题。
使用setattr
相当于第一种情况。因此,您通过用字符串覆盖它来破坏有用的 class 方法。之后你 (a) 不能再使用该方法 (b) 还没有设置标题(甚至不能再这样做,因为 (a))。
解决方案:
虽然我不相信您正在使用的 class 的结构,但可以实际调用相应的方法
for key in self.arg_lst:
getattr(ax1,'set_'+key)(getattr(self,key))
推荐:
如果可以的话,我建议不要将属性存储在图的属性中 class。似乎没有必要 subclass Figure
反正。相反,您可以将 args 和 kwargs 存储在 class 变量中;例如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()