2011-02-23 5 views
1

C'est la première fois que j'utilise python pour tracer et je suppose que je ne comprends pas très bien les interactions entre les objets dans matplotlib. Je vais avoir le module suivant:tracer avec matplotlib à partir d'un module

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) 

et parcelles très bien lorsque la fonction est appelée (donnée x et y).

a) Si je commente (1) ou (2) seulement l'axe 'est tracé mais pas la dispersion elle-même. B) Cependant, si à la fois (1) et (2) ne sont pas commentés et que j'ajoute le vars s = 5, marker = '+' à (1) XOR (2) le chiffre montrera les deux marqueurs (l'un sur l'autre) - le 'o' par défaut et le '+', ce qui signifie que je trace deux fois le scatter. MAIS - si en ayant à la fois les commentaires (1) et (2) non commentés, je suis en train de comploter deux fois, pourquoi ai-je réellement besoin de deux (1) et (2) pour voir une dispersion? pourquoi dans le cas (a) je ne reçois aucun nuage de points?

Je suis perplexe. Quelqu'un peut-il me guider à travers?

Répondre

2

Ce qui se passe est probablement lié à la récupération de place de Python. Je ne peux pas vous dire exactement ce qui se passe parce que l'échantillon de code fourni ne rend jamais l'intrigue. Je devine que vous le faites en dehors de la fonction, auquel cas, vous effectuez effectivement un del fig avant le rendu (dessin).

Cela devrait fonctionner:

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

Si vous voulez retarder le rendu/tirer ensuite passer une référence:

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

(Je ne suis pas expert dans la façon dont différents objets interagissent les uns avec les autres)

Vous devez ajouter plt.show() et vous pouvez soit (1) ou (2). Par exemple:

#!/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) 
Questions connexes