【问题标题】:Matplotlib: variable size of subplots?Matplotlib:子图的可变大小?
【发布时间】:2016-02-21 19:47:18
【问题描述】:

我有一个项目,我用 matplotlib 绘制和保存图形。由于项目本身运行良好,我最近开始重构,但有一个问题我还没有找到好的解决方案。为了拆分实现和日志记录,我编写了一个日志记录类,它将数据传递给绘图类,但我遇到了一个问题:在运行之前我不知道一个日志记录图/图形中将存在多少子图

所以,在重构之前,我有很多不同的绘图函数和许多 if 语句。现在我想将所有这些东西传递给我的绘图类......但目前我不知道绘图类应该如何处理这些数据。

事先我有这样的事情(这里:4个子图):

f, axarr = plt.subplots(2, 2)

axarr[0, 0].set_title("original image")
axarr[0, 0].imshow(oimg, interpolation="none", cmap="gray")

axarr[0, 1].set_title("cost data") 
axarr[0, 1].plot(cost_data, ...)
(...)

当然,我可以在我的绘图类中为 1、2、3、... 子图创建 6 种不同的方法,但随后我又在那里重复。

我能否以某种方式创建一个缓冲区在循环中动态添加一个子图或类似的东西?

还有其他想法吗?

【问题讨论】:

  • 编写以Axes 对象 + 数据作为输入的绘图函数。在子图 + 数据列表上编写 for 循环相对容易。
  • 是的,但我希望绘图方法动态创建轴对象,以便绘图类采用任何大小的输入并为输入创建确切数量的子图。如果我必须输入轴对象,我将不得不手动在我想要绘制数据的任何地方以固定大小手动执行plt.subplots(2, 2)?!
  • 分离逻辑,一组将数据绘制到单个Axes 的函数和一个接收数据+选项+配置+任何内容的调度函数,创建图形+轴,然后调度到前面提到的函数。这样您就可以获得最大程度的代码重用(和可读性!)。
  • 你可以动态调整Axes对象的大小,但是没有很好的内置工具。
  • 你能提供一个例子吗?也许对我来说太晚了,我应该去睡觉了,但我想不出调度程序功能的合适解决方案..

标签: python dynamic matplotlib plot subplot


【解决方案1】:
def plotA(ax, data):
    pass

def plotB(ax, data):
    pass

def dispatcher(data, list_of_plot_types):
    function_map = {'A': plotA, 'B': plotB}
    fig, list_of_axes = plt.subplots(1, len(list_of_plot_types))

    for ax, plot_type in zip(list_of_axes, list_of_plot_types):
        function_map[plot_type](ax, data)

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 2015-07-15
    • 1970-01-01
    • 2017-11-14
    • 2021-08-05
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多