Python与matplotlib - 重用绘图函数

12

我对这个问题有一个后续问题。这里

如果我有多个 python 脚本可以处理图形的不同部分,那么能否通过这种方式来简化图形生成流程呢?

例如,如果我有以下函数:

FunctionA: 绘制某物的直方图
FunctionB: 绘制带有文本框的盒子
FunctionC: 绘制某物 C 的图形
FunctionD: 绘制某物 D 的图形

如何在不同的脚本中重复使用上述功能呢?例如,如果我想创建一个具有某物 C 图形的直方图的图像,则会从我的脚本中调用 FunctionA 和 FunctionC。或者,如果我想要两幅图,我就会调用 FunctionC 和 FunctionD。

我不确定我是否表达清楚了,但是另一个问这个问题的方式是:如何将图像对象传递给函数,然后让函数向传递的图像对象绘制某些东西,然后将其返回到主脚本以添加其他元素,如标题等?

2个回答

8

在这里,你需要使用艺术家对象,并根据需要将它们传递给函数:

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()

alt text


不用谢!为了格式化代码,请将整个代码块缩进四个额外空格,并在您的代码内部使用空格而不是制表符。关于格式化的更多信息请参考这里:http://stackoverflow.com/editing-help - tom10
为什么 myhist()say_something() 不需要将 ax 返回到外部命名空间中? - crypdick
1
@RovingRichard:Python 采用引用传递,因此这两个函数作用于传递给它们的对象,这些对象与全局命名空间中的对象相同(例如,具有相同的“id”)。我希望这回答了你的问题,但如果没有,请说明为什么你认为这些函数必须返回“ax”。 - tom10
@tom10 哎呀!我一直以为当我将 object1 传递给函数时,函数会创建自己的命名空间并复制 object2,如果我想要更新 object1,就必须 return object2 - crypdick

0
好的,我已经想出如何做到这一点了。它比我想象的要简单得多。它只需要阅读一些关于这里的内容,使用figureaxes类即可。
在你的主脚本中:
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


这是正确的想法,除了通常图形包含一个或多个轴,大部分操作都是调用轴方法来制作图形,所以更容易先制作图形,然后是轴,并将轴(或其中的某个对象)传递给函数。请参见我的答案以获取示例。 - tom10
抱歉,我刚看到这个消息。感谢您的提示。我会相应地更改代码(离线)。谢谢! - aspade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接