2次元グラフ: [c]pgline, [c]pgpt

#include "cpgplot.h"

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define DIV 100

main(int argc, char *argv[])
{
  char *devname = "?";
  int i;
  float x[DIV], y[DIV];

  /* if(cpgbeg(0, "?", 1, 1) != 1)
      exit(EXIT_FAILURE); */
   cpgask(1); 

  if (argc == 2)
    devname = argv[1];
  if(cpgopen(devname) != 1)
    exit(1);

  cpgpap(6, 0.75); /* 6inch, aspect ratio =1.0 (aquare) */
  cpgscr(0, 1, 1, 1); /* 0: background (default is black) */
  cpgscr(1, 0, 0, 0); /* 0: foreground (default is white) */
  cpgscf(1);  /* 1:normal, 2:roman, 3:italic, 4:script */
  cpgsch(1.2);   
  cpgslw(2);  /* unit in 0.005 inch = 0.13 mm */
  cpgenv(-2*M_PI, 2*M_PI, -1, 1, 0, 0);
  cpglab("\\frRoman", "\\fiItalic", "PGPLOT Plot2d");
  for (i=0; i < DIV; i++) {
    x[i]=(i-DIV/2)*4*M_PI/DIV;
    y[i]=cos(x[i]);
  }
  cpgslw(8);
  cpgsci(2);
  cpgline(DIV, x, y);

  
  for (i=0; i < DIV; i++) {
    x[i]=(i-DIV/2)*4*M_PI/DIV;
    y[i]=sin(x[i]);
  }
  cpgslw(2);  /* unit in 0.005 inch = 0.13 mm */
  cpgsci(3);  /* green */
  cpgsls(4);  /* 4:dotted */
  cpgpt(DIV, x, y, 23); /* 23:medium open circle */

  cpgclos();
  return 0;
}

#
# ソースのコンパイル
#
g77 -o plot2d plot2d.c -lcpgplot -lpgplot -L/usr/X11R6/lib 
    -lX11 -lm -lpng

#
# 環境変数の設定
#
export PGPLOT_DIR=/usr/local/pgplot
export PGPLOT_DEV=/xwin

#
#  実行
#
./plot2d /xwin  (Xで描画)
./plot2d plot2d.ps/cps  (カラーP S の作成)
./plot2d plot2d.png/tpng  (透明 PNG の作成)


3次元グラフ: 標準ではなし

# PGPLOT には残念ながら 3dプロットの標準ルーチンはありません.
# 自分で,隠線処理等を含めたソースを書かなければなりません.
# ところで pgdemo7 は 3dプロットのデモですから,
# その部分(FREDDY)だけを取り出して
#
#   g77 -c freddy.f
#
# により,オブジェクトファイルを作成しておき,リンクして使うこ
# とができます.ただし,これは生の FORTRAN オブジェクトですから,
#
#   変数の呼び出し時は参照渡し
#
# にすることと,関数の名前は後ろにアンダーをつけて
#
#   freddy_
#
# となることに注意して,C 言語から呼び出します.

#include "cpgplot.h"

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define DIV 51

int
main(int argc, char **argv)
{
  char *devname = "?";
  int i, j, k, div=DIV;
  float *z, size = 1.0, angle=25.0;
  double x, y;
  z = malloc(DIV*DIV*sizeof(float));

  cpgask(1);
 
  if (argc == 2)
    devname = argv[1];
  if(cpgopen(devname) != 1)
    exit(1);
 
  for(i=1; i<=DIV; i++){
    for(j=1; j<=DIV; j++){
      k = (i-1)*DIV + (j-1);
      x = -2*M_PI+(i-1)*4*M_PI/DIV;
      y = -2*M_PI+(j-1)*4*M_PI/DIV;
      z[k] = sin(x)*sin(y)/x/y;
    }
  }


  cpgpap(6,1);
  cpgscr(0, 1, 1, 1);
  cpgscr(1, 0, 0, 0);
  cpgsch(1.4);
  cpgscf(2);
  cpgslw(4);   
  cpgenv(0.0, 1.0, 0.0, 1.0, 1, -2);
  cpglab("", "", "PGPLOT Plot3d");

  cpgsci(11); /* dark blue */
  cpgslw(1);  /* line width 1 */ 
  freddy_(z, &div, &div, &size, &angle);
  
  cpgclos();
  free(z);
  return 0;
}

#
#  コンパイル 
# 
g77 -o plot3d plot3d.c freddy.o -lcpgplot -lpgplot -lX11 
    -lpng -lm -L/usr/X11R6/lib
#
#  実行
#
./plo3d /xwin
./plot3d plot3d.ps/cps


等高線図: [c]pgcont

#include "cpgplot.h"

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define DIV 50

main(int argc, char *argv[])
{
  char *devname = "?";
  int i, j,  k, ls, ci;
  float *z, zmin, zmax, zlevel;
  float tr[6]={-10.0, 0.4, 0.0, -10.0, 0.0, 0.4};
  double x,y;

  cpgask(1); 

  if (argc == 2)
    devname = argv[1];
  if(cpgopen(devname) != 1)
    exit(1);

  z = malloc(DIV*DIV*sizeof(float));
  zmin = zmax = 0.0;
  for (j=1; j<=DIV; j++){
    for (i=1; i<=DIV; i++){
      k = (j-1)*DIV+(i-1);
      x = tr[0]+ tr[1]*i + tr[2]*j;
      y = tr[3]+ tr[4]*i + tr[5]*j;
      z[k] = sin(x)*sin(y)/x/y;
      if (z[k] < zmin) zmin = z[k];
      if (z[k] > zmax) zmax = z[k];
    }
  }

  cpgpap(6,1); /* 6inch, aspect ratio = 1 (square) */

  cpgscr(0, 1, 1, 1); 
  cpgscr(1, 0, 0, 0); 
  cpgsch(1.2);   
  cpgenv(-10, 10, -10, 10, 0, 0);
  cpglab("\\frRoman", "\\fiItalic", "PGPLOT Contour");
  
  for (i=0; i<14; i++) {
    zlevel = -0.5 + i*0.1;
    ls = (zlevel < 0) ? 2 : 1;
    if ( zlevel < 0.0) {
      ci = 4;
    } else if ( zlevel < 0.5 ) {
      ci = 3;
    } else ci = 2;
    
    cpgsls(ls);
    cpgsci(ci);
    cpgcont(z,DIV,DIV,1,DIV,1,DIV, &zlevel, -1, tr);
  }

  cpgclos();
  free(z);
  return 0;
}


マルチプロット: [c]pgsubp

#
# パネルを Nx X Ny に分割する関数を使います.
# [c]pgpage() あるいは [c]pgenv() でパネルが移動します.
#

#include "cpgplot.h"

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define DIV 100
#define N 51
#define N3 31

main(int argc, char *argv[])
{
  char *devname = "?";
  int i, j, k, ls, ci, div;
  float *z, zmin, zmax, zlevel ; 
  float x[DIV], y[DIV], angle, size;
  float tr[6]={-10.0, 0.4, 0.0, -10.0, 0.0, 0.4};
  double xx, yy;

  if (argc == 2)
    devname = argv[1];
  if(cpgopen(devname) != 1)
    exit(1);

  cpgpap(6, 1); /* 6inch, aspect ratio = 3/4 */
  cpgscr(0, 1, 1, 1); /* 0: background (default is black) */
  cpgscr(1, 0, 0, 0); /* 0: foreground (default is white) */

  cpgsubp(2,2); /* 2x2 に分割 */

  /* 2dplot */
  cpgenv(-2*M_PI, 2*M_PI, -1, 1, 0, 0);
  cpglab("\\frRoman", "\\fiItalic", "PGPLOT Plot2d");
  
  for (i=0; i zmax) zmax = z[k];
    }
  }
  cpgsci(1); 
  cpgenv(-10, 10, -10, 10, 0, 0);
  cpglab("\\frRoman", "\\fiItalic", "PGPLOT Contour");
  
  for (i=0; i<14; i++) {
    zlevel = -0.5 + i*0.1;
    ls = (zlevel < 0) ? 2 : 1;
    if ( zlevel < 0.0) {
      ci = 4;
    } else if ( zlevel < 0.5 ) {
      ci = 3;
    } else ci = 2;
    cpgsls(ls);
    cpgsci(ci);
    cpgcont(z,N,N,1,N,1,N, &zlevel, -1, tr);
  }

  cpgclos();
  free(z);
  return 0;
}