gpt4 book ai didi

python - Matplotlib:使用图形对象初始化绘图

转载 作者:太空狗 更新时间:2023-10-29 22:09:37 25 4
gpt4 key购买 nike

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

对于我可能编写的任何特定绘图方法,这两种方法和任何 future 的方法都获取相同的参数。在使用绘图类时,我在配置对象中拥有所有这些参数。

我不想在每个绘图方法中重写代码。我想初始化一个将设置这些参数的对象(我认为是 AxesImage):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)

最佳答案

您首先需要了解 matplotlib 的一些架构(请参阅 here 由创始人和现任首席开发人员撰写的长文)。在处理渲染和与硬件对话的 backend 层的底部。在该层之上的是 artists,他们知道如何通过告诉 backend 对象做什么来绘制自己。在该层之上是 pyplot state machine模仿 MATLAB 的界面。

你在图中看到的一切都在内部表示为 Artist 并且 artists 可以包含其他 artists。例如,Axes 对象会跟踪它的子对象 Artists,它们是轴的脊椎、刻度、标签、您的线条或图像等,以及 Axes对象是 Figure 对象的子对象。当您告诉图形自己绘制时(通过 fig.canvas.draw()),所有子艺术家都将递归绘制。

这种设计的一个缺点是 Artist 的给定实例可以恰好在一个图形中(并且很难在图形之间移动它们)所以你不能制作一个 AxesImage 对象,然后继续重用它。

这种设计也将 Artists 知道的东西分开了。 Axes 对象知道诸如刻度位置和标签以及显示范围之类的事情(它通过了解 Axis 对象来做到这一点,但这更像是杂草)。 vminvmax 封装在 Normalize ( doc ) 对象中,AxesImage 会跟踪这些对象。这意味着您需要将处理列表中所有内容的方式分开。

我建议在这里使用类似工厂的模式,或类似 curry 的模式

像工厂一样:

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)

您可以包装一整套 kwargs 以便轻松地重新使用它们:

my_imshow_args = {'extent':[...],
'interpolation':'nearest',
'norm': my_norm,
...}

ax2.imshow(..., **my_imshow_args)

像 curry 一样:

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)

如果你想变得 super 聪明,你可以用你的版本猴子补丁 plt.imshow

plt.imshow = my_imshow

还有 rcParams接口(interface)允许您以全局方式更改 matplotlib 的许多位和片段的默认值。

yet another实现此目的的方法(通过 partial)

关于python - Matplotlib:使用图形对象初始化绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com