Adjustments to graphMatrixFile for much smaller output.
authorW. Trevor King <wking@drexel.edu>
Thu, 29 Apr 2010 04:22:09 +0000 (00:22 -0400)
committerW. Trevor King <wking@drexel.edu>
Thu, 29 Apr 2010 05:04:48 +0000 (01:04 -0400)
New implementation converts input x/y/z arrays to x and y sets
specifying coordinates for a z matrix, which asymptote handles more
cleanly than nominally non-gridded data.

Also fixed palette positioning, which was broken in the previous
implementation.

tex/src/figures/asy/wtk_graph.asy
tex/src/figures/fit-space/fit-valley.asy
tex/src/sawsim/discussion.tex

index 1e8b172609d7d6711a8162aba45530791adca5c0..87c3ab95f31d0954cc12357487099de6df8135bc 100644 (file)
@@ -40,10 +40,46 @@ real[] identity_zfn(real[] z) {
   return z;
 }
 
+/* Return a sorted list of unique entries in an array x */
+real[] set(real[] x) {
+  int i=1;
+  x = sort(x);
+  while (i < x.length){
+    if (x[i] == x[i-1])
+      x.delete(i);
+    else
+      i += 1;
+  }
+  return x;
+}
+
+/* Convert x,y,z arrays to a z matrix */
+real[][] extract_matrix(real[] xs, real[] ys, real[] zs) {
+  int i, j, k;
+  real[] x_set = set(xs);
+  real[] y_set = set(ys);
+  real[] z_col = array(y_set.length, 0);
+  real[][] z_matrix = array(n=x_set.length, z_col);
+  //assert zs.length == x_set.length*y_set.length;
+  for (i=0; i<x_set.length; ++i) {
+    for (j=0; j<y_set.length; ++j) {
+      for (k=0; k<x_set.length*y_set.length; ++k) {
+       if (xs[k] == x_set[i] && ys[k] == y_set[j]) {
+         z_matrix[i][j] = zs[k];
+         break;
+       }
+      }
+    }
+  }
+  return z_matrix;
+}
+
 void graphMatrixFile(picture pic=currentpicture, string file="datafile",
                      real xscale=1, real yscale=1,
                     real[] zfn(real[] z)=identity_zfn,
-                    pen[] p=BWRainbow(), Label palette_label=null) {
+                    pen[] p=BWRainbow(), Label x_label=null,
+                    Label y_label=null, Label palette_label=null,
+                    real palette_offset=6pt, real palette_width=12pt) {
   file fin = input(file).line();
   real[][] a = fin.dimension(0,0);
   /* drop blank lines used to separate Gnuplot blocks. */
@@ -51,17 +87,32 @@ void graphMatrixFile(picture pic=currentpicture, string file="datafile",
     if (a[i].length < 3)
       a.delete(i);
   a = transpose(a);
-  real[] x = a[0];
-  real[] y = a[1];
-  real[] z = a[2]; //zfn(a[2]);
-  bounds range = image(pic=pic, x=xscale*x, y=yscale*y, f=z, palette=p);
-  pair initial = point(SE) + (0,6pt);
-  pair final = point(NE) + (0,6pt);
+  real[] xs = a[0];
+  real[] ys = a[1];
+  real[] zs = zfn(a[2]);
+  real[][] z = extract_matrix(xs, ys, zs);
+  pair initial = (xscale*min(xs), yscale*min(ys));
+  pair final = (xscale*max(xs), yscale*max(ys));
+  //bounds range = image(pic=pic, x=xscale*x, y=yscale*y, f=z, palette=p);
+  bounds range = image(pic=pic, z, initial, final, range=Automatic, palette=p);
+  // Add axes before palette or palette will end up in same box as the image
+  if (x_label != null)
+    xaxis(pic, x_label, BottomTop,LeftTicks,above=true);
+  if (y_label != null)
+    yaxis(pic, y_label, LeftRight,RightTicks,above=true);
+  transform graph_to_pic = pic.calculateTransform();
+  transform pic_to_graph = inverse(graph_to_pic);
+  pair p_SE_pic = graph_to_pic * (xscale*max(xs), yscale*min(ys));
+  pair p_initial_graph = pic_to_graph * (p_SE_pic + palette_offset*E);
+  pair p_NE_pic = graph_to_pic * (xscale*max(xs), yscale*max(ys));
+  pair p_final_graph = pic_to_graph * (p_NE_pic
+                                      + (palette_offset+palette_width)*E);
   if (palette_label == null)
-    palette(pic=pic, bounds=range, initial=initial, final=final, palette=p);
+    palette(pic, bounds=range, initial=p_initial_graph, final=p_final_graph,
+           axis=Right, palette=p);
   else
-    palette(pic=pic, L=palette_label, bounds=range, initial=initial,
-           final=final, palette=p);
+    palette(pic, L=palette_label, bounds=range, initial=p_initial_graph,
+           final=p_final_graph, axis=Right, palette=p);
 }
 
 string units(string value, string units) {
index 9e6e3a29687b8d947edc28b8ba132c95098a1308..854f79ca5db25c88727e300e0ec105d3603446d9 100644 (file)
@@ -2,17 +2,12 @@ import wtk_graph;
 
 size(15cm,10cm,IgnoreAspect);
 
-scale(Log, Linear);
+scale(Log, Linear, Log);
 real xscale=1;
-real yscale=1;
+real yscale=1e9;
 
-graphMatrixFile("data", xscale=xscale, yscale=yscale, zfn=log10);
-
-xlimits(0.002,0.26383);
-ylimits(0.12,0.198077);
+graphMatrixFile("data", xscale=xscale, yscale=yscale,
+               x_label="$k_{uo}$ (s$^{-1}$)", y_label="$x_u$ (nm)",
+               palette_label="$D_\text{JS}$");
 
 label(sLabel("Fit quality"), point(N),N);
-xaxis(sLabel("$k_{uo}$ (s$^{-1}$)"),BottomTop,LeftTicks);
-yaxis(sLabel("$x_u$ (nm)"),LeftRight,RightTicks);
-
-add(legend(),point(E),20E,UnFill);
index b1cf55788829f6d31cf89ad5c145fe34cdb73b40..f3d52df0f33cc6e8f903849b898a98346d37c78f 100644 (file)
@@ -319,7 +319,7 @@ about the protein from other sources.
 
 \begin{figure}
   \begin{center}
-  \includegraphics{figures/fit-space/fit-valley}
+  \asyfig{figures/fit-space/fit-valley}
   \caption{Fit quality between an experimental data set and simulated
     data sets obtained using various values of unfolding rate
     parameters $k_{u0}$ and $\Delta x_u$.  The experimental data are
@@ -328,7 +328,6 @@ about the protein from other sources.
     \cref{fig:sawsim:sim-all}.  The best fit parameters are $\Delta
     x_u=0.17\U{nm}$ and $k_{u0}=1.2\E{-2}\U{s$^{-1}$}$.  The
     simulation histograms were built from $400$ pulls at for each
-    parameter pair.  The color scale shown on the right is
-    $log_{10}(D_\text{JS})$.\label{fig:sawsim:fit-space}}
+    parameter pair.\label{fig:sawsim:fit-space}}
   \end{center}
 \end{figure}