черчение с помощью matplotlib из модуля - PullRequest
1 голос
/ 23 февраля 2011

Я впервые использую 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)не комментируются, и я добавляю переменные s = 5, marker = '+' к любому (1) XOR (2), на рисунке будут показаны оба маркера (один поверх другого) - по умолчанию 'o' и '+', что означает, что я на самом деле нанести разброс дважды.

НО - если из-за того, что оба (1) и (2) не закомментированы, я строю графики дважды, почему мне действительно нужно иметь оба (1) и (2), чтобы увидеть какой-либо разброс?почему в случае (а) у меня вообще нет разбросанного графика?

Я озадачен.Кто-нибудь может направить меня?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

То, что происходит, вероятно, связано с сборкой мусора в 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 голос
/ 23 февраля 2011

(я не эксперт в том, как разные объекты взаимодействуют друг с другом)

Вы должны добавить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...