2011-11-28 11 views
6

मेरे पास एक ऐसा एप्लिकेशन है जो एक मेजबान सिस्टम पर समय-समय पर लॉग ऑन करता है, यह फ़ाइल या सिर्फ कंसोल पर हो सकता है। मैं इस डेटा का उपयोग मेरे लिए एक सांख्यिकीय ग्राफ प्लॉट करने के लिए करना चाहता हूं। मुझे यकीन नहीं है कि मैं अपने आवेदन के लिए लाइव ग्राफ का उपयोग कर सकता हूं।सी अनुप्रयोग के लिए लाइव ग्राफ

यदि यह उपकरण सही है, तो क्या मेरे पास लाइव ग्राफ़ के साथ बाहरी एप्लिकेशन को एकीकृत करने पर एक उदाहरण हो सकता है?

इस livegraph कड़ी है ->http://www.live-graph.org/download.html

+0

उपकरण का लिंक कहां है? – Hossein

+0

आप किस तरह का सांख्यिकीय ग्राफ प्लॉट करना चाहते हैं? लाइवग्राफ केवल x/y लाइन ग्राफ़ का समर्थन करता है, लेकिन जब तक आप फ़ाइल को सही प्रारूप में लिखते हैं, तो यह आपके ग्राफ को दिखाने में सक्षम होना चाहिए। – tinman

+0

मेरे पास एक डेलगर फ़ाइल है। यह प्रारूप है .txt और इसमें एक पंक्ति में संख्याएं हैं। (2,4 5,3 10,1 आदि) मैं इस फ़ाइल का उपयोग ऐसे प्रोग्राम में करना चाहता हूं जो इसे – ozgur

उत्तर

1

ठीक है, आप केवल livegraph के दिए गए प्रारूप में अपने डेटा लिखने और आप क्या चाहते साजिश livegraph सेट अप की जरूरत है। यदि छोटे सी उदाहरण लिखा गया है जो यादृच्छिक संख्या उत्पन्न करता है और हर सेकेंड के साथ उन्हें एक साथ डंप करता है। इसके बाद, आप बस लाइवग्राफ प्रोग्राम को फ़ाइल में संलग्न करते हैं। बस।

लाइवग्राफ के साथ खेलना मुझे कहना होगा कि इसका उपयोग सीमित है। मैं अभी भी matplotlib के साथ एक अजगर लिपि के साथ चिपके रहूंगा, क्योंकि आपके पास कितना और क्या प्लॉट किया गया है इस पर अधिक नियंत्रण है।

#include <stdio.h> 
#include <time.h> 
#include <unistd.h> 
#include <gsl/gsl_rng.h> 
#include <gsl/gsl_randist.h> 

int main(int argc, char** argv) 
{ 
     FILE *f; 
     gsl_rng *r = NULL; 
     const gsl_rng_type *T; 
     int seed = 31456; 
     double rndnum; 
     T = gsl_rng_ranlxs2; 
     r = gsl_rng_alloc(T); 
     gsl_rng_set(r, seed); 

     time_t t; 
     t = time(NULL); 



     f = fopen("test.lgdat", "a"); 
     fprintf(f, "##;##\n"); 
     fprintf(f,"@LiveGraph test file.\n"); 
     fprintf(f,"Time;Dataset number\n"); 

     for(;;){ 
       rndnum = gsl_ran_gaussian(r, 1); 
       fprintf(f,"%f;%f\n", (double)t, rndnum); 
       sleep(1); 
       fflush(f); 
       t = time(NULL); 
     } 

     gsl_rng_free(r); 
     return 0; 
} 

संकलन

gcc -Wall main.c `gsl-config --cflags --libs` 
4

साथ मुझे लगता है कि इस अजगर के साथ साथ matplotlib का उपयोग कर सबसे आसान प्राप्त किया जा सकता। इसे प्राप्त करने के लिए वास्तव में कई तरीके हैं: ए) सीधे अपने सी अनुप्रयोग में Python Interpreter को एकीकृत करना, बी) डेटा को प्रिंट करना और इसे सरल साजिश करने वाली एक साधारण पायथन स्क्रिप्ट पर पाइप करना। निम्नलिखित में मैं दोनों दृष्टिकोणों का वर्णन करूंगा।

हमारे पास निम्नलिखित सी अनुप्रयोग है (उदा। plot.c)। यह matplotlib की साजिश कार्यक्षमता के साथ इंटरफेस करने के लिए पाइथन दुभाषिया का उपयोग करता है। एप्लिकेशन डेटा को सीधे साजिश करने में सक्षम है (जब ./plot --plot-data कहा जाता है) और डेटा को stdout पर प्रिंट करने के लिए (जब किसी अन्य तर्क सेट के साथ बुलाया जाता है)।

#include <Python.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdbool.h> 
#include <string.h> 

#define CMD_BUF_SIZE 256 

void initializePlotting() { 
    Py_Initialize(); 
    // load matplotlib for plotting 
    PyRun_SimpleString("from matplotlib import pyplot as pp"); 
    PyRun_SimpleString("pp.ion()"); // use pp.draw() instead of pp.show() 
} 

void uninitializePlotting() { 
    Py_Finalize(); 
} 

void plotPoint2d(double x, double y) { 
    // this buffer will be used later to handle the commands to python 
    static char command[CMD_BUF_SIZE]; 
    snprintf(command, CMD_BUF_SIZE, "pp.plot([%f],[%f],'r.')\npp.draw()", x, y); 
    PyRun_SimpleString(command); 
} 

double myRandom() { 
    double sum = .0; 
    int count = 1e4; 
    int i; 
    for (i = 0; i < count; i++) 
    sum = sum + rand()/(double)RAND_MAX; 
    sum = sum/count; 
    return sum; 
} 

int main (int argc, const char** argv) { 
    bool plot = false; 
    if (argc == 2 && strcmp(argv[1], "--plot-data") == 0) 
    plot = true; 

    if (plot) initializePlotting(); 

    // generate and plot the data 
    int i = 0; 
    for (i = 0; i < 1000; i++) { 
    double x = myRandom(), y = myRandom(); 
    if (plot) plotPoint2d(x,y); 
    else printf("%f %f\n", x, y); 
    } 

    if (plot) uninitializePlotting(); 
    return 0; 
} 

आप इस तरह यह निर्माण कर सकते हैं:

$ gcc plot.c -I /usr/include/python2.7 -l python2.7 -o plot 

और इसे पसंद चलाएँ:

$ ./plot --plot-data 

तो यह एक धुरी पर लाल बिंदु की साजिश रचने कुछ समय के लिए चलेंगे।

जब आप सीधे डेटा प्लॉट करने के लिए नहीं है, लेकिन stdout आप एक बाहरी प्रोग्राम के द्वारा साजिश कर सकते हैं (उदाहरण के लिए plot.py नाम के एक अजगर स्क्रिप्ट) कि stdin से इनपुट लेता है, यानी एक पाइप के लिए इसे मुद्रित करने के लिए चुनते हैं, और भूखंडों डेटा यह हो जाता है। प्राप्त करने के लिए इस तरह ./plot | python plot.py प्रोग्राम कहते हैं, plot.py के समान होने के साथ:

from matplotlib import pyplot as pp 
pp.ion() 

while True: 
    # read 2d data point from stdin 
    data = [float(x) for x in raw_input().split()] 
    assert len(data) == 2, "can only plot 2d data!" 
    x,y = data 
    # plot the data 
    pp.plot([x],[y],'r.') 
    pp.draw() 

मैं अपने डेबियन मशीन पर दोनों दृष्टिकोण का परीक्षण किया है। इसे स्थापित करने के लिए python2.7 और python-matplotlib पैकेजों की आवश्यकता है।

संपादित

मैं सिर्फ देखा है, कि तुम एक बार साजिश या इस तरह बात प्लॉट करने के लिए चाहता था, निश्चित रूप से यह भी संभव का उपयोग कर matplotlib, उदा हैएक हिस्टोग्राम:

from matplotlib import pyplot as pp 
pp.ion() 

values = list() 
while True: 
    data = [float(x) for x in raw_input().split()] 
    values.append(data[0]) 
    pp.clf() 
    pp.hist([values]) 
    pp.draw() 
संबंधित मुद्दे