【问题标题】:Python with matplotlib - reusing drawing functionsPython with matplotlib - 重用绘图函数
【发布时间】:2010-11-27 16:09:41
【问题描述】:

我对此question 有一个后续问题。

是否可以通过在图形的不同部分上工作的多个 python 脚本来简化图形的生成?

例如,如果我有以下功能:

FunctionA:绘制某事物的直方图
函数B:绘制一个包含文本的框
函数C:绘制某事物C的图
函数D:绘制某事物D的图

如何在不同的脚本中重复使用上述函数?例如,如果我想创建一个带有直方图和 C 的图的图形,我会以某种方式从我的脚本中调用 FunctionA 和 FunctionC。或者,如果我想要一个包含两个图的图形,我会调用 FunctionC 和 FunctionD。

我不确定我是否清楚地解释了自己,但提出这个问题的另一种方式是:如何将图形对象传递给函数,然后让函数向传递的图形对象绘制一些东西,然后将其返回到主脚本以添加其他内容,例如标题或其他内容?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    在这里您要使用Artist objects,并根据需要将它们传递给函数:

    import numpy as np
    import matplotlib.pyplot as plt
    
    def myhist(ax, color):
        ax.hist(np.log(np.arange(1, 10, .1)), facecolor=color)
    
    def say_something(ax, words):
        t = ax.text(.2, 20., words)
        make_a_dim_yellow_bbox(t)
    
    def make_a_dim_yellow_bbox(txt):
        txt.set_bbox(dict(facecolor='yellow', alpha=.2))
    
    fig = plt.figure()
    ax0 = fig.add_subplot(1,2,1)
    ax1 = fig.add_subplot(1,2,2)
    
    myhist(ax0, 'blue')
    myhist(ax1, 'green')
    
    say_something(ax0, 'this is the blue plot')
    say_something(ax1, 'this is the green plot')
    
    plt.show()
    

    【讨论】:

    • 不客气!要格式化代码,请将整个代码块缩进四个额外的空格,并在代码中使用空格而不是制表符。这里有更多关于格式化的内容:stackoverflow.com/editing-help
    • 为什么myhist()say_something() 不必将ax 返回到外部命名空间?
    • @RovingRichard:Python 通过引用传递,因此两个 fcn 作用于传入其中的对象,这些对象与全局命名空间中的对象相同(例如,具有相同的id)。 (我希望这能回答您的问题,但如果没有,您需要说明为什么您认为 fcns 必须返回 ax。)
    • @tom10 天哪!一直以来我都在想,当我将object1 传递给一个函数时,该函数创建了它自己的命名空间,并复制了object2,如果我想更新object1,我必须return object2
    【解决方案2】:

    好的,我已经想出办法了。这比我想象的要简单得多。它只需要阅读herefigureaxes 类。

    在您的主脚本中:

    import pylab as plt  
    import DrawFns  
    fig = plt.figure()  
    (do something with fig)  
    DrawFns.WriteText(fig, 'Testing')  
    plt.show()
    

    在你的 DrawFns.py 中:

    def WriteText(_fig, _text):  
    [indent]_fig.text(0, 0, _text)
    

    就是这样!我可以在 DrawFns.py 中添加更多函数并从任何脚本调用它们,只要它们包含在 import 调用中。 :D

    【讨论】:

    • 这是正确的想法,除了通常图形包含一个或多个轴,并且大部分操作是调用轴方法来制作绘图,因此制作图形更容易,然后是轴,并将轴(或其中的某些对象)传递给函数。例如,请参阅我的答案。
    • 对不起,我刚看到这个。谢谢你的提示。我将相应地更改代码(离线)。谢谢!
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多