Не могу заставить холст рисовать рис в matplotlib - PullRequest
3 голосов
/ 08 марта 2012

Исходя из моего базового понимания использования matplotlib, вы сохраняете нужный вам plt в некотором «fig», а затем можете рисовать «fig» с помощью операции canvas.draw (). Если это так, то у меня не должно быть никаких проблем, но поскольку я это делаю, что именно происходит и какова логика получения чего-то на холсте. Кроме того, моей конечной целью является отображение этого графика в окне QtPy. На данный момент я могу показать окно и холст, но холст отображается пустым. Я смотрю на http://matplotlib.sourceforge.net/users/artists.html и чувствую, что то, что я делаю, не совсем неправильно, но, возможно, я упускаю из виду какой-то нюанс. Вот код, на который я ссылаюсь:

def drawThis(self):

        self.axes.clear()
        self.axes.grid(self.grid_cb.isChecked())
        self.fig = plt.figure(figsize=(11,7),dpi=self.dpi)
        file = fileList[selFile]
        valid = [sColumn]
        matrix = np.loadtxt(file, skiprows=1, usecols=valid)
        colCount = np.loadtxt(file, dtype=object)
        totalCols = colCount.shape[1]

        kdeData = np.array(matrix)
        dataRange = (Decimal(max(abs(kdeData))) / 10).quantize(1, rounding=ROUND_UP) * 10

        gkde = stats.gaussian_kde(kdeData)
        ind = np.linspace(-int(dataRange), int(dataRange), len(kdeData) * sSamples)
        kdepdf = gkde.evaluate(ind)

        ##plot histogram of sample
        plt.hist(kdeData, len(kdeData), normed=1, alpha=0.20)
        ##plot data generating density
        plt.plot(ind, stats.norm.pdf(ind), 'r', linewidth=0.8, label='DGP normal')
        ##plot estimated density
        plt.plot(ind, kdepdf, 'g', linewidth=0.8, label='kde')
        plt.title('KDE for '+ str(nameList[selFile]))
        plt.legend()

        self.fig.canvas.draw()

1 Ответ

2 голосов
/ 08 марта 2012

У меня нет опыта работы с matplotlib, но, глядя на ваш код, мне интересно, правильно ли вы используете pyplot?То, как ваш код выглядит для меня, заключается в том, что вы используете pyplot для генерации данных (которые вы не сохраняете возвращаемые значения), а затем вы строите их, но я думаю, что на самом деле она не работает на вашем экземпляре оси.

Пример того, как я видел использование matplotlib, можно найти здесь: Segfault с использованием matplotlib с PyQt .., где он фактически непосредственно создает PyQt4 FigureCanvas и строит графики непосредственно для своего экземпляра оси.

Похоже, что метод pyplot.plot() может взять параметр figure и axis, чтобы сообщить ему, какой экземпляр использовать.Интересно, если он не использует вашу ось, так как я не вижу в вашем примере, как вы создаете саму ось.Взгляните на документы здесь

Я думаю, вы можете попробовать сделать что-то вроде этого:

plt.plot(ind, kdepdf, 'g', axis=self.axis, linewidth=0.8, label='kde')

Или, возможно, подтвердите, что у вас есть createe self.axisс помощью self.axis = plt.axis(), или даже попытаться выполнить всю графику непосредственно с экземпляром оси?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...