2017-07-14 76 views
-2

我已經用python包裝了一個C庫,並使用ctypes並調用了這些DLL。然後我創建了一個可打印出我所有數據的for循環。這裏是我包裝的代碼的一小部分。使用for-loop值創建基本圖

import ctypes 
from ctypes import * 
import matplotlib.pyplot as plt 

class ParmData(Union): 
_fields_ = [ 
    ('c', ctypes.POINTER(ctypes.c_ubyte)), 
    ('f', ctypes.POINTER(ctypes.c_float))] 
class SParm(Structure): 
pass 
SParm._fields_ = [ 
    ('data', ctypes.POINTER(ParmData)), 
    ('time', ctypes.POINTER(ctypes.c_float))] 

dll.readSParm.argtypes = (POINTER(SFile), c_char_p, c_double, c_double, c_double, POINTER(TTag), c_ushort,) 
dll.readSParm.restype = POINTER(SParm) 
g = dll.readSParm(SF, ParmName, startTime, stopTime, Null, None, convertType) 
dll.freeSParm(g) 

我想創建一個簡單的圖形,其中包含從for循環打印出來的數據點。這是我到目前爲止有:

for i in range(0, 1032): 
x = (g[0].time[i]) 
y = (g[0].data[0].f[i]) 
print(i, x, y) 

這for循環完美的作品,並打印出所有的數據到一個整潔的名單,但我需要一個列表被繪製成一個簡單的圖表。 for循環的迴歸看起來是這樣的:

1028 -1.2241029739379883 1.7323481895261962e+19 
1029 -0.22411400079727173 2.635080461412465e+23 
1030 0.7759910225868225 1.7829588197038883e+19 
1031 1.7759920358657837 1.8027558490491145e+28 

當第二列對應的時間價值,第三列是當時的數據值。

我設置x和y等於指向包含所有數據的對象的指針。 我很難將這些數據轉化爲圖表。 idk我做錯了什麼,因爲在大多數matplotlib示例中,他們只是創建隨機數據並繪製它。我需要一種方法將數據導入圖表。 這不起作用:

plt.plot(x, y) 
plt.show() 

它建立一個圖表,但它並不在數據填充到圖形。這是我的圖表看起來不太好的。 Bad Graph

我的問題是這樣的:

我怎樣才能從值對打印清單我的數據爲基本圖形?

+0

您是否嘗試給線條添加顏色? plt.plot(x,y,' - r') –

+0

您的x和y會在for循環中重新初始化,我想您可能想要構建一個列表。 –

+1

我想用'plot(g [0] .time,g [0] .data [0] .f)'應該有效嗎? – Bart

回答

0

x和y是單個浮點數,而不是數組,如print語句的輸出所示。 plt.plot()嘗試在點之間繪製線條,但由於只有一個點,因此不會有線條。我會假設你想以某種方式使x和y爲值數組也許這樣的事情...

x = [] 
y = [] 
for i in range(0, 1032): 
    x.append(g[0].time[i]) 
    y.append(g[0].data[0].f[i]) 

然後傳遞到plt.plot當有一個以上的點積 交替如果你想有一個散點圖在非連接點上,使用plt.scatter

+0

爲什麼當數據已經在'g [0] .time'和'g [0] .data [0] .f'中時填充一個新列表? – Bart

+0

@Bart我想過,但不確定這個對象的字段是否支持完整的'__slice__'表示法,因爲它來自於一個自定義的包裝庫。我不太確定整個過程如何動搖。 – Aaron

+0

好的,公平的觀點:) – Bart