plot resize and two y-axis'

Richard Gipps <[email protected]> Mon, 12 Dec 2005 21:53:53 +1100
Newsgroups gmane.comp.scigraphica.gtkextra
Message-ID <[email protected]>
Hi,
	I have a couple more questions on GtkPlot - I hope I am not waring anyones 
patience out!!:)

I have tried to draw one plot on top of another as suggested, but when the 
second one is drawn it overwrites the first.  I have included my code 
below.  Also I am having trouble resizing the graphs.  I have got something 
that sort of works, but not very well.  I know there has been much 
discussion about this over these years (on this list) but I could not find 
a 'definitive' answer.  I have included my code below.  Any help would be 
much appreciated.  Richard.

/* plot.c */

#include "gtk.h"
#include "glib.h"
#include "gtkplot.h"
#include <fcntl.h>
#include "gtkplotcanvas.h"
#include "gtkplotcanvasplot.h"
#include "gtkplotdata.h"

#define NPOINTS 11
GtkWidget* canvas;

void quit()
{
    gtk_main_quit();
}

gboolean resize_canvas(GtkWidget* vbox,GdkEvent* event,GtkWidget* vbox_in)
{
     gint w;
     gint h;

     w = vbox_in->allocation.width;
     h = vbox_in->allocation.height;
     gtk_plot_canvas_set_size(GTK_PLOT_CANVAS(canvas),w,h);
     gtk_plot_canvas_paint(GTK_PLOT_CANVAS(canvas));
     gtk_plot_canvas_refresh(GTK_PLOT_CANVAS(canvas));
     g_message("W = %d H = %d",w,h);

     return FALSE;
}

int main(int argc, char *argv[])
{
     GtkWidget* window;
     GtkWidget* vbox;
     GtkWidget* plot;
     GtkWidget* plot2;
     GtkPlotCanvasChild* child;
     GtkPlotCanvasChild* child2;
     GtkPlotData* dataset;
     GtkPlotData* dataset2;
     GdkColor colour_magenta;
     GdkColor colour_RoyalBlue1;
     GdkColor colour_LightGray;
     GdkColor colour_black;
     gdouble px[NPOINTS];
     gdouble py[NPOINTS];
     gdouble px2[NPOINTS];
     gdouble py2[NPOINTS];
     int error_fd;
     int i;

     error_fd = open("error.log",
                      O_CREAT|O_WRONLY|O_TRUNC, //create file|open for 
writing only|if the file exists, truncate it to zero length
                      0666); //The protection mode for the file
     dup2(error_fd,STDERR_FILENO);

     gtk_init(&argc, &argv);

     //allocate colours
     gdk_color_parse("magenta",&colour_magenta);
     gdk_color_alloc(gdk_colormap_get_system(),&colour_magenta);
     gdk_color_parse("RoyalBlue1",&colour_RoyalBlue1);
     gdk_color_alloc(gdk_colormap_get_system(),&colour_RoyalBlue1);
     gdk_color_parse("LightGray",&colour_LightGray);
     gdk_color_alloc(gdk_colormap_get_system(),&colour_LightGray);
     gdk_color_parse("black",&colour_black);
     gdk_color_alloc(gdk_colormap_get_system(),&colour_black);

     //main window
     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title(GTK_WINDOW(window),"Plot");
     gtk_container_border_width(GTK_CONTAINER(window),0);
     g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(quit),NULL);

     //vbox
     vbox = gtk_vbox_new(TRUE,0);
     gtk_container_add(GTK_CONTAINER(window),vbox);
     g_signal_connect(GTK_OBJECT(window),"configure-event",G_CALLBACK(resize_canvas),vbox);

     //canvas
     canvas = gtk_plot_canvas_new(450, 450, 1.0);//The 1.0 is the scale factor
     gtk_box_pack_start(GTK_BOX(vbox),
                        canvas,
                        FALSE,//expand
                        TRUE,//fill
                        0);  //padding

     //plot 1
     plot = gtk_plot_new(NULL);
     //gtk_plot_set_range(GtkPlot *plot,gdouble xmin,gdouble xmax,gdouble 
ymin,gdouble ymax)
     gtk_plot_set_range(GTK_PLOT(plot),0,10,0,100);
     //gtk_plot_set_ticks(GtkPlot *plot, GtkPlotOrientation orientation, 
gdouble major_step, gint 
nminor)                                                 gint nminor);
     gtk_plot_set_ticks(GTK_PLOT(plot),GTK_PLOT_AXIS_X,2,0);
     gtk_plot_set_ticks(GTK_PLOT(plot),GTK_PLOT_AXIS_Y,10,0);
     //gtk_plot_axis_show_ticks(GtkPlotAxis *axis,gint major_mask,gint 
minor_mask);
     gtk_plot_axis_show_ticks((GTK_PLOT(plot))->left,0,0);
     gtk_plot_axis_show_ticks((GTK_PLOT(plot))->bottom,0,0);
     //gtk_plot_grids_set_visible(GtkPlot *plot,gboolean vmajor,gboolean 
vminor,gboolean hmajor,gboolean hminor);
     gtk_plot_grids_set_visible(GTK_PLOT(plot),1,0,1,0);
     //Botttom X-axis settings
     gtk_plot_axis_set_attributes((GTK_PLOT(plot))->bottom,1.0,&colour_black);
     gtk_plot_major_vgrid_set_attributes(GTK_PLOT(plot),GTK_PLOT_LINE_SOLID,1.0,&colour_LightGray);
     //Top X-axis settings
     gtk_plot_axis_set_visible((GTK_PLOT(plot))->top,0);
     //Left Y-axis settings
     gtk_plot_axis_set_attributes((GTK_PLOT(plot))->left,1.0,&colour_black);
     gtk_plot_major_hgrid_set_attributes(GTK_PLOT(plot),GTK_PLOT_LINE_SOLID,1.0,&colour_LightGray);
     //Right Y-axis settings
     gtk_plot_axis_set_visible((GTK_PLOT(plot))->right,0);
     //Titles
     gtk_plot_axis_hide_title((GTK_PLOT(plot))->right);
     //gtk_plot_axis_set_title(GtkPlotAxis *axis, const gchar *title);
     gtk_plot_axis_set_title((GTK_PLOT(plot))->bottom, "Frequency (MHz)");
     //Add plot to canvas
     child = gtk_plot_canvas_plot_new(GTK_PLOT(plot));
     gtk_plot_canvas_put_child(GTK_PLOT_CANVAS(canvas), child, 0.10, 0.10, 
0.85, 0.85);
     gtk_widget_show(plot);

     /* plot dataset 1*/
     for (i = 0; i < NPOINTS; i++)
     {
       px[i] = i;
       py[i] = i*i;
     }
     dataset = GTK_PLOT_DATA(gtk_plot_data_new());
     gtk_plot_add_data(GTK_PLOT(plot),dataset);
     //Legends
     gtk_plot_data_set_legend(dataset, "DB(|S21|) (L)");
     gtk_plot_data_set_points(dataset, px, py, NULL, NULL, NPOINTS);
     //gtk_plot_data_set_line_attributes(GtkPlotData *data,GtkPlotLineStyle 
style,GdkCapStyle cap_style,GdkJoinStyle join_style,gfloat width,const 
GdkColor *color);
     gtk_plot_data_set_line_attributes(dataset,GTK_PLOT_LINE_SOLID,GDK_CAP_ROUND,GDK_JOIN_MITER,1.0,&colour_RoyalBlue1);
     gtk_plot_data_draw_points(dataset, 1);
     gtk_widget_show(GTK_WIDGET(dataset));

     //plot 2
     plot2 = gtk_plot_new(NULL);
     gtk_plot_set_range(GTK_PLOT(plot2),0,10,0,100);
     gtk_plot_set_ticks(GTK_PLOT(plot2),GTK_PLOT_AXIS_Y,10,0);
     gtk_plot_axis_show_ticks((GTK_PLOT(plot2))->top,0,0);
     gtk_plot_axis_show_ticks((GTK_PLOT(plot2))->right,0,0);
     //Top X-axis settings
     gtk_plot_axis_set_attributes((GTK_PLOT(plot2))->top,1.0,&colour_black);
     gtk_plot_axis_show_ticks((GTK_PLOT(plot2))->top,0,0);
     gtk_plot_axis_show_labels((GTK_PLOT(plot2))->top,0);
     //Bottom X-axis settings
     gtk_plot_axis_set_visible((GTK_PLOT(plot2))->bottom,0);
     //Left Y-axis settings
     gtk_plot_axis_set_visible((GTK_PLOT(plot2))->left,0);
     //Right Y-axis settings
     gtk_plot_axis_set_attributes((GTK_PLOT(plot2))->right,1.0,&colour_black);
     //Titles
     gtk_plot_axis_hide_title((GTK_PLOT(plot2))->right);
     child2 = gtk_plot_canvas_plot_new(GTK_PLOT(plot2));
     gtk_plot_canvas_put_child(GTK_PLOT_CANVAS(canvas), child2, 0.10, 0.10, 
0.85, 0.85);
     gtk_widget_show(plot2);

     //plot 2 dataset
     for (i = 0; i < NPOINTS; i++)
     {
       px2[i] = i;
       py2[i] = 100-i*i;
     }
     dataset2 = GTK_PLOT_DATA(gtk_plot_data_new());
     gtk_plot_add_data(GTK_PLOT(plot2),dataset2);
     gtk_plot_data_set_points(dataset2,px2,py2,NULL,NULL,NPOINTS);
     gtk_plot_data_set_line_attributes(dataset2,GTK_PLOT_LINE_SOLID,GDK_CAP_ROUND,GDK_JOIN_MITER,1.0,&colour_magenta);
     gtk_plot_data_draw_points(dataset2, 1);
     gtk_widget_show(GTK_WIDGET(dataset2));

     gtk_plot_canvas_paint(GTK_PLOT_CANVAS(canvas));
     gtk_plot_canvas_refresh(GTK_PLOT_CANVAS(canvas));
     gtk_widget_show_all(window);

     gtk_main();

     return 0;
}




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click