2017-07-18 1 views
0

点集合([x、y])が与えられたときに更新されるプロットを作成しようとしていますが、残りのデータをプロットします。私は関数呼び出しをループしましたが、最初の呼び出しで固まってしまいます。私は関数に単一のxとyの値の複数のセットを与え、それらをグラフにプロットできるようにする必要があります。matplotlibを使用しているときにプロットが新しい点を描画するために更新されない

これはこれまでのコードです。

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from matplotlib import style 
from numpy import * 
from time import sleep 
import random as rd 

class graphUpdater(): 

    def __init__(self): 
     # Initialize arrays to be plotted 
     self.xs = [] 
     self.ys = [] 

     style.use('fivethirtyeight') # Figure Style 
     self.fig = plt.figure() # Initialize figure 
     self.ax1 = self.fig.add_subplot(111) # Create a subplot 
     # Ensure the figure auto-scales to fit all points. Might be overkill 
     self.ax1.set_autoscalex_on(True) 
     self.ax1.set_autoscaley_on(True) 
     self.ax1.set_autoscale_on(True) 
     self.ax1.autoscale(enable = True, axis = 'both', tight = False) 
     self.ax1.autoscale_view(False, True, True) 

    # Function that plots the arrays xs and ys. Also plots a linear regression of the data 
    def plotPoint(self): 
     self.ax1.clear() # Clears previous values to save memory 
     xp = linspace(min(self.xs), max(self.xs)) # x-range for regression 
     if(len(self.xs) > 1): # Conditional for regression, can't linearise 1 point 
      p1 = polyfit(self.xs, self.ys, 1) # Get the coefficients of the polynomial (slope of line) 
      self.ax1.plot(xp, polyval(p1, xp)) # Plot the line 
     self.ax1.plot(self.xs, self.ys, "+") # Plot the raw data points 
     self.ax1.set_xlabel('(L/A)*I') # Axis and title labels 
     self.ax1.set_ylabel('V') 
     self.ax1.set_title('DC Potential Drop') 

    def appendPlot(self, x, y): 
     self.xs.append(float(x)) # Append xs with x value 
     self.ys.append(float(y)) # Append ys with y value 
     self.plotPoint() # Call the plotPoint function to plot new array values 
     plt.show(block=False) # Plot and release so graphs can be over written 

# Call the function 
plsWork = graphUpdater() # I'm very hopeful 
i = 0 
while(i < 50): 
    plsWork.appendPlot(i, rd.randint(0, 20)) 
    i += 1 
    sleep(0.1) 
quit_case = input("Hit 'Enter' to Quit") # Conditional so the plot won't disappear 

完全には機能しません。 quit_case行にブレークポイントを置き、pycharmのデバッガでブレークポイントを実行すると、グラフが「適切に」プロットされます。

答えて

1

plt.show(block=False)を使用せず、time.sleepを使用しないでください。代わりに、matplotlibはanimation moduleを提供します。このような問題を避けるために使用することができます。

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from matplotlib import style 
from numpy import * 
from time import sleep 
import random as rd 
#%matplotlib notebook use in case of running this in a Jupyter notebook 

class graphUpdater(): 

    def __init__(self): 
     # Initialize arrays to be plotted 
     self.xs = [] 
     self.ys = [] 

     style.use('fivethirtyeight') # Figure Style 
     self.fig = plt.figure() # Initialize figure 
     self.ax1 = self.fig.add_subplot(111) # Create a subplot 
     # Ensure the figure auto-scales to fit all points. Might be overkill 
     self.ax1.set_autoscalex_on(True) 
     self.ax1.set_autoscaley_on(True) 
     self.ax1.set_autoscale_on(True) 
     self.ax1.autoscale(enable = True, axis = 'both', tight = False) 
     self.ax1.autoscale_view(False, True, True) 

    # Function that plots the arrays xs and ys. Also plots a linear regression of the data 
    def plotPoint(self): 
     self.ax1.clear() # Clears previous values to save memory 
     xp = linspace(min(self.xs), max(self.xs)) # x-range for regression 
     if(len(self.xs) > 1): # Conditional for regression, can't linearise 1 point 
      p1 = polyfit(self.xs, self.ys, 1) # Get the coefficients of the polynomial (slope of line) 
      self.ax1.plot(xp, polyval(p1, xp)) # Plot the line 
     self.ax1.plot(self.xs, self.ys, "+") # Plot the raw data points 
     self.ax1.set_xlabel('(L/A)*I') # Axis and title labels 
     self.ax1.set_ylabel('V') 
     self.ax1.set_title('DC Potential Drop') 

    def appendPlot(self, x, y): 
     self.xs.append(float(x)) # Append xs with x value 
     self.ys.append(float(y)) # Append ys with y value 
     self.plotPoint() # Call the plotPoint function to plot new array values 

# Call the function 
plsWork = graphUpdater() # I'm very hopeful 

f = lambda i: plsWork.appendPlot(i, rd.randint(0, 20)) 

ani = animation.FuncAnimation(plsWork.fig, f, frames=50, interval=100, repeat=False) 
plt.show() 
+0

私はランタイムエラー RuntimeWarning取得:true_divide LHS/=規模 –

+0

に遭遇した無効な値が**私はそれを修正しました。ありがとう –

関連する問題