Python Matplotlib:使用地物对象初始化打印
我正在为一个特定的实验构建一类绘图工具。 我目前有两种绘图方法,一种是使用imshow()的静态绘图,另一种是“电影”格式 使用imshow() 无论是方法还是任何未来的方法,都会获得与我可能编写的任何特定绘图方法相同的参数。在使用plot类时,我在config对象中有所有这些参数 我不想在每个plot方法中重写代码。我想初始化一个对象(我想是AxeImage),它将设置以下参数:vmin、vmax、extent_dim、Xlocs、Xlabels、Ylocs、Ylabels 然后,我将该对象传递给各种方法,这些方法可以执行其他特定的操作。 我不知道该怎么做Python Matplotlib:使用地物对象初始化打印,python,matplotlib,plot,Python,Matplotlib,Plot,我正在为一个特定的实验构建一类绘图工具。 我目前有两种绘图方法,一种是使用imshow()的静态绘图,另一种是“电影”格式 使用imshow() 无论是方法还是任何未来的方法,都会获得与我可能编写的任何特定绘图方法相同的参数。在使用plot类时,我在config对象中有所有这些参数 我不想在每个plot方法中重写代码。我想初始化一个对象(我想是AxeImage),它将设置以下参数:vmin、vmax、extent_dim、Xlocs、Xlabels、Ylocs、Ylabels 然后,我将该对象传
import matplotlib.pyplot as plt
data = data_dict[type] # could be real part of a complex number, phase, or the mag...
v_min, v_max = self.get_data_type_scale(data_dict, Type)
freq = data_dict['freq']
# essentially sets the aspect of the plot since the x and y resolutions could be different
extent_dim = self._get_extent(2)
# gets the labels for physical dimensions of the experiment
Xlocs,Xlabels,Ylocs,Ylabels = self._get_ticks(5,5,extent_dim)
# in the guts of a plot method, the basic idea is the call below.
plt.imshow(data[0,:,:],cmap='jet',vmin=v_min,...
vmax=v_max,origin='lower', extent = extent_dim)
plt.title('Type: %s Freq: %.3e Hz' %(Type,data_dict['freq'][0]) )
plt.xticks(Xlocs, Xlabels)
plt.yticks(Ylocs,Ylabels)
要显示绘图,您需要使用
fig.canvas.draw()
其中fig
是Figure
类的一个实例fig.canvas.draw()
是交互式shell(读取:pylab
)函数的API版本draw()
如果需要从AxesImage
对象获取轴
或图形
,可以分别调用im.get\u Axes()
或im.get\u Figure()
就编写“好的”面向对象代码而言,这可能是一个很好的起点。您首先需要了解一点matplotlib的体系结构(请参阅创始人和当前首席开发人员的长篇文章)。位于
后端
层的底部,处理渲染和与硬件对话。在该层的顶部是艺术家
,他们知道如何通过告诉后端
对象要做什么来绘制自己。在该层的顶部是pyplot
接口,它模仿MATLAB
您在图形中看到的所有内容都在内部表示为艺术家
,艺术家可以包含其他艺术家。例如,轴
对象跟踪其子对象艺术家
,这些子对象是轴脊椎、记号、标签、线条或图像等,轴
对象是图形
对象的子对象。当你告诉一个人物画它自己(通过fig.canvas.draw()
)时,所有的子艺术家都被递归地画出来
这种设计的一个缺点是,Artist
的给定实例化可以正好在一个图形中(并且在图形之间移动它们很困难),因此您不能创建一个AxesImage
对象,然后继续重用它
这种设计也将艺术家
所知道的区分开来<代码>轴对象知道诸如记号位置、标签和显示范围之类的信息(它通过了解轴对象来做到这一点,但这一点正在变得更加复杂)。像vmin
和vmax
这样的东西被封装在规范化()对象中,AxesImage
跟踪这些对象。这意味着您将需要区分如何处理列表中的所有内容
我建议在这里使用类似工厂的模式,或者使用类似咖喱的模式
工厂式:
def set_up_axes(some, arguements):
'''
Factory to make configured axes (
'''
fig, ax = plt.subplots(1, 1) # or what ever layout you want
ax.set_*(...)
return fig, ax
my_norm = matplotlib.colors.Normalize(vmin, mmax) # or write a factory to do fancier stuff
fig, ax = set_up_axes(...)
ax.imshow(..., norm=my_norm)
fig2, ax2 = set_up_axes(...)
ax2.imshow(..., norm=mynorm)
您可以打包一整套KWARG,以方便重复使用:
my_imshow_args = {'extent':[...],
'interpolation':'nearest',
'norm': my_norm,
...}
ax2.imshow(..., **my_imshow_args)
咖喱类:
def my_imshow(im, ax=None, *args, **kwargs):
if ax is None:
ax = plt.gca()
# do all of your axes set up
ax.set_xlim(..)
# set default vmin and vmax
# you can drop some of these conditionals if you don't want to be
# able to explicitly override the defaults
if 'norm' not in kwargs:
vmin = kwargs.pop('vmin', None)
vmax = kwargs.pop('vmax', None)
if vmin is None:
vmin = default_vmin # or what ever
if vmax is None:
vmax = default_vmax
my_norm = matplotlib.colors.Normalize(vmin, mmax)
kwargs['norm'] = norm
# add a similar block for `extent`
# or any other kwargs you want to change the default of
ax.figure.canvas.draw() # if you want to force a re-draw
return ax.imshow(im, *args, **kwargs)
如果你想变得超级聪明,你可以在你的版本中使用monkey patchplt.imshow
plt.imshow = my_imshow
还有一个界面,允许您以全局方式更改许多位和matplotlib
片段的默认值
以及实现这一点的方法(通过部分)您的问题到底是什么?如果你想初始化一个图形
对象,那么就这样做吧fig=figure()
就是你需要做的一切。假设我对我的绘图做了一个句柄:im=plt.imshow(),那么我就可以使用im.set\u extent((0,32,0,32))。这是将绘图对象传递给方法的正确方法吗。我怎样才能让情节表现出来?im.show()似乎不起作用。基本上,我如何用绘图编写好的OO代码,在图中可以在_uinit__;中设置几个参数,并将对对象的引用传递给各种方法。句柄是什么意思?这听起来像是MATLAB的行话,因为Python有一个东西:对象,所以这里很混乱。在matplotlib
中有轴
对象、图形
对象和大量其他对象im=imshow(randn(10,10))
返回一个AxesImage
对象。那么…你到底在说哪一个呢。handle是个坏习惯…matlab的老习惯。我想我指的是AxeImage对象。您是否介意将问题的标题更改为更具描述性的内容,例如“将参数的默认值更改为pyplot函数”。在答案上玩冒险游戏;)我想我现在明白了…多亏了。挑剔一点,pylab
只是一个大容量导入一堆有用的东西的桶,pyplot
是状态机接口。我也不太明白这是如何解决这个问题的。他问他如何才能让数字显示出来。fig.canvas.draw()
不是公认的方法吗?它解决了评论中提出的问题,而不是OP中提出的问题。这非常有用…:)我会参考一下这个。非常感谢。