2015-04-03 70 views
0

我有一個看起來像這樣的函數。我將像940320這樣的整數添加到數據中。有趣的是,print語句正確地顯示它是一個int。但是,圖表似乎強制圖表的兩個小數點?!令人生氣的是它使用來顯示數據爲整數,但它已停止工作,即使我不認爲我已經做出任何可能導致此問題的更改!向數據添加整數,但繪製一個實數

我注意到的一個線索是情節標籤過去常常在名稱末尾有(s),例如Symbol1(s)。但現在由於某種原因,他們最後說(ks)。我不知道這是做什麼。

在任何情況下,是否有辦法強制pyqtgraph繪製一個int而不是它認爲數字的精度是什麼?

import pyqtgraph as pg 
from pyqtgraph.Qt import QtCore, QtGui 

import numpy as np 

win = pg.GraphicsWindow() 
win.setWindowTitle('Scrolling Plots') 
win.showMaximized() 

# 1) Simplest approach -- update data in the array such that plot appears to scroll 
# In these examples, the array size is fixed. 
p1 = win.addPlot() 
p2 = win.addPlot() 

p1.setLabel('left', 'Symbol1', 's') 
p2.setLabel('left', 'Symbol2', 's') 

data1 = [] 
data2 = [] 
data3 = [] 
data4 = [] 

curve1 = p1.plot(data1) 
curve2 = p2.plot(data2) 

win.nextRow() 

p3 = win.addPlot() 
p4 = win.addPlot() 

p3.setLabel('left', 'Symbol3', 's') 
p4.setLabel('left', 'Symbol4', 's') 

curve3 = p3.plot(data3) 
curve4 = p4.plot(data4) 

def update1(data): 
    global data1, curve1, ptr1 
    print "Got symbol 1 ", data 

    if data1: 
     data1[:-1] = data1[1:] # shift data in the array one sample left 
           # (see also: np.roll) 
    data1.append(data) 
    curve1.setData(data1) 

    ptr1 += 1 
    QtGui.QApplication.instance().processEvents() 

if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 

編輯:

即使我說data1.append(int(data))相同的行爲

編輯1:

像0.92345添加數據將轉移圖來(MS),也力要顯示的數據爲923.45

所以試圖繪製整數,並且嘗試繪製小於1的雙精度值似乎有奇怪的行爲。

+0

你能更清楚什麼是「圖形似乎迫使兩位小數點圖」的意思?點出現在錯誤的地方?軸標籤是否錯誤?這將有助於發佈一個例子,1)立即顯示不正確的行爲,2)執行(不要讓我們調試你的例子)。 – Luke 2015-04-04 15:04:47

+0

有沒有辦法在這裏發佈圖片? – Ivan 2015-04-05 00:50:27

+0

如果我添加9.43456,它會正確顯示在圖形中,並且軸對於正在進入的數字有意義。如果我輸入0.94356,它會強制圖中的數字爲943.56,並且該軸對於該數字有意義。奇怪的是,在我添加數字之前,我在控制檯上輸入了我添加的數字,這是正確的。這是這樣做的圖形本身有點奇怪。如果我添加943560,它也會強制943.56。如果我添加ints,圖表顯示(ks)。如果添加像0.9這樣的數字,它會顯示(ms)。只有當我添加雙打> = 1時,該圖顯示了我所要求的,(s) – Ivan 2015-04-05 01:13:06

回答

1

AxisItem自動縮放的單位。當你寫

p3.setLabel('left', 'Symbol3', 's')

你是在告訴該軸的數據有「S」的單位AxisItem,它會自動應用的SI前綴,以保持刻度標記小。因此,如果您的值從0變爲0.0001,則軸值將顯示爲0到100,單位將爲'μs'(因爲0.0001 s與100μs相同)。

如果不希望這種行爲,那麼就省略單位參數:

p3.setLabel('left', 'Symbol3 (s)')

+0

tada!謝謝。順便說一句,爲什麼在Symbol3之後的額外(s)?我剛寫了Symbol,它似乎工作。 – Ivan 2015-04-06 19:17:34

+0

還有一個問題,如果我不想爲軸顯示1.2445,我實際上希望它向我顯示零,1.24450如何告訴它顯示多少個精度符號?換句話說,如果數字太小,我希望軸始終保持一定的精度並填充零。這樣,我不會得到一些數字爲兩個數字,其餘3個,等等。 – Ivan 2015-04-06 19:19:06

+0

這只是一個字符串顯示在軸標籤;我以爲你想要那裏的(s)。任何字符串都被允許。要更改刻度字符串,您需要創建一個'AxisItem'子類並覆蓋''tickStrings()'。默認實現非常簡單:https://github.com/pyqtgraph/pyqtgraph/blob/develop/pyqtgraph/graphicsItems/AxisItem.py#L736 – Luke 2015-04-07 21:31:29

0

我正在看看它,但我已經糾正了一些錯誤,例如忘記用sys.argv實例化QtGui.QApplication。如果你提供一個單元串

import sys 
import numpy as np 
import pyqtgraph as pg 
from pyqtgraph.Qt import QtCore, QtGui 
QtApp = QtGui.QApplication(sys.argv) 


win = pg.GraphicsWindow() 
win.setWindowTitle('Scrolling Plots') 
win.showMaximized() 

# 1) Simplest approach -- update data in the array such that plot appears to scroll 
# In these examples, the array size is fixed. 
p1 = win.addPlot() 
p2 = win.addPlot() 

p1.setLabel('left', 'Symbol1', 's') 
p2.setLabel('left', 'Symbol2', 's') 

data1 = [] 
data2 = [] 
data3 = [] 
data4 = [] 

curve1 = p1.plot(data1) 

def update1(data): 
    global data1, curve1, ptr1 
    print "Got symbol 1 ", data 

    if data1: 
     data1[:-1] = data1[1:] # shift data in the array one sample left 
     # (see also: np.roll) 
    data1.append(data) 
    curve1.setData(data1) 

    ptr1 += 1 
    QtApp.instance().processEvents() 

if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtApp.instance().exec_() 
+0

謝謝。然而,這些事情都沒有影響。 – Ivan 2015-04-03 23:49:30

+0

我很快就會找到答案。 – alexisdevarennes 2015-04-03 23:52:04

+0

我在帖子中增加了一些代碼...不應該有所作爲 – Ivan 2015-04-03 23:52:55