2016-07-19 3 views
0

Я новичок в Python matplotlib и хочу сделать фигуру обновленной в цикле. Это простой тестовый код. Я хочу нарисовать 3 графика, каждый на 2 секунды, с разными склонами каждый раз. Конечно, я знаю, что я должен прочитать еще кое-что о matplotlib, но мне нужно что-то сделать быстро. Что не так? Благодаря!обновить фигуру внутри цикла

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
import numpy as np 
import time 

def demo(a): 
    y = [xt*a+1 for xt in x] 
    ax.plot(x,y) 

if __name__ == '__main__': 
    plt.ion() 
    fig, ax = plt.subplots() 
    ax.set_ylim([0,15]) 
    x = range(0,5) 
    for a in range(1,4): 
     demo(a) 
     time.sleep(2) 

Я думал plt.ion() делает его интерактивным и ax.plot(x,y) вступают в силу немедленно (но думаю, нет). Я попытался добавить ax.draw() после ax.plot(x,y), но для этого требуются некоторые аргументы, такие как художник или что-то, чего я еще не знаю :). Кроме того, у меня появилось это сообщение об ошибке (Ubuntu 14.04.LTS).

Xlib: extension "XInputExtension" missing on display ":1.0". 
X Error: BadDrawable (invalid Pixmap or Window parameter) 9 
    Major opcode: 62 (X_CopyArea) 
    Resource id: 0x0 

EDIT: Я добавляю правильный код ниже. (Согласно решению Estilus, к которому я изменил немного для корректного отображения графа.

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
import numpy as np 
import time 

def demo(a): 
    plt.cla() 
    y = [xt*a+1 for xt in x] 
    ax.set_ylim([0,15]) 
    ax.plot(x,y) 

if __name__ == '__main__': 
    plt.ion() 
    fig, ax = plt.subplots() 
    x = range(5) 
    for a in range(1,4): 
     demo(a) 
     plt.pause(3) 
     plt.draw() 
+0

Возможный дубликат [Как обновить сюжет в matplotlib?] (Http://stackoverflow.com/questions/4098131/how-to-update-a-plot-in-matplotlib) –

+0

Возможный дубликат [Определение нескольких графики для анимации с помощью цикла for matplotlib] (http://stackoverflow.com/questions/21937976/defining-multiple-plots-to-be-animated-with-a-for-loop-in-matplotlib) – hashcode55

ответ

2

So plt.ion() должна быть приостановлена ​​в течение короткого периода времени для того, чтобы быть интерактивным. В противном случае вы просто столкнетесь с замороженным белым экраном. Во-вторых, вы хотите использовать draw() для обновления фигуры. Таким образом, ваш код будет выглядеть примерно так:

import matplotlib.pyplot as plt 
import numpy as np 
import time 

def demo(a): 
    y = [xt*a+1 for xt in x] 
    ax.plot(x,y) 

if __name__ == '__main__': 
    plt.ion() 
    fig, ax = plt.subplots() 
    ax.set_ylim([0,15]) 
    x = range(0,5) 
    for a in range(1,4): 
     demo(a) 
     plt.pause(3) 
     plt.draw() 

установить время паузы будет 3 секунды, но это может быть довольно небольшое количество, если вы хотите (например, 0,000001). Надеюсь, это помогло!

+0

Привет, это работает. за исключением того, что я переместил ax.set_ylim ([0,15]) внутрь demo().в противном случае илим установлен неправильно. Благодаря! –

0

Похоже, что вы пытаетесь понять how to update a plot in matplotlib.

Вы должны использовать этот код, чтобы понять, как использовать fig1.canvas.draw() для обновить данные диаграммы:.

fig1 = figure() 

for n in range(30): 

    ## Clear the figure 
    clf() 

    # Do a plot that changes for each iteration 
    plot(range(n)) 

    # Now set the xlimit so that it doesn’t change the plot 
    xlim((0,30)) 
    ylim((0,30)) 

    ## Now the magic, we must update the canvas 
    fig1.canvas.draw() 
0

Вот код, который работает ключевые линии:

  • plt.cla(): очистить ось между каждой ничьей. Удалите эту строку, если хотите сохранить все графики.
  • fig.canvas.draw(): на самом деле рисовать сюжет в канву рисунка

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
import numpy as np 
import time 

def demo(a): 
    plt.cla() 
    y = [xt*a+1 for xt in x] 
    ax.set_ylim([0,200]) 
    ax.plot(x,y) 
    fig.canvas.draw() 

if __name__ == '__main__': 
    plt.ion() 
    fig, ax = plt.subplots() 
    x = range(5) 
    for a in range(40): 
     demo(a) 
     time.sleep(0.1) 
+0

I сделал точно, как вы показали мне, но это дает мне эту ошибку. (возможно, не связанный с python). и через пару секунд я не вижу никаких фигур, кроме короткого мигающего фигурного окна. Xlib: расширение «XInputExtension» отсутствует на дисплее «: 1.0». X Ошибка: BadDrawable (недопустимый параметр Pixmap или Window) 9 Основной код операции: 62 (X_CopyArea) Идентификатор ресурса: 0x0 –

+0

@ChanKim это не связано с Python. Это проблема с вашей графической средой (виртуальная машина?) – Frodon

+0

Я знаю, поэтому я скопировал ваш код на мою машину CentOS6.7, но не появилось окно с изображением. Скрипт заканчивается через несколько секунд. Что может быть неправильным? Вы уверены, что ваш модифицированный код работает нормально на вашем компьютере? –

Смежные вопросы