2017-07-14 29 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