33 const char *main_title,
47 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
48 if(verbose>0) printf(
"%s()\n", __func__);
50 if(tac1==NULL || tac2==NULL || tac1->
tacNr<1 || tac2->
tacNr<1 ||
56 if(fname==NULL ||
strnlen(fname, 1)<1) {
64 if(status!=NULL && status->
forgiving==0) {
68 int ret, n, ri, si, ei;
69 char x_title[64], y_title[64], tac_id[32], tac_title[64];
70 double minx, maxx, miny, maxy, tx1, tx2, ty1, ty2, f;
71 struct svg_viewports viewports; svg_init_viewports(&viewports);
72 int max_color_nr=0, color_nr=0;
73 int max_symbol_nr=0, symbol_nr=0;
74 SVG_LEGENDS legends; svg_init_legends(&legends);
77 int is_label=0;
if(tac1->
tacNr>1) is_label=1;
81 if(verbose>0) {printf(
" tac1 failed\n"); fflush(stdout);}
87 if(verbose>0) {printf(
" tac2 failed\n"); fflush(stdout);}
91 if(minx>tx1) minx=tx1;
92 if(maxx<tx2) maxx=tx2;
93 if(minx>0.0) {
double f=maxx-minx; minx-=0.05*f;
if(minx<0.0) minx=0.0;}
94 if(!isnan(x1)) minx=x1;
95 if(!isnan(x2)) maxx=x2;
96 if(verbose>10) printf(
" minx := %g\n maxx:=%g\n", minx, maxx);
104 if(
tacYRangeInXRange(tac2, -1, minx, maxx, &ty1, &ty2, NULL, NULL, NULL, NULL)) {
108 if(miny>ty1) miny=ty1;
109 if(maxy<ty2) maxy=ty2;
110 if(miny>0.0) {f=maxy-miny; miny-=0.05*f;
if(miny<0.0) miny=0.0;}
111 if(!isnan(y1)) miny=y1;
112 if(!isnan(y2)) maxy=y2;
113 if(verbose>1) printf(
" miny := %g\n maxy:=%g\n", miny, maxy);
116 viewports.x.min=minx; viewports.x.max=maxx;
117 viewports.y.min=miny; viewports.y.max=maxy;
118 viewports.label_area_viewport.is=is_label;
119 ret=svg_calculate_axes(&viewports, verbose-11);
135 ret=svg_define_viewports(0, 0, strlen(main_title), strlen(y_title),
136 strlen(x_title), is_label, &viewports, verbose-13);
143 fp_svg=svg_initiate(fname, 0, 0, &viewports, NULL, verbose-13);
150 ret=svg_create_main_title(fp_svg, main_title,
"", &viewports, NULL,verbose-13);
152 ret=svg_create_yaxis_title(fp_svg, y_title, &viewports, NULL, verbose-13);
154 ret=svg_create_xaxis_title(fp_svg, x_title, &viewports, NULL, verbose-13);
158 ret=svg_start_plot_viewport(fp_svg, &viewports, NULL, verbose-13);
162 ret=svg_start_coordinate_viewport(fp_svg, &viewports, NULL, verbose-13);
165 if(!ret) ret=svg_write_axes(fp_svg, &viewports, NULL, verbose-13);
176 max_color_nr=0;
while(svgColorName(max_color_nr)!=NULL) max_color_nr++;
177 if(verbose>3) printf(
"max_color_nr := %d\n", max_color_nr);
178 max_symbol_nr=0;
while(svgSymbolName(max_symbol_nr)!=NULL) max_symbol_nr++;
179 if(verbose>3) printf(
"max_symbol_nr := %d\n", max_symbol_nr);
180 if(tac1->
tacNr==1) color_nr=0;
else color_nr=1;
182 for(ri=0, n=0; ri<tac1->
tacNr; ri++) {
183 sprintf(tac_id,
"plot_%d", n);
184 strcpy(tac_title, tac1->
c[ri].
name);
186 for(si=0; si<tac2->
sampleNr; si++)
if(!isnan(tac2->
c[ri].
y[si]))
break;
187 for(ei=tac2->
sampleNr-1; ei>=si; ei--)
if(!isnan(tac2->
c[ri].
y[ei]))
break;
189 ret=svg_write_tac(fp_svg, &viewports, 1, tac_id, tac_title,
190 tac2->
x+si, tac2->
c[ri].
y+si, 1+ei-si,
191 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLOPEN,
194 svg_legend_empty(&legends); fclose(fp_svg);
200 ret=svg_write_tac(fp_svg, &viewports, 2, tac_id, tac_title,
202 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLFILLED,
205 svg_legend_empty(&legends); fclose(fp_svg);
212 if(max_symbol_nr>0) si=symbol_nr%max_symbol_nr;
213 if(max_color_nr>0) ci=color_nr%max_color_nr;
215 svg_legend_add(&legends, 0, si, SYMBOLFILLED, ci, tac_title);
219 if(color_nr==max_color_nr) {symbol_nr++; color_nr=0;}
220 if(symbol_nr==max_symbol_nr) symbol_nr=0;
224 ret=svg_end_coordinate_viewport(fp_svg, NULL, verbose-13);
228 if(svg_write_xticks(fp_svg, &viewports, NULL, verbose-13)!=0) ret=1;}
230 if(svg_write_yticks(fp_svg, &viewports, NULL, verbose-13)!=0) ret=1;}
233 if(!ret) ret=svg_end_plot_viewport(fp_svg, NULL, verbose-13);
236 fclose(fp_svg); svg_legend_empty(&legends);
243 if(viewports.label_area_viewport.is!=0) {
244 if(verbose>2) printf(
"creating plot legends\n");
245 ret=svg_create_legends(fp_svg, &viewports, &legends, NULL, verbose-13);
247 svg_legend_empty(&legends);
255 ret=svg_close(fp_svg, NULL, verbose-13);
277 const char *main_title,
291 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
292 if(verbose>0) {printf(
"%s()\n", __func__); fflush(stdout);}
298 if(fname==NULL ||
strnlen(fname, 1)<1) {
302 if(status!=NULL && status->
forgiving==0) {
306 int ret, n, ri, si, ei;
307 char x_title[64], y_title[64], tac_id[32], tac_title[64];
308 double minx, maxx, miny, maxy, tx1, tx2, ty1, ty2, f;
309 struct svg_viewports viewports; svg_init_viewports(&viewports);
310 unsigned int max_color_nr=0, color_nr=0;
311 unsigned int max_symbol_nr=0, symbol_nr=0;
312 SVG_LEGENDS legends; svg_init_legends(&legends);
316 int is_label=0;
if(tac->
tacNr>1) is_label=1;
324 if(minx>0.0) {
double f=maxx-minx; minx-=0.05*f;
if(minx<0.0) minx=0.0;}
325 if(!isnan(x1)) minx=x1;
326 if(!isnan(x2)) maxx=x2;
328 printf(
" minx := %g\n maxx := %g\n", minx, maxx); fflush(stdout);}
336 if(miny>0.0) {f=maxy-miny; miny-=0.05*f;
if(miny<0.0) miny=0.0;}
337 if(!isnan(y1)) miny=y1;
338 if(!isnan(y2)) maxy=y2;
340 printf(
" miny := %g\n maxy := %g\n", miny, maxy); fflush(stdout);}
343 viewports.x.min=minx; viewports.x.max=maxx;
344 viewports.y.min=miny; viewports.y.max=maxy;
345 viewports.label_area_viewport.is=is_label;
346 ret=svg_calculate_axes(&viewports, verbose-3);
362 ret=svg_define_viewports(0, 0, strlen(main_title), strlen(y_title),
363 strlen(x_title), is_label, &viewports, verbose-3);
370 fp_svg=svg_initiate(fname, 0, 0, &viewports, NULL, verbose-3);
377 ret=svg_create_main_title(fp_svg, main_title,
"", &viewports, NULL,verbose-3);
379 ret=svg_create_yaxis_title(fp_svg, y_title, &viewports, NULL, verbose-3);
381 ret=svg_create_xaxis_title(fp_svg, x_title, &viewports, NULL, verbose-3);
385 ret=svg_start_plot_viewport(fp_svg, &viewports, NULL, verbose-3);
389 ret=svg_start_coordinate_viewport(fp_svg, &viewports, NULL, verbose-3);
392 if(!ret) ret=svg_write_axes(fp_svg, &viewports, NULL, verbose-3);
403 max_color_nr=0;
while(svgColorName(max_color_nr)!=NULL) max_color_nr++;
404 if(verbose>3) {printf(
"max_color_nr := %d\n", max_color_nr); fflush(stdout);}
405 if(tac->
tacNr==1) color_nr=0;
else color_nr=1;
407 for(ri=0, n=0; ri<tac->
tacNr; ri++) {
408 sprintf(tac_id,
"plot_%d", n);
409 strcpy(tac_title, tac->
c[ri].
name);
411 for(si=0; si<tac->
sampleNr; si++)
if(!isnan(tac->
c[ri].
y[si]))
break;
412 for(ei=tac->
sampleNr-1; ei>=si; ei--)
if(!isnan(tac->
c[ri].
y[ei]))
break;
415 if(max_color_nr<1) ci=0;
else ci=color_nr % max_color_nr;
416 if(max_symbol_nr<1) si=0;
else si=symbol_nr % max_symbol_nr;
417 ret=svg_write_tac(fp_svg, &viewports, 1, tac_id, tac_title,
418 tac->
x+si, tac->
c[ri].
y+si, 1+ei-si,
419 svgColorName(ci), si, SYMBOLFILLED,
422 svg_legend_empty(&legends); fclose(fp_svg);
430 if(max_color_nr<1) ci=0;
else ci=color_nr % max_color_nr;
431 if(max_symbol_nr<1) si=0;
else si=symbol_nr % max_symbol_nr;
432 svg_legend_add(&legends, 0, si, SYMBOLFILLED, ci, tac_title);
436 if(color_nr==max_color_nr) color_nr=0;
440 ret=svg_end_coordinate_viewport(fp_svg, NULL, verbose-3);
444 if(svg_write_xticks(fp_svg, &viewports, NULL, verbose-3)!=0) ret=1;}
446 if(svg_write_yticks(fp_svg, &viewports, NULL, verbose-3)!=0) ret=1;}
449 if(!ret) ret=svg_end_plot_viewport(fp_svg, NULL, verbose-3);
452 fclose(fp_svg); svg_legend_empty(&legends);
459 if(viewports.label_area_viewport.is!=0) {
460 if(verbose>2) {printf(
"creating plot legends\n"); fflush(stdout);}
461 ret=svg_create_legends(fp_svg, &viewports, &legends, NULL, verbose-3);
463 svg_legend_empty(&legends);
471 ret=svg_close(fp_svg, NULL, verbose-3);
496 const char *main_title,
502 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
503 if(verbose>0) {printf(
"%s(MTAC, '%s', '%s')\n", __func__, main_title, fname); fflush(stdout);}
505 if(mtac==NULL || mtac->
nr<1) {
509 if(fname==NULL ||
strnlen(fname, 1)<1) {
513 if(status!=NULL && status->
forgiving==0) {
516 if(verbose>1) {printf(
"%d plot(s)\n", mtac->
nr); fflush(stdout);}
519 int is_label=0;
if(mtac->
nr>1) is_label=1;
522 double minx=nan(
""), maxx=nan(
""), miny=nan(
""), maxy=nan(
""), maxly=nan(
"");
523 for(
int i=0; i<mtac->
nr; i++) {
525 double x1, x2, y1, y2;
527 if(isfinite(x1) && !(x1>minx)) minx=x1;
528 if(isfinite(x2) && !(x2<maxx)) maxx=x2;
529 if(
tacYRange(mtac->
tac+i, -1, &y1, &y2, NULL, NULL, NULL, NULL)!=0)
continue;
530 if(isfinite(y1) && !(y1>miny)) miny=y1;
531 if(isfinite(y2) && !(y2<maxy)) maxy=y2;
533 if(
tacYRange(mtac->
tac+i, 2, &y1, &y2, NULL, NULL, NULL, NULL)!=0)
continue;
534 if(isfinite(y2) && !(y2<maxly)) maxly=y2;
537 printf(
"x-range := %g - %g\n", minx, maxx);
538 printf(
"y-range := %g - %g (%g for the line)\n", miny, maxy, maxly);
540 if(!(maxx>minx) || !(maxy>miny)) {
546 double yrange=maxy-miny;
547 double ylim=maxly+0.025*yrange;
548 if(maxy>ylim) maxy=ylim;
549 if(verbose>2) printf(
" yrange := %g\n ylim := %g\n maxy := %g\n", yrange, ylim, maxy);
553 struct svg_viewports viewports; svg_init_viewports(&viewports);
554 viewports.x.min=minx; viewports.x.max=maxx;
555 viewports.y.min=miny; viewports.y.max=maxy;
556 viewports.label_area_viewport.is=is_label;
559 if(svg_calculate_axes(&viewports, verbose-3)) {
565 char x_title[64], y_title[64];
566 strcpy(x_title,
""); strcpy(y_title,
"");
569 if(svg_define_viewports(0, 0, strlen(main_title), strlen(y_title),
570 strlen(x_title), is_label, &viewports, verbose-3))
577 FILE *fp=svg_initiate(fname, 0, 0, &viewports, NULL, verbose-3);
585 if(svg_create_main_title(fp, main_title,
"", &viewports, NULL,verbose-3)) {
590 if(svg_create_yaxis_title(fp, y_title, &viewports, NULL, verbose-3)) {
595 if(svg_create_xaxis_title(fp, x_title, &viewports, NULL, verbose-3)) {
602 if(svg_start_plot_viewport(fp, &viewports, NULL, verbose-3)) {
609 if(svg_start_coordinate_viewport(fp, &viewports, NULL, verbose-3)) {
616 if(svg_write_axes(fp, &viewports, NULL, verbose-3)) {
626 SVG_LEGENDS legends; svg_init_legends(&legends);
628 int max_color_nr=0;
while(svgColorName(max_color_nr)!=NULL) max_color_nr++;
629 if(verbose>3) {printf(
"max_color_nr := %d\n", max_color_nr); fflush(stdout);}
630 int color_nr;
if(mtac->
nr==1) color_nr=0;
else color_nr=1;
631 int max_symbol_nr=0;
while(svgSymbolName(max_symbol_nr)!=NULL) max_symbol_nr++;
632 if(verbose>3) printf(
"max_symbol_nr := %d\n", max_symbol_nr);
633 int n=0, symbol_nr=0;
634 for(
int ri=0; ri<mtac->
nr; ri++) {
636 char tac_id[32], tac_title[64];
637 sprintf(tac_id,
"plot_%d", n);
638 strcpy(tac_title, mtac->
tac[ri].
c[0].
name);
642 int ret=svg_write_tac(fp, &viewports, 2, tac_id, tac_title,
644 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLOPEN,
646 if(!ret) ret=svg_write_tac(fp, &viewports, 2, tac_id, tac_title,
648 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLFILLED,
651 if(!ret) ret=svg_write_tac(fp, &viewports, 1, tac_id, tac_title,
653 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLOPEN,
656 svg_legend_empty(&legends); fclose(fp);
665 if(max_color_nr<1) ci=0;
else ci=color_nr % max_color_nr;
666 if(max_symbol_nr<1) si=0;
else si=symbol_nr % max_symbol_nr;
667 svg_legend_add(&legends, 0, si, SYMBOLFILLED, ci, tac_title);
671 if(color_nr==max_color_nr) color_nr=0;
677 if(svg_end_coordinate_viewport(fp, NULL, verbose-3)) {
678 fclose(fp); svg_legend_empty(&legends);
684 if(svg_write_xticks(fp, &viewports, NULL, verbose-3)!=0 ||
685 svg_write_yticks(fp, &viewports, NULL, verbose-3)!=0)
687 fclose(fp); svg_legend_empty(&legends);
693 if(svg_end_plot_viewport(fp, NULL, verbose-3)) {
694 fclose(fp); svg_legend_empty(&legends);
700 if(viewports.label_area_viewport.is!=0) {
701 if(verbose>2) {printf(
"creating plot legends\n"); fflush(stdout);}
702 int ret=svg_create_legends(fp, &viewports, &legends, NULL, verbose-3);
704 fclose(fp); svg_legend_empty(&legends);
709 svg_legend_empty(&legends);
712 if(svg_close(fp, NULL, verbose-3)) {