Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib:使用地物对象初始化打印_Python_Matplotlib_Plot - Fatal编程技术网

Python Matplotlib:使用地物对象初始化打印

Python Matplotlib:使用地物对象初始化打印,python,matplotlib,plot,Python,Matplotlib,Plot,我正在为一个特定的实验构建一类绘图工具。 我目前有两种绘图方法,一种是使用imshow()的静态绘图,另一种是“电影”格式 使用imshow() 无论是方法还是任何未来的方法,都会获得与我可能编写的任何特定绘图方法相同的参数。在使用plot类时,我在config对象中有所有这些参数 我不想在每个plot方法中重写代码。我想初始化一个对象(我想是AxeImage),它将设置以下参数:vmin、vmax、extent_dim、Xlocs、Xlabels、Ylocs、Ylabels 然后,我将该对象传

我正在为一个特定的实验构建一类绘图工具。 我目前有两种绘图方法,一种是使用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 patch
plt.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中提出的问题。这非常有用…:)我会参考一下这个。非常感谢。