Kirjoittaja Aihe: [ ratkaistu ] Gnuplotiin kaksi käyrää pipestä  (Luettu 1931 kertaa)

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
Miten voisi tehdä c++ -pipen kautta 2 käyrää ja niiden datapisteet gnuplotille. Netistä löytyy paljon esimerkkejä tiedostodatan tulostamisesta, mutta pienen pistemäärän laittaisi mielellään suoraan pipen kautta.

Kokeilin alla olevalla ohjelmalla, enkä keksinyt keinoa erottaa käyrät toisistaan

Koodia: [Valitse]

#include<iostream> //fprint ainakin täältä
#include <vector>
#include <algorithm> // sin tulee ainakin täältä
#include <chrono>
#include <thread>

int main()
{
  FILE *pipe = popen("gnuplot -persist", "w");
 
  std::vector<double> y(10, 0.0); // y values

  fprintf(pipe, "set style data lines \n ");   
  fprintf(pipe,"set xrange [0:11]\n");
  fprintf(pipe,"set yrange [0:30]\n");

  for(int i=0; i<1; i++) // 10 plots
  {
    fprintf(pipe, "%s", "plot '-' \n");
   
    for(int j = 0; j < 10; j++)
      {
        y[j] = sin(i + j) + 3;
      }

    for(int j = 0; j < 10; j++)
      {
        fprintf(pipe, "%d %f\n", j, y[j]);   // ensimmäinen käyrä
      }

    fprintf(pipe, "%s", "plot '-' \n");     // toinen käyrä
    for(int j = 0; j < 10; j++)
      {
        fprintf(pipe, "%d %d\n", j, 2*j);
      }

    fprintf(pipe,"e\n");    // finally, e
    fflush(pipe);   // flush the pipe to update the plot
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
  }

  fclose(pipe);  //  close the pipe
  return 1;
}


// käyttämäni käännöskomento
// g++ koe01.cpp -Wall -pedantic  -std=c++11 -o koe01 


Silmukoita on turhaan sisäkkäin, kokeilin myös liikkuvaa käyrää, ja se toimii, mutta ohjelma on niin lyhyt, että kahden käyrän ongelmakin selviää varmaan siitä helposi.

Ehkä jotenkin olisi saatava '-' -lukumuodolle kerrottua, mitä datarivin arvoja haluaa käyttää. Toinen vaihtoehto olisi saada viiva katkaistuksi silloin, kun datasarjat vaihtuvat. En ole onnistunut kummassakaan :(
« Viimeksi muokattu: 10.08.18 - klo:17.12 kirjoittanut teele »

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: Gnuplotiin kaksi käyrää pipestä
« Vastaus #1 : 10.08.18 - klo:15.21 »
Ohjelmasi tuottaa siis tällaisen Gnuplot-skriptin:

Koodia: [Valitse]
set style data lines
 set xrange [0:11]
set yrange [0:30]
plot '-'
0 3.000000
1 3.841471
2 3.909297
3 3.141120
4 2.243198
5 2.041076
6 2.720585
7 3.656987
8 3.989358
9 3.412118
plot '-'
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
e

Oikea syntaksi on tällainen:

Koodia: [Valitse]
set style data lines
set xrange [0:11]
set yrange [0:30]
plot '-', '-'
0 3.000000
1 3.841471
2 3.909297
3 3.141120
4 2.243198
5 2.041076
6 2.720585
7 3.656987
8 3.989358
9 3.412118
e
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
e

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
Vs: Gnuplotiin kaksi käyrää pipestä
« Vastaus #2 : 10.08.18 - klo:17.11 »

Kiitos  :)

Piirtää hyvin.

Koodia: [Valitse]

#include<iostream> //fprint ainakin täältä
#include <vector>
#include <algorithm> // sin tulee ainakin täältä
#include <chrono>
#include <thread>

int main()
{
  FILE *pipe = popen("gnuplot -persist", "w");
 
  std::vector<double> y(10, 0.0); // y values

  fprintf(pipe, "set style data lines \n ");   
  fprintf(pipe,"set xrange [0:11]\n");
  fprintf(pipe,"set yrange [0:30]\n");

  for(int i=0; i<1; i++) // liikkuvan käyrän toistokerrat
  {
    fprintf(pipe, "%s", "plot '-', '-' \n");
   
    for(int j = 0; j < 10; j++)
      {
        y[j] = sin(i + j) + 3;
      }

    for(int j = 0; j < 10; j++)
      {
        fprintf(pipe, "%d %f\n", j, y[j]);
      }
    fprintf(pipe,"e\n");    // ensimmäinen käyrä valmis, e

    for(int j = 0; j < 10; j++)
      {
        fprintf(pipe, "%d %d\n", j,  2*j );
      }
    fprintf(pipe,"e\n");    // toinen käyrä valmis, e

    fflush(pipe);   // flush the pipe to update the plot
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
  }

  fclose(pipe);  //  close the pipe
  return 1;
}

// g++ koe01.cpp -Wall -pedantic  -std=c++11 -o koe01