用模块中的matplotlib绘图

时间:2011-02-23 11:02:06

标签: python matplotlib

这是我第一次使用python绘图,我想我不太了解matplotlib中对象之间的交互。我有以下模块:

import numpy as np
import matplotlib.pyplot as plt

def plotSomething(x,y):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.set_xscale("log", nonposx='clip')
    ax.set_yscale("log", nonposy='clip')
    ax.scatter(x,y)                                  #(1)
    plt.scatter(x,y)                                 #(2)

并且在调用函数时给出了很好的结果(给定x和y)。

a)如果我注释掉(1)或(2)只有轴'被绘制而不是散射本身。

b)然而,如果(1)和(2)都被取消注释并且我将vars s = 5,marker ='+'添加到(1)XOR(2)中,该图将显示两个标记(一个在另一个之上) - 默认的'o'和'+',意味着我实际上绘制了两次散点图。

但是 - 如果同时将(1)和(2)都取消注释我正在绘制两次,为什么我实际上需要同时拥有(1)和(2)才能看到任何分散?为什么如果(a)我根本没有散点图?

我很困惑。谁能引导我通过?

2 个答案:

答案 0 :(得分:2)

正在发生的事情可能与Python的垃圾收集有关。我无法确切地告诉您发生了什么,因为提供的代码示例永远不会呈现情节。我猜你在函数之外渲染它,在这种情况下,你在渲染(绘图)之前有效地做了del fig

这应该有效:

def plotSomething(x,y):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.set_xscale("log", nonposx='clip')
    ax.set_yscale("log", nonposy='clip')
    ax.scatter(x,y)   
    fig.savefig('test.png')

如果你想延迟渲染/绘制,那么传递一个引用:

def plotSomething(x,y):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.set_xscale("log", nonposx='clip')
    ax.set_yscale("log", nonposy='clip')
    ax.scatter(x,y)   
    return fig

答案 1 :(得分:1)

(我不是不同对象如何相互作用的专家)

你应该添加plt.show()然后你可以有(1)或(2)。例如:

#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt

def plotSomething(x,y):
   fig = plt.figure()
   ax = fig.add_subplot(111)
   ax.set_xscale("log", nonposx='clip')
   ax.set_yscale("log", nonposy='clip')
   #ax.scatter(x,y)                                  #(1)
   plt.scatter(x,y)                                 #(2)
   plt.show()

x=[1,2,3]
y=[5,6,7]
plotSomething(x,y)