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

matplotlib:使用图形对象初始化绘图

桑博远
2023-03-14

我正在为一个特定的实验构建一类绘图工具。我目前有两种绘图方法,一种是使用imshow()的静态绘图,另一种是使用imshow()的“电影”格式。

无论是方法还是任何未来的方法,都要获取与我可能编写的任何特定绘图方法相同的参数。在使用情节类时,我在一个配置对象中拥有所有这些参数。

我不想在每个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)

共有2个答案

段干麒
2023-03-14
匿名用户

要显示绘图,您需要使用fig.canvas。draw()其中figFigure类的一个实例<代码>图画布。draw()是交互式shell(读取:pylab)函数的API版本draw()

如果需要从AxesImage对象获取图形,可以调用im。获取轴()。分别获取图()

就编写“好的”面向对象代码而言,用户界面示例可能是一个很好的起点。

丁翊歌
2023-03-14

首先,您需要了解一些matplotlib的体系结构(请参阅创始人和当前主要开发人员的长篇文章)。在后端层的底部,处理渲染和与硬件对话。在该层的顶部是艺术家,他们知道如何通过告诉后端对象做什么来绘制他们自己。在该层的顶部是模拟MATLAB的状态机接口。

您在图形中看到的所有内容都在内部表示为艺术家,艺术家可以包含其他艺术家。例如,对象跟踪其子对象艺术家,这些子对象是轴脊椎、记号、标签、线条或图像等,对象是图形对象的子对象。当你告诉一个人物画它自己(通过fig.canvas.draw())时,所有的子艺术家都被递归地画出来。

这种设计的一个缺点是,Artist的给定实例化可以正好在一个图形中(并且在图形之间移动它们很困难),因此您不能创建一个AxesImage对象,然后继续重用它。

这个设计也分离了艺术家所知道的东西。坐标轴对象知道诸如刻度位置和标签以及显示范围之类的东西(它通过了解坐标轴对象来做到这一点,但这更深入到杂草)。像vminvmax这样的东西封装在Normize(doc)对象中,由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

还有一个rcParams接口,它允许您以全局方式更改matplotlib的许多位和片段的默认值。

还有另一种方法(通过部分

 类似资料:
  • 问题内容: 我正在为特定实验构建一类绘图工具。我目前有两种绘图方法,一种使用imshow()的静态绘图,一种也使用imshow()的“电影”格式。 这两种方法以及任何将来的方法都将获得与我可能编写的任何特定绘图方法相同的参数。使用plot类时,我在配置对象中具有所有这些参数。 我不想在每种绘图方法中都重写代码。我想初始化一个将设置以下args的对象(我认为是AxesImage):vmin,vmax

  • 我在使用Mockito进行单元测试初始化对象时遇到了一些困难 这是我的测试代码 要测试的代码 RecTangleService、CircleService和SquareService用注释我尝试了很多选项,最终得出结论。我没有得到我错在哪里。我试着在网上搜索了很多地方,但找不到任何帮助。

  • 我预计Spring会通过将属性“property.key”设置为“property_value”来初始化StorageConfiguration对象。 但是,我得到以下异常 org.springframework.beans.factory.beanCreationException:创建类路径资源[applicationContext.xml]中定义的名为“storage”的bean时出错:在设

  • 问题内容: 有没有办法直接使用字典中的数据来绘制条形图? 我的字典看起来像这样: 我期待 工作,但事实并非如此。 这是错误: 问题答案: 您可以通过首先绘制条形图然后设置适当的刻度来分两行进行: 请注意,倒数第二行应在python3中读取,因为它会返回一个生成器,而matplotlib无法直接使用该生成器。

  • 我想使用“=”符号初始化MyClass的对象。 例如。字符串a=“你好”; 我想做 这是我用构造函数写的类