Programowanie w systemie UNIX/plplot

Z Wikibooks, biblioteki wolnych podręczników.

PLplot to wieloplatformowy pakiet oprogramowania do tworzenia wykresów naukowych, których symbole wykresu (UTF-8) i tekst są w praktyce ograniczone jedynie tym, jakie czcionki systemowe obsługujące Unicode są zainstalowane na komputerze użytkownika. Biblioteki podstawowej PLplot można używać do tworzenia standardowych wykresów x-y, wykresów półlogarytmicznych, wykresów log-logarytmicznych, wykresów konturowych, wykresów powierzchni 3D, wykresów siatkowych, wykresów słupkowych i kołowych. Na jednej stronie można umieścić wiele wykresów (tego samego lub różnych rozmiarów), a w przypadku urządzeń, które je obsługują, dozwolonych jest wiele stron. Obsługiwane systemy operacyjne: Linux, MacOS, Windows

instalacja[edytuj]

Lista pakietów Ubuntu:[1]

  • libplplot-dev
  • plplot-doc
  • plplot-examples
  • libplplot-data


sudo apt-get -y install libplplot-dev


git clone git://git.code.sf.net/p/plplot/plplot plplot.git

Przykłady:

sudo apt-get -y install plplot-examples

Szukamy lokalizacji:

sudo updatedb
locate plplot

Przykładowy wynik:

/usr/share/doc/plplot-examples/examples/c 



sudo apt-get -y install plplot-doc

kompilacja[edytuj]

  • Makefile + pkg-config
  • CMake
  • linka poleceń: -lplplot -I /usr/include/plplot

sterowniki[edytuj]

Sterowniki plików ( ang. file devices) nieinteraktywne

  • qt
  • cairo
  • svg
  • ps driver
  • psttf driver
  • pdf
  • gd driver
  • pstex driver


Sterowniki urządzeń interaktywnych

  • qt
  • cairo
  • xwin driver
  • tk driver
  • aqt driver
  • wxwidgets driver
  • wxWidgets Driver Basics


przykłady[edytuj]


2D line plot[edytuj]

2D diagram wykonnay z użyciem biblioteki PLplot
    
// Simple demo of a 2D line plot.
//
// Copyright (C) 2011  Alan W. Irwin
//
// This file is part of PLplot.
//
// PLplot is free software; you can redistribute it and/or modify
// it under the terms of the GNU Library General Public License as published
// by the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// PLplot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public License
// along with PLplot; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
//

#include "plcdemos.h"
#define NSIZE    101

int
main( int argc, char *argv[] )
{
    PLFLT x[NSIZE], y[NSIZE];
    PLFLT xmin = 0., xmax = 1., ymin = 0., ymax = 100.;
    int   i;

    // Prepare data to be plotted.
    for ( i = 0; i < NSIZE; i++ )
    {
        x[i] = (PLFLT) ( i ) / (PLFLT) ( NSIZE - 1 );
        y[i] = ymax * x[i] * x[i];
    }

    // Parse and process command line arguments
    plparseopts( &argc, argv, PL_PARSE_FULL );

    // Initialize plplot
    plinit();

    // Create a labelled box to hold the plot.
    plenv( xmin, xmax, ymin, ymax, 0, 0 );
    pllab( "x", "y=100 x#u2#d", "Simple PLplot demo of a 2D line plot" );

    // Plot the data that was prepared above.
    plline( NSIZE, x, y );

    // Close PLplot library
    plend();

    exit( 0 );
}

ODE[edytuj]

Van der Pol oscylator

Rozwiązanie ODE z użyciem biblioteki GNU GSL i grafika za pomocą biblioteki PLplot

    
/*

gcc o.c -Wall -Wextra -lm -lplplot -lgsl -lgslcblas


*/

#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_odeiv2.h>
#include <gsl/gsl_sf_bessel.h>
#include <gsl/gsl_statistics.h>
#include <plplot/plplot.h>






int ode_func(double t, const double y[], double f[], void *params) {
    double k = *((double*)params);
    (void)t;
    f[0] = y[1];
    f[1] = k * y[1] * (1.0 - y[0] * y[0]) - y[0];
    return GSL_SUCCESS;
}

/* Some methods ask for you to give the Jacobian of it too
 * for better performance. You have to calculate this by hand.
 */
int ode_jac(double t, const double y[], double *dfdy, double dfdt[], void *params) {
    double k = *((double*)params);
    (void)t;
    gsl_matrix_view dfdy_mat = gsl_matrix_view_array(dfdy, 2, 2);
    gsl_matrix *m = &dfdy_mat.matrix;
    gsl_matrix_set(m, 0, 0, 0.0);
    gsl_matrix_set(m, 0, 1, 1.0);
    gsl_matrix_set(m, 1, 0, -(1.0 + 2.0 * k * y[0] * y[1]));
    gsl_matrix_set(m, 1, 1, k * (1.0 * y[0] * y[0]));
    /* Autonomous. */
    dfdt[0] = 0.0;
    dfdt[1] = 0.0;
    return GSL_SUCCESS;
}

int main(int argc, char **argv) {
    enum Constexpr {n_points = 1000};
    double mu = 1.0;
    gsl_odeiv2_system sys = {ode_func, ode_jac, 2, &mu};
    gsl_odeiv2_driver * d= gsl_odeiv2_driver_alloc_y_new(
        &sys,
        gsl_odeiv2_step_rk8pd,
        1e-6,
        1e-6,
        0.0
    );
    int i;
    double t = 0.0;
    double t1 = 100.0;
    /* Initial condition: f = 0 with speed 0. */
    double y[2] = {1.0, 0.0};
    double dt = t1 / n_points;
    double datax[n_points];
    double datay[n_points];

    for (i = 0; i < n_points; i++) {
        double ti = i * dt;
        int status = gsl_odeiv2_driver_apply(d, &t, ti, y);
        if (status != GSL_SUCCESS) {
            fprintf(stderr, "error, return value=%d\n", status);
            break;
        }

        /* Get output. */
        printf("%.5e %.5e %.5e\n", t, y[0], y[1]);
        datax[i] = y[0];
        datay[i] = y[1];
    }

    /* Cleanup. */
    gsl_odeiv2_driver_free(d);

    /* Plot. */
    if (argc > 1 && argv[1][0] == '1') {
        plsdev("xwin");
        plinit();
        plenv(
            gsl_stats_min(datax, 1, n_points),
            gsl_stats_max(datax, 1, n_points),
            gsl_stats_min(datay, 1, n_points),
            gsl_stats_max(datay, 1, n_points),
            0,
            1
        );
        plstring(n_points, datax, datay, "*");
        plend();
    }

    return EXIT_SUCCESS;
}

Linki[edytuj]



Przypisy