You are on page 1of 104

Creating Nomograms with the PyNomo Software

Version 1.1 for PyNomo Release 0.2.2
Ron Doerfler
http://www.myreckonings.com/wordpress
October 19, 2009

It
is written by Leif Roschier, and it provides a solution to one of the most vexing of problems in
nomography: actually drawing the nomogram once the mathematical layout is derived. The output
is in vector form in a PDF or EPS file, so it can be enlarged for printing and still retain its sharpness. If
additional artwork is desired, the vector file can be edited in vector form in, say, Adobe Illustrator, Microsoft
Visio or LaTeX. PyNomo directly supports nine basic types of nomograms based simply on the format of the
equation, so for these types there is no need to convert the equation to the standard nomographic determinant
or use geometric relations. But it also supports more complicated equations that have been cast into general
determinant form, so it can produce output for any equation that can be plotted as a nomogram. In fact,
PyNomo is an excellent tool for experimenting with parameters to get the best nomogram for the problem at
hand. This essay discusses the use of PyNomo for creating a variety of sophisticated types of nomograms.1

P

1

YNOMO IS A POWERFUL , FREE SOFTWARE PACKAGE FOR DRAWING PRECISION NOMOGRAMS .

Changes in Version 1.1 compared to Version 1.0
This version 1.1 introduces these significant changes to the PyNomo software:
1. Smart Tick Spacing on Scales (“smart axes”) — Nonlinear scales generally need different tick levels
for different parts of the scale to provide the greatest accuracy to the user. Areas where the major tick
marks are more spaced out allow additional tick marks of lower levels to be inserted. In the past this has
been accomplished by specifying an initial range and tick level for a scale, and then adding additional
ranges with different tick levels using the scale parameter extra_params. The “smart axes” feature
introduces scale types of linear smart or log smart that will automatically determine appropriate tick
levels over the entire scale. It even adjusts labels on the scale to avoid overlap. Perhaps the most
striking difference offered by this feature is seen by comparing the circular dials between this version
and the previous version of this document.
2. Isopleths — To draw sample isopleths, or index lines, on a nomogram previously required drawing
lines between grid coordinates on the overall nomogram. The main parameter make_grid could be set
to True to draw a numbered grid over the nomogram, and then the coordinates would be determined
manually and entered as the line coordinates. Thereafter, any change in the nomogram size or layout
1 I would like to thank Leif Roschier,

Joe Marasco and Scott Finegan for reviewing drafts of this essay and providing suggestions that
have considerably improved it. If you have any questions or suggestions, please feel free to email me at doerfpub@myreckonings.com

1

required this process to be repeated. The “Isopleth” feature draws lines directly between specified
values on the scales, calculating the points on intermediate scales as needed. As before, various styles
and colors of lines are supported.
3. Text format of scale values — The previous version of PyNomo assigned the value $%3.2f$ as the
default text_format for label values (as in 'text_format':r"$%3.2f$",), which displayed up to 3
digits to the left of the decimal point, and in all cases 2 digits to the right of the decimal point even if
the last digit were 0. The trailing zeros on the text labels are now eliminated by changing the default
text format to $%4.4g$. The g print format produces a decimal number of up to 4 digits left of the
decimal point and 4 to the right only as needed, unless the number is 0.0001 or less in which case it is
printed in exponential form (e.g., 1e-4). This provides a cleaner nomogram, as unnecessary digits are
not shown. As before, this default can be changed by specifying a different text format.

2

What is a Nomogram and Why Would It Interest Me?

A nomogram is a diagram that provides a graphical way of calculating the result of a mathematical
formula. Sometimes called an alignment chart, a nomogram consists of a set of numbered scales, usually one
for each variable in the formula, arranged so that a straightedge can be placed across known values to find the
unknown value that solves the formula. Since an equation in two variables is usually represented by a graph,
most nomograms represent formulas that involve three or more variables. These graphical calculators were
invented in 1880 by Philbert Maurice d’Ocagne and used extensively for many years to provide engineers
with fast graphical calculations of complicated formulas to a practical precision. Electronic calculators and
computers have made nomograms much less common today, but when a fast, handy calculator of a particular
formula is needed they can be very useful. The cost to produce one is a sheet of paper, and they are fun to
design, easy to use, and can be beautiful designs that engage people.2
The simplest nomogram, one we often encounter, is a single scale with numbers on both sides of it.
This is called a conversion scale, and some people would hesitate to call it a nomogram at all. It provides
conversion between two functions such as units of measurement. The most frequently seen example is
probably a Fahrenheit to Celsius scale. We will inspect a single-scale nomogram as our first example.
The most common type of multi-scale nomogram consists of three parallel straight scales. It is used to
solve an equation in which functions of three variables are added. The simplest such formula is u1 +u2 +u3 =
0 for the three variables u1 , u2 and u3 . An example of this type of nomogram from the PyNomo website3 is
shown below, annotated with terms used to describe the parts of a nomogram. A line (called an index line
or isopleth) or a straightedge will cross the three scales at values that solve this equation, so if you know the
values of any two of the variables you can find the third very easily.

2 For more details on nomograms see http://myreckonings.com/wordpress/2008/01/09/the-art-of-nomography-i-geometric-design/ ,
http://www.pynomo.org/wiki/index.php/Basics, http://www.projectrho.com/nomogram/ and http://www.barbecuejoe.com/scan.htm
3 http://www.pynomo.org/wiki/index.php/Type_1

2

There are many (out-of-print) books on the mathematics of nomography, but PyNomo allows us to design
nearly all nomograms with very little mathematics background. A knowledge of algebra is necessary in order
to arrange the formula into a standard type of equation that PyNomo supports. Then a PyNomo script for
creating the nomogram can be copied from a standard example of that type and edited to match the terms in
the formula. The script is run and a PDF file is created with the nomogram laid out for printing. Copying and
modifying a standard example is easy and fast, and I do it all the time. Once you start making nomograms you
may want to customize how they look—the spacing of tick marks on the scales, the scale titles, the location
of the nomogram title, and so forth. You may want to draw a sample isopleth and add color to the scales and
their labels. PyNomo offers many such features, and this paper tries to cover them all, but don’t be put off by
these extra details sprinkled in the examples here. They may make the scripts appear more complicated, but
they are totally optional and can be ignored until the day you decide you really would like that one scale to
be red. That’s the point where you look in the index at the end of this essay for scale parameters that involve
color.
A knowledge of logarithms is sometimes helpful to convert your formula to a standard type recognized
by PyNomo. For example, suppose you have a typical formula in which three variables are multiplied or
divided, and maybe one or two are raised to a power. You can convert it to a formula of simple additions by
taking the logarithms of both sides of the equation. You only need to know a few properties of logarithms:
log(a × b) = log a + log b
log(a/b) = log a − log b
log(ab ) = b log a

So a formula such as V = πr2 h for the volume of a cylinder can be expressed as an equation with simple

3

02 0.2 0.5 0. four other Python add-on packages. Detailed instructions for the installation on Windows platforms are found on the PyNomo site4 . The output of the PyNomo script for a Type 1 nomogram with these variable functions looks like the one to the right.sums as logV = log(πr2 h) logV = log(πr2 ) + log h logV = log(π) + log(r2 ) + log h logV = log(π) + 2 log(r) + log h logV − log(π) − 2 log(r) − log h = 0 So now we have an equation of a sum of terms. where the powers of 10 are the major tick marks and the intermediate values are spaced unevenly.8 2 1 1 1 0.org/wiki/index.org.04 0.pynomo.3 0. The software is OS-independent in principle.08 0.6 0.6 0.1 0.2 h 0.php?title=Installation 80 60 40 30 5 If a formula cannot be manipulated alge6 7 braically into one of the standard equations 8 10 supported by PyNomo.2 0. The scales have logarithmic spacing now. Mac OS X and Linux.05 0.01 2 8 6 4 3 10 4 4 http://pynomo. We replace u1 . and this creates the scales for V .06 0.8 0.03 100 0.03 0.01 .4 0.08 0. the PyNomo package for Python. as Python interpreters exist for all major operating systems.04 0. and the radius corresponding to a given volume and height is found just as easily. It requires installation of several other software packages. 3 800 600 0. It runs at least on Windows XP/Vista. Try it—it works! r V = πr2 h 0. resulting in a parallel three-scale Type 1 nomogram as in our previous example. r and h that form the nomogram. it can be created using the Type 9 Determinant form supported by PyNomo.07 0.01 V 1000 400 300 0.7 0. The volume is easily found from this nomogram for a given radius and height.06 0.02 0. including the Python language.04 0. (click on the link at the top of this page for step-by-step instructions) 4 0. {− log(π) − 2 log(r)} and log h.4 4 2 0.3 0.1 3 Finding and Installing PyNomo PyNomo can be found at http://www.02 200 0.4 0.1 20 10 0. u2 and u3 in our script with the functions logV . Sufficient information on determinants is provided in the Type 9 section of this essay to use this form without any prior knowledge of determinants. and the MiKTeX distribution of the typesetting language LaTeX/TeX.

2. you can go to the PyNomo development webpage5 . click on the filename. click on the download link along the top. you can fetch all the revisions with the svn command: svn co https://pynomo. the latest release as of this writing. The PyNomo files are located in the Lib\site-packages\pynomo subfolder under the folder where you installed Python.It is worth the time to install. There are two ways to install any files updated since the last release.net/projects/pynomo/develop 5 . and save the file to the folder containing the PyNomo files.net/svnroot/pynomo pynomo 5 http://sourceforge. choosing to replace the file when prompted.2 of PyNomo.svn. as it produces beautiful nomograms without all the effort required to draw them by other means. This article is based on Release 0. Then click on the revision numbers in low-to-high order. Alternatively. For each filename listed for a revision. on a Linux/OS X operating system or on a Windows system with cygwin installed.sourceforge. First.

org/wiki/index.pynomo.pynomo. and so forth. Type Form of Equation Form of Nomogram Covered In Type 1 f1 (u1 ) + f2 (u2 ) + f3 (u3 ) = 0 3 Parallel Scales Section 6 Type 2 f1 (u1 ) = f2 (u2 ) × f3 (u3 ) or f3 (u3 ) = f1 (u1 ) / f2 (u2 ) N or Z Section 7 Type 3 f1 (u1 ) + f2 (u2 ) + . + fn (un ) = 0 Compound Parallel Scales Section 8 — f1 (u1 ) + f2 (u2 ) + f3 (u3 ) = 0 and f3 (u3 ) + f4 (u4 ) + f5 (u5 ) = 0 3 Parallel Scales Compounded Section 11 Proportion Section 13 Type 4 f1 (u1 ) f2 (u2 ) = f3 (u3 ) f4 (u4 ) Type 5 f1 (v) = f2 (x. It can also handle general determinant forms.php/Examples 8 http://pynomo.4 Supported Nomogram Types If you are not familiar with PyNomo. If you go to the Software Documentation page8 you will find 10 different general types of nomograms it can create. u) Contour Section 17 Type 6 u=u Ladder Section 12 Reciprocal/Angle Section 14 Type 7 1 f3 (u3 ) = 1 f1 (u1 ) + 1 f2 (u2 ) Type 8 y = f (u) Single Scale Sections 4 & 9 Type 9 Determinant General Nomogram Section 16 Type 10 f1 (u) + f2 (v) f3 (w) + f4 (w) = 0 One Curved Line Section 15 Nomogram Types Supported by PyNomo 6 http://www. even with more than 3 variables. sum of reciprocals. The types of nomograms supported by PyNomo and the sections that these are covered in here are shown in the table below. so it can really handle any type of nomogram. “N” or “Z” for division. proportions. you really should see the Basics6 and Examples7 links off the main PyNomo webpage..org/wiki/index.php?title=Software_documentation 6 . You will be amazed at what this program can do. This paper concludes with Section 18 discussing some ways you can edit your PyNomo nomogram with external image tools if you wish.org/wiki/index. Section 10 deals exclusively with adding color to your nomogram.php/Basics 7 http://www. including the most common one of 3 parallel scales for addition or multiplication. followed by an index of terms and parameters in this essay..

Below is the PyNomo script and output PDF graphic for the conversion scale. Copying the script directly out of the PDF form of this essay will cause the indents to disappear and the script to fail. A set of block parameters identifies the PyNomo type for the scale and the name of the set of scale parameters. type and size). Then the minimum and maximum values are provided. and run the script as described in the next section. paper size and transformations to apply). A single scale is a Type 8 nomogram in PyNomo. This includes a tag name to share with the Kilometers scale so the two scale axes line up on top of one other. Each scale has its own set of parameters (function. This is repeated for the Kilometers scale. and finally the side of the scale axis to draw the tick marks and labels is given. change the titles. but the ranges are obviously different by a factor of 1. The top line is a comment line as it starts with a # sign.pdf 7 . titles and tick levels of each scale. Each type of nomogram has an example on the PyNomo website. the paper height and width.com/pynomo11/Type8-Sample. and each set of scales that make up a nomogram type have a set of block parameters (the scale names. Compound nomograms will have multiple blocks. and transformations to apply. but the script and PDF output are available online for download. the title is given and shifted over to that side of the scale. Let’s look at a script to create a simple conversion scale between miles and kilometers. there is a set of main parameters (the block names. These ticks are placed on the right side of the scale axis. A new parameter provides the alignment function so the scales will overlay. the function is provided for the scale in terms of u.609.myreckonings. A script specifies the type of nomogram and the functions. the levels of tick marks to draw and the level of tick labels to display are indicated. It’s usually best to copy an existing script for a nomogram of the same type into a new text file and edit it for our needs. Finally. More complicated scripts are just variations on this basic structure of scales and their parameters.myreckonings.609. The main parameters consist of the output filename. range values and functions. If you want to make a conversion scale. The next line and the last line are common to all scripts.). just copy this script. which is the inverse or u/1.9 9 http://www. so we will create two Type 8 nomogram blocks with the same tag name. A set of scale parameters is provided first for the Miles scale. etc. here simply to scale the nomogram to the specified paper size.py and http://www.com/pynomo11/Type8-Sample. This nomogram consists of a pair of scales that are assigned tags to cause them to overlay each other. title. title.5 The Structure of a PyNomo Script Here we will inspect a simple PyNomo script for overall structure without delving into the details.609 and its function u is multiplied by 1. and there are also a number of examples presented in this paper.

609*100. 'block_params':[block_1_params.5. 'title_x_shift':0. 'tick_side':'right'. 'u_min':0. 'tick_text_levels':2.5. 'u_max':100. 'transformations':[('scale paper'. 'paper_width':0.609*u. 'tick_side':'left'.pdf'.block_2_params]. } block_1_params={ 'block_type':'type_8'.)]. 'title_x_shift':-0. 'f_params':Kilometers_params. 'function':lambda u:1. 'tick_levels':3.5.0. } block_2_params={ 'block_type':'type_8'. } from pynomo. } Kilometers_params={ 'tag':'myscale'. 'function':lambda u:u.0.0. 'f_params':Miles_params. 'tick_text_levels':2. 'title':r'Km'. Nomographer(main_params) Mi Km 100 160 155 95 150 90 145 140 85 135 130 80 125 75 120 115 70 110 105 65 100 60 95 90 55 85 50 80 75 45 70 65 40 60 35 55 50 30 45 40 25 35 20 30 25 15 20 10 15 10 5 5 0 0 8 .609. 'u_min':0.py ### 'u_max':1. } main_params={ 'filename':'Type8-Sample. 'align_func':lambda u:u/1. 'paper_height':20.nomographer import * Miles_params={ 'tag':'myscale'. 'title':r'Mi'.### Type8-Sample. 'tick_levels':3.

The amount of indentation is not important. You can double-click on the . Then navigate to the folder with your PyNomo file (say. Now as the build is occurring any error message will appear in the Command Prompt window. In this case a syntax error is noted in the script because −u∗ should be followed by a number that −u is multiplied by. as Python uses indentation to determine the scope of a code construct.10 I have only used WordPad and a Command Prompt window so far. because I didn’t close the PDF output file from the previous run. and you can double-click on it to open it in your default PDF viewer (say. The parameters do not need to be in a particular order and most have default values. you can launch a Command Prompt window from the Start menu on the taskbar (Start– >Programs–>Accessories–>Command Prompt). If you’re like me. You should build the output file often as you write a PyNomo script in order to isolate errors as soon as they occur. there is an error in the script. but you will see that when a function is long it’s cleaner to define it at the top of the script using the “def” command and give the function name in the scale parameters. it’s much better to open a Command Prompt window in Windows or a Terminal application in Linux or OS X.html 9 . such as EasyEclipse for Python. Note that you enter python. cd C:\PyNomoScripts).py since they are interpreted by Python. First.easyeclipse. 10 http://www. This is a vector-drawn nomogram that can be printed out or converted to another image format and inserted into a document.6 Basic Things to Know About Scripts PyNomo scripts are written in text files saved with the suffix . a True or False. Here is a typical Command Prompt window showing the navigation to the folder containing scripts (using the cd command to change the directory). I don’t know Python. Any text editor such as WordPad can be used as long as you save the output as a plain text file. Don’t mix tabs and spaces—I would suggest using spaces only. or a number. Then enter python <filename>. though. you may be interested in using a text editor designed for writing and building Python files.org/site/distributions/python. Adobe Acrobat). where the key is a string in single quotes and the value can be a string in single quotes. but there are just a few things to remember about Python scripts. we are mostly filling in a “dictionary” of key:value parameters. For Windows.py file to build and display the output.py and a carriage return. a simple scale function is usually expressed as a local “lambda” function. A black command window appears for a little bit. because the problem is really that I forgot to add a comma at the end of the previous line. If the output file fails to materialize. and about 20 seconds later the PDF (or EPS) output file is written in your folder. these are by far the most common errors you will encounter in a build: • The output file cannot be opened. In order to see any error messages. Note that you have to exit a previously-built PDF file of the same name before you build another or it will fail in overwriting the file. Also. Finally. • A syntax error where the offending line shown appears just fine. you need to indent the list of parameters after the initial line containing the parameter set name. As you use PyNomo more. not pynomo.

Insert the \par command (does not work in the primary scale title title_str) 3.pynomo. One solution to the divide-by-zero error is shown in an online PyNomo example11 . so place it immediately at the end without a space). which will print a larger title than normal. because my scale range included a value that produces zero in a denominator in the scale function.0001 return u1 Formats of Title Text The underlying typesetting engine used by PyNomo is a language called TeX. you have to add a backslash \ at the end of the line to indicate that the string continues on the next line (the \ produces a space.org/wiki/index. It handles text strings differently from mathematical expressions. an indication of “raw” text that allows TeX formatting commands to be inserted in the title. It also occurred when I had a singularity in a particular Type 9 Determinant nomogram (see the Type 9 section). Use separate title texts placed to simulate a carriage return If you precede a title with \bf then any title text will be printed in bold. You can end the program with a Ctrl-c key combination. Preceding it with \it will print it in italic. and if you understand a few of the things you can do with these you will have more options for formatting them. • An undefined scale or block name. First.0: u1=0.php/Photography_exposure 10 . This function can be defined at the beginning of the script as def limit_u(u): u1=u if not u1>0. This can sometimes occur due to a similar internal problem resolving the curves in a Type 5 Contour nomogram. • A general hang-up where the program does not stop working and no error messages are output. A copyright symbol is generated by \copyright. say limit_u(u). as in 'title_str':r'Equivalent Resistance'. because I had copied and pasted a parameter section from another example and I forgot to change the name to the one called for in the block or main parameter section. Size the title box to force a return at the right place 2. It’s possible in any title to precede the text with a TeX font size command such as \Large as in 'title_str':r'\Large Equivalent Resistance'. To get a carriage return in a title you have three options: 1. even the extra titles. I’ve found that this usually means I’ve made some sort of mistake in entering my scale function. that makes sure the divide-by-zero situation does not occur. The options are \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \Huge If a title string spans more than one line of your script. where the variable u in the scale function can be replaced by a function of u.• A divide-by-zero error. but both of these revert to normalsize font. 11 http://www. make sure you add the letter r right before the string in any title.

sinh(x). as you get a larger symbol ×. radians(x).edu/computing/latex/manual/node21. 1em and 2em. and in general precede any Greek letter with \ to print the symbol.58 (0. Other common math symbols include ^ \circ for a degree sign ◦ and p \sqrt{} for a square root of the text in the curly braces. where x and y will be functions of u.e. are exp(x). is a superscript. respectively: \thinspace \enspace \quad \qquad Formats of Title Math Expressions Mathematical expressions. log(x[. as \sqrt{L/m^2} produces L/m2 . For the times symbol you should use \times rather than x or *.58}(0. so even if you leave a few spaces between words in a title or between symbols in a math expression you will find that no extra space appears in the output nomogram. within $ signs).harvard. log10(x). as the math mode removes spaces in your text. acos(x). pow(x.math. as in \$ $ & % # _ { } ’ TeX takes care of spaces between letters words. Subscripts are similar but use an underscore rather than a caret: a_{12} in a math expression will appear as a12 . In functions the variable is generally u.74V) = P$ in which the ^ symbol indicates that the next character. log(x). and these should not be confused with the mathematical expressions we discussed above for displaying in title text.html details see http://docs. asinh(x). such as formulas appearing in the title text. asin(x). must begin and end in dollar signs ($). tanh(x) 12 See 13 For the list at http://abel. To add space you can use one of these commands that add 1/12em. y).3) for cubing u. The expression \div will produce a division sign ÷ if you prefer this to a / symbol. x).html 11 . cos(x). The title will appear in the output as: (S + 0. degrees(x). or the next set of characters in curly braces. 1/2em. Note that you cannot have superscripts or subscripts in text without treating it as a mathematical expression by surrounding it with $ signs. For example.org/library/math.python. sqrt(x)..The following symbols in title text are special characters and must be preceded by a backslash. atan(x). y).13 The main ones. the title in our first example is given as $(S+0. This simply prints the letter in italic. atanh(x). atan2(y. For titles of more than one word you will have to add spacing macros as described above.74V ) = P You will see in some of the examples here that the title is placed in $ signs even though it may be just a letter. base]).12 Formats of Math Functions Each scale has a mathematical function associated with it.64)0. hypot(x. sin(x). acosh(x). The expression \approx will produce an approximation symbol ≈. cosh(x). Other symbols are also available in math mode (i. In this mode letters are printed in italic font as variables and the typesetting is optimized for math. Within a mathematical expression you can also use \pi to print π. tan(x). indicating the entry and exit of Math Mode. so for example you should write 3*u for multiplying u by 3 and u**3 or pow(u. A significant number of math functions are available in Python. as \theta for θ and \Theta for the capital version Θ.64)^{0.

These are the basic things to know about a PyNomo script. Remember that it’s easiest to start by copying and pasting existing examples and then editing them. The rest is diving in and learning by example.Constants pi and e can also be used. just as we described in Section 1. We often use log10(u) for the common logarithm of u. It’s possible to use the natural logarithm log(u) everywhere since we usually scale the nomogram to the size of the paper. 12 . so we will consistently use log10(u). as we need to take the logarithm of both sides of an equation to convert it to the simple addition of logs to plot as a Type 1 nomogram. as well as copying and pasting additional parameter and block sections when adding new scales. We will see this in our very first example. and that’s what this paper is all about. but this can cause problems when some functions of the nomogram include logs and some do not.

0) = 3. f2 (u2 ) = u2 and f3 (u3 ) = u3 .0 < S < 3. The Type 1 link on the Software Documentation page of the PyNomo site16 shows an example script for this type of nomogram for the equation u1 + u2 + u3 = 0.58 log(S + 0.com/pynomo11/Type1-Example1.myreckonings. 0.5 + 0.58 log(S + 0. as shown on Software Documentation page for this type. it can also be used to multiply functions when they are expressed as logarithms.986 and the maximum P as (3.64) + log 0.74V = log P 0.py and http://www.64)0.58 (0.64)0.5 and 1.64) f2 (V ) = logV f3 (P) = − log P + log 0.74 × 1.myreckonings.58 (0. First.0.com/pynomo11/Type1-Example1. a set of parameters for each of the three scales is defined.58 log(S + 0.0 < V < 2.64) + log 0.74V ) = P We also assume that the engineering ranges we are interested in are 1.pynomo. There are quite a number of parameters available.0 + 0. so it can be used for addition of individual functions of three variables.org/wiki/index. that is. The PyNomo script and output PDF graphic are shown on page 16.374.com/wordpress/2008/01/09/the-art-of-nomography-i-geometric-design/ 15 http://myreckonings. so it’s a simple matter to modify this example for what we need.64)0. Discussions of plotting this same nomogram by geometrical means and by the use of determinants have been detailed elsewhere. The PyNomo script and the PDF output are available online for download.php/Type_1 17 http://www.74 + logV = log P 0.pdf 13 . As our example. the V-scale is quite small even after the polygon transformation. we will use this type of nomogram to graph the equation (S + 0. you can see that this is a Type 1 nomogram where f1 (S) = 0.com/wordpress/2008/01/09/the-art-of-nomography-ii-designing-with-determinants/ 16 http://www.7 Creating a Type 1 (Three Parallel Scales) Nomogram The vast majority of nomograms are of Type 1. We find that if we plot the nomogram scales in the left-to-right order SVP.14 15 Now we will see how it can be drawn using PyNomo. so we plot the scales in the order SPV. This is the case f1 (u1 ) = u1 . From the equation above we calculate the minimum P as (1.74 term in f1 (S) or f2 (V ) instead of f3 (P) if we had wished.74 × 2. composed of three parallel scales. we can express it as a simple sum of functions of the variables.58 (0.74 We could have included the log 0.0) = 0. The form of the equation for this nomogram is f1 (u1 ) + f2 (u2 ) + f3 (u3 ) = 0. but the ones we mention here are 14 http://myreckonings.58 log(S + 0. Taking the logarithm of both sides of the equation under consideration and re-arranging the terms.74 = 0 From the general form above. But as we described in Section 1.64) + logV − log P + log 0.17 Let’s look over the PyNomo script.

with # being nothing or a number for each scale included. displaying up to 4 digits left of the decimal point and 4 to the right only as needed. unless the number is 0.pdf or . but a compound nomogram can contain additional blocks as we will see later. We can also specify a proportional spacing between the scales in the Type 1 block parameters if we don’t use the scaling transformation. 1e-4) There are a few other options for scale titles that are not used here but will be seen later in our Type 4 example: • title_draw_center (True or False): locate the title at the center of the scale point of the scale • title_distance_center: distance of the title from the scale center (0.0001 or less in which case it is printed in exponential form (e. These parameters include • filename: the output filename with a . flip the scales of the finished block top-to-bottom to change the direction that the scales increase or decrease (False by default) In this simple nomogram there is only one block.0.eps suffix • paper_height and paper_width: the paper size to scale the nomogram to if scaling is specified (this is a rough value.g.5cm by default) • title_opposite_tick (True or False): place the centered title on the opposite side from the tick marks These sets of scale parameters are followed by a set of parameters for the whole block of scales.• u_min and u_max: the minimum and maximum values for the scale • function: the function of the variable for the scale • title: the title to place above the scale (remember to add the r between the colon and the string) • tick_levels: the level to which the tick marks are printed • tick_text_levels: the level to which the tick labels are printed • tick_side: the side of the scale to print the tick marks and labels (right side by default.4g$" is the default. A set of overall main parameters for the nomogram appears at the end. The block parameters include • block_type: the PyNomo Type of the block as defined in the previous section • height and width: the height and width of the block. depending on the Type of the nomogram • mirror_x: if True.. the overall size of which will be changed if the scale paper transformation is chosen in the main parameters (this is a rough value. but I like to place them on the side with the most space available) • text_format: the number of digits to the left and right of the decimal point in the tick labels (r"$%4. as tick marks and texts may extend this) 14 . by using the proportion parameter with a default of 1. as tick marks and texts may extend this) • f#_params: the previously defined scales to include in the block. as in 'proportion':1.0. flip the scales of the finished block left-to-right to change their order (False by default) • mirror_y: if True.

One is a very tiny rotation—some rotation is mandatory. I would suggest trying the polygon transformation after the nomogram is drawn to your satisfaction without it. incidentally) end up the same height. modifying it for another equation that can be put in this form is really a very easy process. In this case it moves the middle P-scale away from the center so that both outer scales (and that scale.• block_params: a list of defined nomogram blocks to include in the nomogram • transformations: rotation. so we just rotate it an unnoticeable amount. Finally. 15 .y) coordinate in cm of the center of the nomogram title from the lower left • title_box_width: the width of the invisible text box surrounding the title. The nomogram is also scaled to just fit the paper size defined earlier. which is the size of the paper since we are using the scale paper option. scaling. polygon transformations to apply as described below • title_x and title_y: the absolute (x. Once we have created a Type 1 nomogram. useful to force a carriage return at the right place in the title • title_str: the nomogram title (remember to add the r between the colon and the string) There are a few transformations to the nomogram that can be included in the main parameters. I’ve chosen the polygon transformation— this adjusts the nomogram so that the outline of the scales fits in a rectangle in order to maximize their readability on the paper. The fact that PyNomo does this scaling and polygonal transformation is a major benefit of using it—the polygonal transformation is a very tedious process to do manually. as you may not prefer the skewing it can do to your scales.

3 V 1.35.2 1.1 3 2.7 1.2 3.64).6 2.)].3 3.1 1 1 (S + 0. 'tick_levels':3.2 3.0.8 2.01).0.5 2.4 2.9 1.8 1. 'height':10.74V ) = P 16 . 'transformations':[('rotate'.3 2.2 2.('scale paper'. 'paper_width':10. 'tick_side':'left'.8 1.9 1. 'function':lambda u:log10(u).2 2.1 2 1. 'u_max':2.58*log10(u+0. 'title_y':-1.2 1. 'tick_levels':3.6 P 3.0.3 3. 'tick_text_levels':1.7 2.3 1.7 2. 'function':lambda u:0.7 1. 'title_x':5.5 3. 'tick_side':'left'. } main_params={ 'filename':'Type1-Example1.58}(0.9 2. 'title_box_width': 10.py ### 'title':r'$V$'.3 2. 'function':lambda u:-log10(u)+log10(0.0.5 1. 'u_max':3.4 2.1 1 2 1.0.9 2.7 1. 'f2_params':P_params. 'block_params':[block_1_params].0.1 3 2.5.9 1. 'f1_params':S_params.0.5 1.64)0.0.4 1.pdf'. 'title_str':r'$(S+0.4 1.5 2.8 2. 'title':r'$P$'. 'tick_levels':3.2 1.6 1. 'width':10. 'paper_height':10. } block_1_params={ 'block_type':'type_1'. 'tick_text_levels':1.0. 'f3_params':V_params. 'u_max':3. ('polygon'.5 1.3 1.0. } P_params={ 'u_min':1.### Type1-Example1.4 3.4 1.nomographer import * S_params={ 'u_min':1.74V) = P$' } Nomographer(main_params) V_params={ 'u_min':1.1 2 1.6 2. S 3.).74).1 1.6 1. 'title':r'$S$'.64)^{0.0. 'tick_text_levels':1.8 1.58 (0.0. } from pynomo.

0 of this manual used the main parameter line_params to draw an isopleth between to points on the nomogram.'x'.[2. say if the tick labels were overlapping.0].0 cm. although for simplicity not all the nomograms in this essay have them. or in other words they will be smaller in comparison to the overall nomogram. If we want any titles to remain large. say 20.0. to draw an isopleth between the value of 6. . zoom in to see the details of what this nomogram would look like on larger paper.Changing Relative Sizes The previous example displays nicely-sized text for the scale of the nomogram. plus another isopleth from a value of 2.3. Version 1. The title also had to be moved to the right 6cm to center it in the larger width. If you are reading this on a monitor. we would add the block parameter 'isopleth_values':[[6.0 × 10. For example. and make the scale lines thinner. Since we are scaling to the paper size. where the coordinates of the start and end were found by overlaying a grid onto the finished nomogram. circles on endpoints) as described below The isopleth_values block parameter consists of a list of scale values to cross with isopleths.0 on the third scale (f3_params). a guide to the use of the nomogram in the form of a sample isopleth or index line. The numbers and tick marks are reduced in scale. If we want smaller text or numbers. The scale values are still readable but greater accuracy is obtained with this nomogram. we can precede their text by a TeX font size macro such as \Large as described in the previous section.5 on the second scale.'x']]. we could decrease the size of these by specifying a larger paper size in the main parameters (paper_height and paper_width). the scale ticks spread out but the text and numbers stay the same size. and it is even more important today when most people.0 cm instead of 10. line width. the block size is only important in compound nomograms.8. This has always been a very common feature of nomograms. Adding Isopleths Here we also add a new feature. but the titles and overall title are increased in size to compensate by adding the \Large command to them. The more complicated nomograms we will see later really benefit from an isopleth or a picture key. Sometimes scaling up to a larger paper size also allows us to add additional tick marks in the increased spacing between the original tick marks. as the relative sizes of the individual blocks give us flexibility in shaping the interior of the nomogram. have never seen a nomogram and have no idea how to use it. where a character (or any set of characters) is used for values on scales that should be computed by PyNomo. color.0. 17 . There are variations of this format for different types of nomograms as we will see in those examples—for example.0 on the first scale in a Type 1 block (f1_params) and the value 3.1. Scaling up to larger paper sizes is particularly nice when the nomogram is printed on larger paper. compound-scale Type 3 blocks include the multiple scale values for the zigzag isopleth within one set of square brackets. even engineers.0 on the first scale through the value 8. When the nomogram is scaled to the larger paper size. the only effect is to decrease the relative size of the text and numbers. Since the output is a vector image that can be scaled to any size for display or printing. Starting with Version 1.5. the following parameters are introduced specifically for drawing isopleths: • isopleth_values: a block parameter providing the values on the scales in a block that are crossed by isopleths as described below • isopleth_params: an optional main parameter that lists characteristics of each isopleth in order of appearance in the blocks (line style. The next example is our previous example scaled to a larger paper size (but reduced here when imported to this document).0 × 20.

0 producing no circles and a default of 0. with a default of thick. with a default of dashed. consisting of a value between 0.05.0 and 1. 'color':'OrangeRed'. and the sets are listed in order within square brackets.myreckonings. • color: the color of the isopleth as listed on page 37. dotted or dashdotted as illustrated in the figure below. 'linewidth':'THick'.18 The example script on the next page shows values for all the isopleth parameters to demonstrate their use.0. Also. with 0.. However.pdf and http://www. if another set were begun and calculated (with a different character string to differentiate them). with a default of black.sourceforge. the second isopleth_params parameter would apply to this second set. e.py 18 . 'linestyle':'dashed'.g. • linewidth: the style of the isopleth.pdf 19 http://www. dashed. e.. the first isopleth_params parameter would apply to this entire set.myreckonings.. as the previous values are maintained. with a default of 0. e. • transparency: the transparency of the isopleth.g. For example.. e. This PyNomo script along with its PDF output are available online for download. consisting of solid.com/pynomo11/Type1-Isopleth.2. consisting of the values illustrated in the figure below). as shown in the next script. • circle_size: the radius in cm of circles on the isopleth where it intersects the scales. 'circle\_size':0. e.net/manual.com/pynomo11/Type1-Isopleth. Only isopleth parameters that are different from the default values need to be listed. if a compound nomogram of several blocks had one isopleth calculated through all the blocks.g. 'transparency':0.g. there is no reason to repeat the isopleth parameters if they are unchanged between isopleths.19 18 From the Pyx Reference Manual. • linestyle: the style of the isopleth. at http://pyx. page 71.The isopleth_params parameter is optionally included in the main parameters and applies the following characteristics to each isopleth calculated in order in the blocks listed in the main parameters.4.g.0. The set of characteristics for each isopleth is listed in isopleth_params within a set of braces.. The linewidth and linestyle names are provided in the figure below.

8 1. 'tick_text_levels':1.5.8 2.2 1.1 1.0.0.9 1.64). 'height':10. 'f3_params':V_params.2 2 1. 'title_x':11.58*log10(u+0.0. 'transparency':0.8 1.3 3.0.58 (0. 'u_max':2.7 1.0. }.0.1 1.64)0.8 2.5 3. 'tick_side':'left'. } V_params={ 'u_min':1.3 1.35.3 1.4 3.nomographer import * S_params={ 'u_min':1.5 1.19]].7 2.58}(0. 'title_str':r'\Large $(S+0.01).0.0. 'tick_levels':3.4 1.1 3 2. 'tick_side':'left'. } 3.9 2 1.2 2. } P_params={ 'u_min':1. 'width':10. 'title_y':-1.4 1.0.9 2. 'paper_width':20.('scale paper'. 'paper_height':20.4 2. 'circle_size':0.6 1.0. 'title_box_width': 10.6 2.2 1. 'u_max':3.7 2.'x'.6 1.0.py ### block_1_params={ 'block_type':'type_1'.2 1.0. ].8 1.74).74V) = P$'.5 1.1 2.9 2.3 3. 'u_max':3.1 1 1 (S + 0. 'tick_text_levels':1.4 1.3 1.74V ) = P 19 1 .2 3. 'function':lambda u:-log10(u)+log10(0.1 1. 'title':r'\Large $P$'.64)^{0. 'title':r'\Large $S$'.0. 'isopleth_params':[ {'color':'black'. 'tick_levels':3. } from pynomo. 'f1_params':S_params. 'linewidth':'thick'. ('polygon'.2 3. 'function':lambda u:log10(u).3 1.1 1. 'tick_text_levels':1.7 1.5 1. 'f2_params':P_params. 'tick_levels':3.0.4 2.1. } main_params={ 'filename':'Type1-Isopleth.6 2.### Type1-Isopleth. 'function':lambda u:0.pdf'. 'title':r'\Large $V$'.3 Nomographer(main_params) S P V 2 3.5 2.10.)]. 'linestyle':'dashed'. 'transformations':[('rotate'.6 2. 'block_params':[block_1_params].5 2. 'isopleth_values':[[3.9 3 2.).7 2.

myreckonings.5 and 1.64)0. We can use the same equation here as we used in the Type 1 nomogram for multiplication: (S + 0. since the outer scales are scaled to the paper size anyway.58 and f3 = 0. Originally I had f2 = (S + 0. The form of this nomogram is f1 (u1 ) = f2 (u2 )× f3 (u3 ). For this equation it appears to me that the earlier Type 1 version will provide greater practical accuracy for the user.64)0.8 Creating a Type 2 (N or Z) Nomogram Nomograms categorized as Type 2 by PyNomo are also quite common. you can see that this can be drawn as a Type 2 nomogram if f1 (P) = P f2 (V ) = 0.0 < S < 3. The PyNomo script and output PDF graphic are shown on the next page. To express the 0. The PyNomo script and output PDF graphic are available online for download.21 20 http://www.74V ) = P (1) Again we assume that the engineering ranges we are interested in are 1.com/pynomo11/Type2-Example. From the general form above.74V f3 (S) = (S + 0.64)**0.0. This is the case f1 (u1 ) = u1 .58).php/Type_2 21 http://www.org/wiki/index.74V .0 and from the equation calculate the range of P as 0.374.0 < V < 2.64. It is called an N or Z nomogram because of its shape. Here the nomogram appears the same with and without the polygon transformation.58 as a power in f3 we can write the expression as (u + 0.64)0. so again it’s a simple matter to modify this example for what we need.pdf 20 .com/pynomo11/Type2-Example.py and http://www.pynomo.986 < P < 3. Trying variations to see which works best can be done very quickly with this software. f2 (u2 ) = u2 and f3 (u3 ) = u3 . but the S scale was very short as the diagonal so I switched f2 and f3 .58 or we can use the Python math function pow(u + 0.58 The Type 2 link on the Software Documentation page of the PyNomo site20 shows an example script for this type of nomogram for the equation u1 = u2 × u3 .58 (0. although it is often expressed as a Division nomogram as in f3 (u3 ) = f1 (u1 )/ f2 (u2 ).myreckonings.

'function':lambda u:u. 'f2_params':V_params.9 2 2.4 1.5 1.1 3.8 2. } V_params={ 'u_min':1.7 2. 'u_max':3.5 . 'title_x':5. 'f3_params':S_params. 'width':10.7 1. 'title_str':r'$(S+0. 'function':lambda u:(u+0. 'block_params':[block_1_params].1 3 2. } block_1_params={ 'block_type':'type_2'. 'tick_side':'left'.74V) = P$' } Nomographer(main_params) S_params={ 'u_min':1.7 1.74V ) = P 21 1.5 2.6 1.01).0.6 2.8 1.9 1.8 1.5.0.1 2 1.6 1.5 2.64)**(0.3 1. 'paper_width':10. ('polygon'.7 1. 'tick_side':'left'.0.58).0.9 2.4 1.1 1 (S + 0. } from pynomo. 'title':r'$S$'. 'f1_params':P_params. P 3. } main_params={ 'filename':'Type2-Example. 'tick_levels':3. 'title_box_width': 10. 'tick_text_levels':1. 'u_max':3.6 1. 'tick_levels':3.4 2. 'title_y':-1.3 3.2 1. 'height':10.0.0.('scale paper'.9 3 3. 'paper_height':10.3 2.6 2.5 1. 'function':lambda u:0.). 'title':r'$V$'.0.0.1 2.2 1.986.3 3.64)^{0.py ### 'tick_levels':3.58 (0.### Type2-Example.1 V 2 1.4 2.8 1.3 2.0.nomographer import * P_params={ 'u_min':0.374.0.3 1.58}(0.74*u.)].9 1.2 3.4 3.8 2. 'u_max':2.1 1 S 1 1.5 1.64)0. 'tick_text_levels':1. 'transformations':[('rotate'.2 2.2 2. 'title':r'$P$'.2 1.7 2.3 1.pdf'.0.4 1. 'tick_text_levels':1.2 3.

then use the same R-scale to create a block for the second equation. PyNomo directly supports compound parallel lines for any number of variables. if we have f1 (u1 ) + f2 (u2 ) + f3 (u3 ) + f4 (u4 ) = 0. the number N of picture element cycles.22 The example on the next page is drawn from electro-optics.. If this parameter is omitted.pynomo. place no text between the single quotes. the lens focal length.9 Creating a Type 3 (Compound Parallel Scales) Nomogram For situations where we have the sum of more than three functions of single variables. and the resolution achieved: N × Range Resolution = Focal Length × Target Size or log (Resolution) + log (Focal Length) + log (Target Size) − log N − log (Range) = 0 The new parameters that we introduce in this example are • title_y_shift and title_x_shift: shifts in cm in a scale title for readability • text_format: we changed the number display default of 2 digits to the right of the decimal point to 0 or 1 depending on the scale • scale_type: The type of scaling (spacing) of the tick marks and labels of the scale. Remember. The nomogram ends up as two concatenated blocks. An example is provided on the Type 3 Software Documentation page. For example. automatically sizing and placing the pivot lines appropriately. To find u4 the user lays a straightedge across the scale values for u1 and u2 and marks a point on the R-scale. a default title of “R” is placed over each pivot line. The form of this equation is f1 (u1 ) + f2 (u2 ) + . Then the straightedge is placed across that mark and the scale value for u3 to find u4 . for which we will use manual scaling (see below) • reference_titles: A list of titles to place over the pivot lines. you can find any unknown variable by working from the known variables. The options are: – linear: linear scaling (the default when no scale type is specified) – log: logarithmic scaling – linear smart: linear scaling with smart tick mark spacing – log smart: logarithmic scaling with smart tick mark spacing – manual line: manual selection of tick marks – manual arrow: manual selection using tick arrows – manual point: manual selection using tick points We will see the use of smart scale types later.. a nomogram with pivot lines can be drawn. we can write this as a system of two equations f1 (u1 ) + f2 (u2 ) + R = 0 f3 (u3 ) + f4 (u4 ) − R = 0 So we can create a nomogram block for the first equation consisting of three parallel lines with no scale drawn on the R-scale. but the following example shows the use of logarithmic scaling rather than the default linear scaling for all scales except the N scale. the target size. 22 http://www. It shows the relationship for a camera system of the target range.php/Type_3 22 . For no titles at all. + fn (un ) = 0 for any number n of variables. A pivot line is a blank scale that serves as a intermediate turning point for the straightedge.org/wiki/index.

In this nomogram we also changed the overall paper size to get a nice horizontal layout of the scales.It happens here that N is an integer from 1 to 10.pdf 23 . just the points drawn. which can be very useful for special labeling.myreckonings.23 23 http://www.com/pynomo11/Type3-Example1. so we only want to have ticks for those specific values. Here we have no title for some of the points because they are so close the titles would collide. This PyNomo script and output PDF graphic are available online for download. We can limit the tick marks on a scale to a predefined list of values through the scale_type and manual_axis_data parameters. as here. The scale_type parameter can be set to manual line. In the manual_axis_data set we include a list of values to mark and a title text for each mark.com/pynomo11/Type3-Example1.py and http://www. manual arrow or manual point depending on whether we want a tick drawn.myreckonings. an arrow drawn or.

Target_Size_meters_params. } from pynomo.py ### Target_Size_meters_params={ 'u_min':0. 'paper_width':20.0:''. 'scale_type':'log'. 'block_params':[block_1_params]. } block_1_params={ 'block_type':'type_3'.1f$".0. 'scale_type':'log'. 'u_max':10. 'scale_type':'manual point'. 'scale_type':'log'. 3.4. 6. 'tick_text_levels':1. 'tick_text_levels':3. 1'. 8.4.)]. 'function':lambda u:log10(u).1f$". 'text_format':r"$%3. 'tick_levels':2.0f$". 'scale_type':'log'. 'u_max':50. 'tick_text_levels':2.4.0:'1'. 'tick_text_levels':3. 'manual_axis_data': {1. Focal_Length_mm_params.0:''.4. 'reference_titles':['Ref. 'function':lambda u:log10(u).('scale paper'. 'title':r'Target Size (m)'.0:''.0.0.0:''.0. 'text_format':r"$3. } Focal_Length_mm_params={ 'u_min':1. 'title':r'Range (m)'. Resolution_params]. } main_params={ 'filename':'Type3-Example1. 'title_y_shift':0.0f$". 'title':r'Resolution (line pairs/mm)'. 9.0. 'text_format':r"$%3.pdf'.0. 'function':lambda u:-log10(u).0. 'title_box_width': 20. 'f_params':[Range_meters_params. 'tick_side':'left'. 'title_x':10.0:'10' }. 2. 'scale_type':'log'.0. 5.0. 'tick_text_levels':2. 'text_format':r"$%3. 'title_y_shift':0. 'title_x_shift':-0.0. 'tick_side':'left'. 2']. 'u_max':40. 'scale_type':'log'.'Ref. 'title_y_shift':0. 4.0:'2'. 'tick_levels':3.Number_of_Cycles_params. 'paper_height':11. 'title':r'$N$'. 7. } Nomographer(main_params) 24 . 'width':10.nomographer import * Range_meters_params={ 'u_min':5000. 'title_y_shift':0.0. 'title_y':-1. 'tick_levels':4.0.0:'4'. 'function':lambda u:-log10(u).01). } Resolution_params={ 'u_min':1. 'transformations':[('rotate'. 'title_y_shift':0.0.0. 'text_format':r"$%3.5.0.0f$".5. 'tick_levels':2.### Type3-Example1. 'function':lambda u:log10(u).0:''.0.0:'6'. 'scale_type':'log'.4. 'u_max':1000. 'height':10.0. 'title':r'Lens Focal Length (mm)'. 'title_str':r'Resolution = (N $\times$ Range) \ / (Focal Length $\times$ Target Size)'. 'tick_levels':2. } Number_of_Cycles_params={ 'u_min':1. 'u_max':20. 10.

5 3. 1 10. 2 Resolution = (N × Range) / (Focal Length × Target Size) Ref.0 14.0 2.6 1.7 0.25 1000 100 1 5000 4000 3000 2500 1200 1400 1600 1800 2000 2 10 6 4 600 700 800 900 N 500 400 300 250 120 140 160 180 200 60 70 80 90 50 Range (m) 1 10 100 1000 2 9 8 7 6 5 4 3 20 90 80 70 60 50 40 30 200 900 800 700 600 500 400 300 Lens Focal Length (mm) Ref.0 30.0 5.0 1.9 Target Size (m) 2.8 0.0 8.0 6.0 12.2 2.0 9.0 6.4 1.0 16.0 5.0 7.0 0.0 25.0 4.0 9.0 3.0 1.0 1.0 40.5 0.0 8.0 10.0 20.0 20.8 1.6 0.0 7.0 4.0 18.0 Resolution (line pairs/mm) .

with one set of tick marks on the left side and the other on the right. Since there are 3. and width is the title box width.org/wiki/index. and width is the title box width. x and y specify the center of the title in cm from the lower left of the nomogram (y can be negative).24 The use of two aligned Type 8 scales for a Celsius/Fahrenheit temperature conversion scale is also provided as an example—a piece of it is shown on the right. range. \small in the text itself. We will also add an inch scale to the mm scale for Lens Focal Length and a feet scale to the meter scale of the Target Size. This last parameter also provides another way of specifying the text size rather than adding. \large in the text itself. text is the title (remember to add the r between the colon and the string). We make the font size of the units titles a bit smaller here by preceding the text with \small. When we align a Type 8 scale to an existing scale. There is a new align_func parameter here that provides the scaling needed in the new units to produce the same scale length 24 http://www. We will modify this script to align a Type 8 scale to this Range scale with tick marks and labels on the other side in units of feet.pynomo. The existing scale was in meters and had a minimum of 50. dx and dy specify the offsets in cm from the upper right corner of the scale. For each additional title. shifted to left to lie over the side of the scale with those tick marks. simple function scale. The new parameters that we introduce in this example are • tag: scales with the same tag are aligned (overlaid) in the final nomogram • extra_titles: additional titles to add to the scale beyond title. A single-scale example is provided on the Type 8 Software Documentation page.0m. The Lens Focal Length title is also broken into two titles to show the format of adding more than one extra title.org/wiki/index. The first is a scale from the previous example with the same title plus an extra title specifying the original units. It provides a means of aligning (or overlaying) a scale right on top of another scale. The amounts dx and dy to shift the extra titles has to be done by experimenting. For each additional title.0m and a maximum of 5000. • align_func: the function used to align a Type 8 scale with another scale with the same tag. We assign three tags to the scales.0 × 3. This is shown on the following pages. the minimum in feet must be 50. say. We will see another parameter pyx_extra_defs in the next section to specify the color of the title.28. This is useful if a scale in the nomogram is to be marked in two different units.0 × 3. we have to specify the scale function and the minimum and maximum values that will provide a correct alignment. Two scales are given each tag. as described below • extra_texts: additional titles to add to the overall nomogram.28 feet in a meter. The second scale with the same tag is an aligned Type 8 scale with the tick marks and labels on the other side and its title (giving the other units) shifted right to lie over those tick marks.25 In our previous electro-optics nomogram the Range scale was in meters. focal and size.28 and the maximum must be 5000.php/Temperature_converter 26 . Let’s look at the Range scale.10 Creating a Type 8 (Single Scale) Nomogram A Type 8 nomogram is a single.pynomo. say. We will see another parameter pyx_extra_defs in the next section to specify the color of the title. This last parameter also provides another way of specifying the text size rather than adding. text is the title (remember to add the r between the colon and the string).php/Type_8 25 http://www.

'text_format':r"$3. 9.pdf 27 . 'scale_type':'log'.0:'2'. 'width':5.myreckonings. 'scale_type':'manual point'. 10. Instead of the single-line nomogram title in the previous section.26 ### Type3-DualScale. } Target_Size_meters_params={ 'tag':'size'.0. 5. 'u_min':0.28 so that the overall length of the scale is the same. 'tick_side':'left'. }. 'tick_levels':2. 'text_format':r"$%3.myreckonings. 'width':5.8. }] } 26 http://www. 4. }] } from pynomo.0:'10' }.0:'4'. 'width':5.0.2. 'tick_levels':2.1f$".0:'6'. the number of dashes should not be 1 more than a multiple of 3. 'text':'Focal Length'. 'title_y_shift':1. 'tick_side':'left'. 'dy':0. 'scale_type':'log'.8. 'extra_titles':[ {'dx':-1.4.com/pynomo11/Type3-DualScale.25. 'title':r'Target Size'. 'u_max':1000. 3. A backslash \ is used after “Resolution =” to indicate that the title text continues on the next script line. In this example the align function should be u/3. 'dy':0. 'extra_titles':[ {'dx':-1. 'function':lambda u:-log10(u). 7. 'text_format':r"$%3. 'tick_levels':2. 'function':lambda u:log10(u).0:''.0. 'function':lambda u:log10(u). 'u_min':5000.0:''. This PyNomo script and output PDF graphic are available online for download. 6. this example shows the equation as a fraction.0. 'dy':0. 'title':r'$N$'.25. and that a calculated value (denoted by ’x’) is required for each overlaid Type 8 scale.0. 'u_max':20.0f$".8. }] } Number_of_Cycles_params={ 'u_min':1. 'title_y_shift':0. so to prevent an odd-looking extra dash at the end of the line.0f$". 'extra_titles':[ {'dx':-1. 'u_max':10. 'title':r'Range'.5.0. Notice that the isopleth_values parameter for the Type 3 block includes all the intersected scale values within a single set of square brackets.com/pynomo11/Type3-DualScale. 'function':lambda u:-log10(u). TeX assumes that two or three dashes are single longer dashes (endashes or emdashes). where the dividing line is simulated with a string of connected dashes.py ### Focal_Length_mm_params={ 'tag':'focal'. 'u_min':1.25.py and http://www. 'title_y_shift':0. 'manual_axis_data': {1.0:''.75.25. 'dy':0. 'tick_levels':4. Here we also set the titles above the pivot lines to blanks in the reference_titles parameter in block_1_params.0:''. 'text':r'\small $m$'. 'text':r'\small $m$'. 2. 'tick_text_levels':2. 'tick_text_levels':2. 'width':5. 'text_format':r"$%3.as the original one. 8.4. 'u_max':50. 'tick_text_levels':1.nomographer import * Range_meters_params={ 'tag':'range'. 'title':r'Lens'.0:'1'.25.0.0:''. 'scale_type':'log'. 'scale_type':'log'. 'text':r'\small $mm$'.0f$". {'dx':-1. 'tick_text_levels':3. 'title_y_shift':0.

block_4_params].2.0.2f$". }. block_1_params={ 'tick_side':'right'. 'scale_type':'log'. 'title_y':-1.0. 'y':-1. 'align_func':lambda u:u*25. 'block_type':'type_8'. 'u_min':1. 'function':lambda u:log10(u). 'transparency':0. 'title':r'\small $ft$'.5. 'isopleth_values':[['x']].281. 'tag':'resolution'. } ### TYPE 8 SINGLE-SCALE BLOCK ### Focal_Length_inches_params={ 'tag':'focal'.0.28.01). 'tick_levels':3. }] 'align_func':lambda u:u/3.28. {'x':8. block_3_params. 'circle_size':0.0f$". ].0*3. } block_2_params={ 'block_type':'type_8'. 'reference_titles':[''. 'block_type':'type_8'. 'linestyle':'dashed'.5. 'scale_type':'log'. 'isopleth_values':[['x']]. 'title':r'\small $in$'. 'u_min':0. }].0/25. } ### TYPE 8 SINGLE-SCALE BLOCK ### Range_feet_params={ 'tag':'range'.'x'. 'text':r'\small $(line \enspace pairs/mm)$'.281.05. 'dy':0. 'title_box_width': 20. Target_Size_feet_params={ 'extra_titles':[ 'tag':'size'. 'paper_height':11. 'width':7.4. 'height':10.5*3. 'isopleth_values':[[300. 'title_x_shift':0. } 'f_params':[Range_meters_params. 'block_type':'type_3'.''].0*3. 'f_params':Target_Size_feet_params.('scale paper'. } } main_params={ 'filename':'Type3-DualScale.40.35. 'linewidth':'thin'.0. 'u_max':20. ### TYPE 8 SINGLE-SCALE BLOCK ### 'tick_text_levels':3. 'isopleth_values':[['x']]. 'paper_width':20. 'block_params':[block_1_params. 'tick_text_levels':2.0*3. Target_Size_meters_params.block_2_params.0. 'tick_levels':4.85. block_3_params={ 'function':lambda u:log10(u). 'extra_texts':[ {'x':9.0.28.0.)].0. 'align_func':lambda u:u/3. 'title_x_shift':0.0/25. block_4_params={ Focal_Length_mm_params. 'scale_type':'log'.Resolution_params={ 'tick_levels':2.0f$". 'width':5. 'tick_side':'left'. 'tick_text_levels':2. 'title_str':r'\large Resolution =\ ---------------------------------------'. 'text':r'\large $N$ $\times$ Range'. 'function':lambda u:-log10(u). 'text_format':r"$%3. Nomographer(main_params) 28 . Number_of_Cycles_params. 'function':lambda u:log10(u). 'title_x':10. 'f_params':Range_feet_params.4. 'u_min':1000. 'transformations':[('rotate'. 'tick_side':'left'. } 'text_format':r"$%3.10]].281. 'tick_levels':2.8. 'u_max':50. 'y':-1. } 'title':r'\small $ft$'. 'isopleth_params':[ {'color':'Gray'. 'width':10. 'width':5. 'u_max':1.0.1f$". 'f_params':Focal_Length_inches_params.1. 'u_min':5000. 'text_format':r"$%3. 'scale_type':'log'.2. 'title_x_shift':0. 'title_y_shift':0.4.0.pdf'. }. Resolution_params]. } 'u_max':40.4. 'text_format':r"$%3.25.0.4. 'tick_text_levels':3. 'title':r'Resolution'. {'dx':-2. 'text':r'\large Focal Length $\times$ Target Size'.

0 10.04 0.4 1.00 in 0.8 0.0 16.00 20.80 0.0 5.0 12.6 1.08 0.10 1.0 7.0 30.05 0.0 14.60 0.0 8.00 30.00 6.00 7.00 N × Range Resolution = ————————————— Focal Length × Target Size 1 10 100 1000 Lens Focal Length 10.50 0.30 2.0 4.0 2.0 9.0 (line pairs/mm) Resolution .0 1.9 m 30 40 50 60 20 3 4 5 6 7 8 9 2 ft Target Size 10 2.00 9.07 0.0 1.00 3.0 18.20 0.0 25.0 8.0 3.29 1000 100 5000 4000 3000 2500 1200 1400 1600 1800 2000 600 700 800 900 500 400 300 250 120 140 160 180 200 60 70 80 90 50 12000 14000 16000 6000 7000 8000 9000 5000 4000 3000 2500 1200 1400 1600 1800 2000 600 700 800 900 500 400 300 250 180 200 ft Range m 10000 1000 N 1 2 10 6 4 2 9 8 7 6 5 4 3 20 90 80 70 60 50 40 30 200 900 800 700 600 500 400 300 mm 0.6 0.0 9.00 4.0 1.40 0.5 3.2 2.00 10.0 40.0 7.90 0.00 5.0 6.0 5.06 0.5 0.0 6.0 20.00 8.8 1.7 0.0 4.0 20.09 0.0 0.70 0.

By using the same radius but with the ticks on the opposite side we can overlay two scales. The function_x and function_y parameters allow the scale curvature to be defined by functions of u in terms of x and y.0-1. which made it easy to write the script. The example √ √ on the next page has a scale for N for a radial pointer to be placed on. Since u/10. 1/N . The size and orientation of the labels also dictate the minimum spacing between scales and therefore the overall size of the nomogram. 'function_y':lambda u:7. This is important only for curved scales as in this example. All the scales repeat the same basic set of parameters. Just for fun. we would write 'function_x':lambda u:7. the square root of 223 can be found by moving the decimal point two places to the left to get 2. for example. Very complicated engineering formulas can be laid out on such a circular scale.0 to 10.0*sin(2*pi*u/(10. the calculation can be completed.0*cos(2*pi*u/(10. (False by default) • base_start and base_stop: if present. let’s create a set of circular scales that can be used as a dial face pasted behind a knob from which a clear plastic overlay is attached with a pointer line inscribed.0cm. useful for logarithmic scales. and the decimal point can be moved right by one place to get 14. By setting these to a smaller range than provided for u. use this minimum and maximum value rather than u_min and u_max to determine the settings of the tick_levels. where if we did not set this value to True the side that the ticks is drawn on would change as the scale curved left or right. The carriage return in the overall nomogram title in this example is forced by the width in cm of the text_box_width parameter rather than using \par or separating it into two texts with the extra_texts parameter as we did in the previous example.9 as the answer. N 3 . can produce finer spacing than would otherwise be possible.23. so if N lies outside this range the decimal point can be moved to place it in this range.0 to be laid out in a circle of radius 7. 30 . The accuracy can be vastly improved by printing this on a large sheet of paper—zoom in to see what it would look like. or simply tacked in the center to a bulletin board with a thread tied to the pin of the tack. the area and volume of a circle of radius N.0).0 is u divided by the overall range of u. and then the decimal point can them be moved back appropriately. N. Many of the tick marks in this nomogram are a bit small to read very well.49. For example.0).0-1. but I had to test it a number of times to get the x and y offsets for the scale titles just right to fit in the available openings. the square root can be found as 1. or a complete circle in radians. if we want a linear scale from 1. The new parameters that we introduce in this example are • function_x: a function that provides the x coordinate of a particular value of u along the scale • function_y: a function that provides the y coordinate of a particular value of u along the scale • turn_relative: if True. then 2 × π × u/(10. The N scale ranges from 1 to 10 here. finer tick levels occur and setting tick_level to 1. We will see how to adjust all of these when we return to this circular dial in color form in the next section.0−1.0 − 1. N 2 .0) will range from 0 to 2π. and the radius of a circle with an area or volume N. For example.It’s also possible with Type 8 to create a curved set of scales for dial faces or for scales to be used in making a circular slide rule. Then the other scales provide 3 N. determine the left/right side of the scale for the tick_side parameter by the progression of values along the scale rather than the left/right side of the page.

35. } N_params={ 'u_min':1. 'base_start':1. 'base_start':1.1623. 'height':15.0. 'title':r'\Large $N^{1/3}$'.0))/ (log10(2.pdf 31 .nomographer import * CenterHole_params={ 'u_min':0. } from pynomo. 'tick_levels':5. } Square_Root_block_params={ 'block_type':'type_8'. 'title':r'\huge $N$'.15.0.0. 'function_x':lambda u: 7. 'function_y':lambda u:0.35. 'turn_relative':True.05.0*sin(-2*pi*(log10(u)-log10(0.0. 'base_start':1.0*cos(2*pi*(log10(u)-log10(1.0.0.0*sin(2*pi*(log10(u)-log10(1. 'turn_relative':True. 'tick_side':'left'.0. 'title_y_shift':0. 'title':r''.0. 'scale_type':'linear smart'.0.0.0*cos(-2*pi*(log10(u)-log10(0.0*cos(2*pi*log10(u)/log10(10.0*sin(2*pi*(log10(u)-log10(1.1544)-log10(1. 'height':15. 'u_max':2.0*sin(2*pi*log10(u)/log10(10. 'u_max':9. 'function_x':lambda u: 7.0.0)).0))). } Inverse_N_params={ 'u_min':0.1))). } CenterHole_block_params={ 'block_type':'type_8'. 'width':15. N_block_params={ 'block_type':'type_8'. 'f_params':Square_Root_params. 'f_params':N_params. 'title':r'\LARGE $1/N$'. 'base_stop':1.myreckonings. 'function_x':lambda u:0.0))). 'height':15.9999.0. 'function_x':lambda u: 3.9999.1))/ (log10(1.05*sin(2*pi*u). 'f_params':Inverse_N_params. 'title_x_shift':-0. 'width':15. 'base_start':0. } 27 http://www. 'function_y':lambda u: 3.0)-log10(0. 'tick_levels':0. 'u_max':1.com/pynomo11/Type8-Dial-Smart. 'width':15.1))/ (log10(1. 'tick_levels':5. 'title':r'\Large $\sqrt{N}$'. 'height':15.0))).80. } Inverse_N_block_params={ 'block_type':'type_8'. 'scale_type':'log smart'.0.This PyNomo script and output PDF graphic are available online for download.0.0.05*cos(2*pi*u).0))/ (log10(2.myreckonings.1544)-log10(1.2. 'tick_text_levels':0. 'function_y':lambda u: 7.0. 'scale_type':'log smart'.0*cos(2*pi*(log10(u)-log10(1.27 ### Type8-Dial-Smart. } Square_Root_params={ 'u_min':1. 'tick_text_levels':5. 'scale_type':'linear smart'.0. 'function_x':lambda u: 3. 'title_y_shift':0.0. 'u_max':1. 'title_x_shift':-0. 'height':15.1. 'tick_text_levels':5.com/pynomo11/Type8-Dial-Smart.0. 'base_stop':10. 'turn_relative':True. 'function_y':lambda u: 7.09. 'tick_levels':5.0)-log10(0.py ### 'tick_text_levels':5. 'title_y_shift':-1. 'title_y_shift':-1.1623)-log10(1.1))). 'base_stop':9.0))/ (log10(3.0))/ (log10(3.0. 'f_params':CenterHole_params. 'title_x_shift':-0.1623)-log10(1. 'title_x_shift':-0. } Cube_Root_block_params={ 'block_type':'type_8'.101. 'u_max':3. 'tick_text_levels':5.0.8. 'width':15.1. } Cube_Root_params={ 'u_min':1. 'f_params':Cube_Root_params.0))). 'function_y':lambda u: 3. 'base_stop':10.0)). 'width':15.py and http://www.0. 'turn_relative':True. 'tick_levels':5.

'height':15.0.0. 'u_max':314.14159))/ (log10(314.14159.1888.0*sin(2*pi*(log10(u)-log10(1.7841.0)-log10(1. 'tick_levels':5.0*cos(-2*pi*(log10(u)-log10(0.0)-log10(1. } Square_block_params={ 'block_type':'type_8'. 'base_stop':1.0*cos(-2*pi*(log10(u)-log10(0. 'u_max':999.0))/ (log10(100. 'function_x':lambda u: 11. 'title_x_shift':-0. 32 . 'height':15. } Area_params={ 'u_min':3.0)-log10(1. 'scale_type':'linear smart'.159)-log10(3. 'tick_side':'left'.15.0.0*cos(2*pi*(log10(u)-log10(3. 'width':15.0. 'turn_relative':True.62035))).159)-log10(3.7841)-log10(0. 'function_x':lambda u: 11. 'u_max':1.15. 'height':15.14159))). 'f_params':Inverse_Area_params.0. 'title':r'\Large $R \Rightarrow Area$'. 'u_max':1.14159))). 'title_x_shift':-0. 'function_y':lambda u: 11. } Inverse_Volume_params={ 'u_min':0.0. 'base_stop':1. 'title_x_shift':-0. 'base_start':3. 'base_start':1. 'tick_levels':5.0))/ (log10(1000.0. 'scale_type':'linear smart'. 'tick_text_levels':5. 'base_start':0. 'base_stop':1000. 'tick_levels':5. 'height':15. 'f_params':Inverse_Volume_params.3365.5642.0. 'turn_relative':True. 'scale_type':'log smart'. 'title_y_shift':-1.0. 'u_max':4188. 'title_x_shift':2. 'base_start':1.62035))/ (log10(1. 'function_y':lambda u: 11. 'base_stop':314.999.0*sin(2*pi*(log10(u)-log10(3.5642))).0))). 'title':r'\Large $Area N \Rightarrow R$'. 'title_x_shift':0. 'width':15. 'scale_type':'linear smart'.999. 'function_x':lambda u: 19.0))/ (log10(1000.0.0.2.2.9.0*sin(2*pi*(log10(u)-log10(1.14159))/ (log10(314. } Inverse_Area_block_params={ 'block_type':'type_8'. 'title_y_shift':0.0.15.3365)-log10(0. } Inverse_Area_params={ 'u_min':0.5642.0.0))).5642))/ (log10(1. 'function_x':lambda u: 15. 'title_y_shift':-1.0))).4. } Cube_params={ 'u_min':1.1. 'title':r'\LARGE $N^3$'. 'turn_relative':True.62035.0.0*cos(2*pi*(log10(u)-log10(1. 'base_stop':100. 'title':r'\Large $Volume N \Rightarrow R$'.14159. 'f_params':Cube_params.Square_params={ 'u_min':1. 'f_params':Square_params.8.5642))). 'function_x':lambda u: 15. 'base_start':0.0. 'width':15. 'tick_levels':5. 'f_params':Area_params.0. 'height':15.3365)-log10(0. 'function_y':lambda u: 15. 'tick_levels':5.0*cos(2*pi*(log10(u)-log10(1. 'title_y_shift':0. 'width':15.0))). 'function_y':lambda u: 15. 'u_max':99.0)-log10(1.62035))).0*sin(-2*pi*(log10(u)-log10(0. 'tick_text_levels':5.5642))/ (log10(1. } Area_block_params={ 'block_type':'type_8'. 'title_y_shift':-1. 'turn_relative':True.7841.0.0*sin(-2*pi*(log10(u)-log10(0. 'base_start':1.0. 'tick_text_levels':5.8. 'title':r'\LARGE $N^2$'. } Cube_block_params={ 'block_type':'type_8'.62035))/ (log10(1. 'turn_relative':True.3.75. 'tick_text_levels':5. 'function_y':lambda u: 19. 'width':15.7841)-log10(0. Inverse_Volume_block_params={ 'block_type':'type_8'.5.0. } 'tick_text_levels':5. } Volume_params={ 'u_min':4.0))/ (log10(100. 'scale_type':'log smart'.

'block_params':[CenterHole_block_params. 'title':r'\Large $R \Rightarrow Volume$'. Inverse_N_block_params.1888))/ (log10(4188.)].Square_Root_block_params.8)-log10(4.8)-log10(4. 'title_y': 1.0.0. 'tick_levels':5.1888))/ (log10(4188. 'title_box_width': 6. } } main_params={ 'filename':'Type8-Dial-Example-Smart.Volume_block_params.Cube_block_params. 'transformations':[('rotate'. Nomographer(main_params) 33 .1888))). 'paper_height':30. 'paper_width':30. Roots and Circle Formulas'.01). 'title_y_shift':1.0*cos(2*pi*(log10(u)-log10(4. 'function_x':lambda u: 19.'base_stop':1000. 'title_str':r'\huge Powers. Square_block_params.1888))).0.0.8.].0. 'f_params':Volume_params.N_block_params.0*sin(2*pi*(log10(u)-log10(4. Inverse_Volume_block_params. 'height':15.pdf'. 'width':15. Cube_Root_block_params. Inverse_Area_block_params. 'tick_text_levels':5.5.Area_block_params. 'title_x': 2.('scale paper'. } Volume_block_params={ 'block_type':'type_8'. 'scale_type':'log smart'.5.0. 'title_x_shift':3. 'turn_relative':True. 'function_y':lambda u: 19.

3 2. 23 0. 85 5 85 0.5 28 15 2.745 42 1 0.2 5 3 1.5 2.735 0. 50 13 00 14 13 110 1000 850 900 750 800 950 0 105 50 11 5 0 6 0.95 5 1.2 3. 2.77 600 0.15 14 . 2 25 1.5 165 10.75 1.7 115 100 44 35 56 0 40 0.1 1.6 1.5 23 22.5 5.5 5 2.3 5. 1 0. 2 3 2.03 29 5 11 28. 69 0.8 1.35 5. 1 1.5 110 115 . 1 5.4 1. 2 9 1.98 1.45 41 9.5 2 1.7 8 510 520 530 540 550 0 500 0. 55 2 2.5 19 19 .6 5 20 0 19 18 18 85 6 0. 79 5 0 0 45 50 0 50 14 00 15 00 00 12 50 12 46 15 0 0 16 95 50 16 00 17 0 5 17 00 3300 0.7 0.1 1 9 4.7 0 0.35 1.6 1. 35 40 0. 19 8.4 47 0.3 1. 82 1.31 . 15 1 1. 57 1. 22 1. 84 0.65 1. 59 1. .2 0.1 4.32 7.895 155 7 1 33 0.09 1.6 0.19 5 0.97 36 0. 9 2.5 0. 47 1. 4 63 4.4 4. 87 52 0.12 20 23.5 20 1. 0 22 2 2.5 22 9.5 27 0.93 5 5 19 1.2 1/N 1. 5 62 4.5 75 1. 27 0 8 2 83 0 0.5 5 1. 6 0.2 5 1 0.7 3.74 800 80 8 . 23 5 23 . 1 1.4 5 4. 5 44 91 0.0 7 25 1. 7 1.585 0. 75 6 0. 5 1.54 0.4 4 2.7 0.5 2. 26 0 5 27 5 83 0.2 8 0. 5 0.78 5 85 0.85 1. 2 90 0. 175 1. 0. 2 47 75 0. 68 0 16 05 7 0.4 2.78 0.59 0 4. 65 0.5 1. 0 66 24 0 5 24 0 0 0. 145 1.5 27 27. 81 14 0. 0.8 0 2 9 1.5 .5 0.56 0.7 2 0. 75 9 23 1.5 8 1.9 1 5 05 2. 52 1. 5 35 36 37 38 180 190 200 0.9 3.57 0. 22 5 90 95 0 10 0.5 14 13 11 .2 7 0. 1. 9 5.59 0. 46 0. 5 7.9 41 3 0.625 270 255 4000 290 275 265 245 0. 3 6.5 .5 1. 7 0. 12 0. 15 0.6 1. 45 1. 51 6 1.8 1.11 2. 21 0.9 1.1 5 16 15 .88 170 .05 65 4.5 10 0. 67 0. 5 1. 1 22 10 5 0.5 3. 14 125 0 20 35 45 65 6 0.975 10 29 30 N 13 3 1. 97 75 12. 5 88 0.71 0. 7 2.5 12 45 45 0.75 0.95 5 85 0.735 0.35 1 3 6 7 26 1.2 05 4.95 9 28 N 3 N2 0.1 0. .5 . 85 6 0.005 31. 83 5 0.31 3. 9 2. 16 1. 1. 5 6. 5 9.6 0.1 55 0.91 . 55 2 8 .1 2 5 24 0.8 3. 31 95 1.74 0.8 19 5 17 5 140 0 0 0 15 5 130 120 0 18 3400 280 0 27 50 27 00 0.5 145 12 0. 13 0.72 0.8 5 20 12.2 5 26 0.25 0.2 3.08 0 44 0. 8 5.4 1. 98 0. 7 6 1 .7 5.32 3.3 310 285 0. 0.5 5 11 1.175 39 1.8 6 5 8.53 0. 64 260 220 21 25 3600 3500 0. 99 5 R ⇒ V olume 0 . 82 0.4 2 1.65 1.95 39 0.77 5 10 6 1.2 65 1.3 5 1.1 5 1.5 0.78 0.775 0.635 250 230 22 5 50 19 50 00 0 3900 3800 3700 0. 43 0.5 1. 17 0. 1.58 0.5 17 18 20 5 80 R ⇒ Area 17 0.1 1. 55 70 1 V olumeN ⇒ R 04 1.29 85 0.92 135 .3 3.5 12 1. 49 0 30 0. 8 4.5 1.76 10 . 25 5 5 2 0 84 26 5 0.5 13 .8 1 0.6 1.5 35 0.8 5 5. 7 1. 6 2.5 1.0 .915 130 . 55 41 2. 1.575 0. 35 1.6 0. 29 5 4. 1 2. 5 8.5 1.4 1.75 3.5 25 5.7 5.9 6 90 .28 5 1.1 1.29 5 1.6 1 6.72 950 5.5 65 24 11 10.5 15 16 60 2 4.73 90 5 7 2.6 1.01 31 14 6 17 21 1.5 11.2 5 7. 6 4.2 0. 23 0 66 5 5 23 0 00 22 50 22 0. 5 .5 .75 34 0.2 0.2 13 45 1. 5 6 90 4 0.0 5 1.34 9.33 3.37 1.6 0 4.0 5 24 8 1. 4 0.8 1. 5.025 29.5 31 0. 54 35 0 1.99 34 0.8 1.0 5 1.5 13 14 14 01 1.36 1.3 1.57 0.31 2 Powers.8 05 0. 5 0.015 30.35 2. 36 0.05 5 26.0 6 26 1. 4 1 55 0.93 0. 89 0.2 5. 6 61 4.8 38 1.15 750 70 8 6 0.5 . 1.7 5. 37 3 1.1 700 4. 1 1.89 10 160 5 0.5 8 9 1.5 1. 87 53 0.7 2.2 4 8 95 0. 25 2. 2. 55 0.6 5.13 19 18. 8.3 4. 9 95 1.4 4 1.9 2. 5 2.5 0.6 1.7 9 0. 38 2. 0 23 5 85 23 0. 9 1 1.6 5 1.7 0.4 33 7 0 6 6. 22 0. 84 5 0.7 3.2 .5 75 80 85 0.185 5.1 5. 5 1.9 1.1 12 .5 1.5 7 1. 2 2 1. 35 20 1 1. 0 30 57 55 50 0.27 7 1.3 1.9 9 1.8 190 5 40 5 185 40 √ N 1. 09 1.2 1.6 2 1.77 0. 52 53 65 29 33 32 31 34 36 35 39 38 37 40 42 43 44 45 02 1.3 2. 3 .9 150 . 15 0. 0.5 95 4.2 2.88 180 11 0.04 1.7 5 2.5 21.2 23 1.9 0.8 4.71 1 85 1.05 0.755 95 0.38 5 4.1 1.6 5 1. 80 5 1. 1 2.4 1. 7 4.1 8 24 1.74 0.5 0.2 0. 7 20 . 1.85 0.6 1.55 0.19 5 5. 5 20 18 18 .11 10 1.5 120 1. 1 1. 99 0. 2 7.1 3.9 4 0.4 3 1.755 700 0. 58 1. 68 0.17 0.7 0.0 6 1.7 9 75 0. 4 6.5 24 5 0 10 11 0. 6 2.75 5. 21 1 5 1. 65 39 2. 0 24 5 5 24 84 0 0. 16 1. 62 0. 0 21 5 9.33 3.5 1.28 4.5 16 22 1.5 1 1. 0.9 0 6 2.5 1.745 48 0.3 5 2.2 850 9 0. 53 1.04 5 1.4 5. 1 1. 63 0.8 5 0. 14 25 25.985 35 0. 5 1.0 5 9 23 1.0 0.7 9 0 49 2.565 50 45 250 60 65 0 0 27 260 28 5 1. 15 2 1.8 0. 6 0 17 5 65 2.3 3. 8 2. 8 1 1.5 19 . 23 5 0. 15 55 24. 88 51 5 0.4 1. 4 2.9 5 95 100 16 22 5 15 15 5 0.2 5 5 1. 0.9 42 25 0. 98 30 1.9 4. 67 00 21 50 21 00 20 50 20 5 65 21 5 19 55 6 0.18 0.73 2 0.5 0. 4.5 1. 3 5 9 3.6 4 5 300 0 290 0.3 2.7 3. 6 5 0.1 0 .95 0 3.5 16.16 40 0 1.5 2. 47 1.995 140 2.9 9 200 5 195 12 1.8 1. 5 5. 35 1.5 1.3 5 7 2.295 0. 2 5.105 1 . 8 5 2.05 2.6 0. 69 0.7 8 5 0.5 5 0.76 60 0 60 6.1 1 1.5 2. 3 4.5 13 14 19 1.765 650 0. 17 5 1.2 4 1. 21 6.2 6 1. 18 12 1.9 3 3.0 .925 1.3 0.2 5 7 0.2 7 3.8 0.8 1. 05 2 1. 96 . 24 0.5 1.72 0.9 5 18 1. 50 9 0.765 0.2 5 1.77 0 5 44 43 42 41 5 0.4 11. 5 86 0.63 280 240 235 0.5 13 50 48 2. 3 5.5 26 26. 25 1.02 30 125 15 15 18 1.75 6 32 33 34 0 1. 5 21 4 4. 6 0. 49 1.7 0.76 0.5 21 20.1 13 0.3 1. N 1/3 3 2.5 2 25 35 2.5 1.4 45 1. 82 5 1.5 1 . 0 1.4 2. 135 5 110 43 0 5 5 1 0. 5 0 16 61 62 63 0 18 0 15 0 . 81 1.5 0. 21 5 21 .5 17 0.2 4.35 1.7 1. 6 45 0 0 58 0 29 59 5 0. 54 3.3 6 9 1.07 6 1.8 15 0.45 1.7 0.6 4.96 38 11 175 3. 48 1. 6 4100 300 295 0.58 55 4.3 4. 15 1. 22 5 0.5 1.5 1.5 45 34 1. 4 5.8 3. 4 4. Roots and Circle Formulas 3. 8 1. 1 2.6 3. 42 2. 8 1. 1 2 1. 6 3.33 1.0 65 25.4 8 0.9 43 92 0.4 900 75 7 240 210 220 230 105 0 45 39 0.39 7 1. 46 47 48 49 5 50 1 60 0. 56 1.51 32 0 1.5 1. 1 4.28 1.9 1. 83 64 70 0. 3 1. 2 6.1 5 28 0.96 37 5 0. 46 5 1. 7. 4 2. 97 85 16 5 0.0 41 03 1. 85 1 1.9 4 105 19 23 0. 5 0 . 86 0. 45 24 25 26 32 6.6 26 55 50 26 00 25 50 25 0.32 3.2 0.5 305 0. 8 86 0.5 0. 54 0. 5 91 4 0.64 3200 3100 0.3 35 5 0.94 0.14 17 19.5 1.4 30 160 28 29 170 130 135 140 145 5 11 120 125 150 155 25 26 27 22 . 66 0.7 71 0.6 1 15 0.4 8 0. 15 1 1.035 27 27. 1. 7 1.5 18 17. 25 2 1. 1 64 4. 14 1 1.25 5 1.73 0.2 1. 4 1. 65 1.79 80 0. 2 1 21 .1 5.905 AreaN ⇒ R 12 23 0.34 1. 6 1.52 0. 1 0. 82 5 0.5 16 17 70 5 89 0.5 1.0 24.

lines. I think that adding color to nomograms is one way of lifting these graphical calculators from their dry. colorful infographics. Scale parameters specifying color are: • axis_color: the color of the axis (scale line) and tick marks in scale parameters • text_color: the color of the numbers in scale parameters • title_color: the color of the main scale title • pyx_extra_defs: the text color in extra_titles in scale parameters • arrow_color: the color of arrows in a manual arrow scale type • reference_color: the color of the pivot lines and their titles in a Type 3 nomogram • u_line_color: The color of the u-scale lines in a grid in a Type 9 Determinant nomogram • u_text_color: The color of the u-scale labels of a grid in a Type 9 Determinant nomogram • v_line_color: The color of the v-scale lines of a grid in a Type 9 Determinant nomogram • v_text_color: The color of the v-scale labels of a grid in a Type 9 Determinant nomogram Block parameters specifying color are: • reference_color: the color of the diagonal reference line of a Type 4 Proportion nomogram • ladder_color: the color of the ladder lines of a Type 6 Ladder nomogram • u_axis_color: The color of the u-scale axis in a Type 5 Contour block • u_title_color: The color of the title text of the u-scale in a Type 5 Contour block • u_text_color: The color of the u-scale labels in a Type 5 Contour block • v_axis_color: The color of the v-scale family of curves in a Type 5 Contour block • v_title_color: The color of the title text of the v-scale in a Type 5 Contour block • v_text_color: The color of the v-scale labels in a Type 5 Contour block • wd_axis_color: The color of the wd-scale axis in a Type 5 Contour block • wd_title_color: The color of the title text of the wd-scale in a Type 5 Contour block • wd_text_color: The color of the wd-scale labels in a Type 5 Contour block Main parameters specifying color are: • title_color: the color of the main nomogram title • pyx_extra_defs: the text color in extra_texts in the main parameters • color: the color of an isopleth in the isopleth_params parameter. 28 http://myreckonings. In this age when people are used to splashy. as in Dandelion. and I made it. the name of the color is directly used.11 Introducing Color I think I have only ever seen a color nomogram once. with a default of black (note that unlike the other parameters listed here.28 But the most recent version of PyNomo supports color for scale axes. pivot lines and arrows.com/wordpress/2008/02/24/a-zoomorphic-nomogram/ 35 . labels. retro look to something that seems relevant and interesting today. titles.

calories or social statistics. The nomogram doesn’t exactly have a pleasing mix of colors (the blue and green are supposed to indicate metric vs. so it doesn’t benefit much from a color design as.0. which can specify new values for all scale parameters except function and title.com/pynomo11/Type3-Color.30 29 From the Pyx Reference Manual. precedes the selected color.cmyk(0. or to add tick marks or arrows to specific values along the scale.0.8. It’s also a dry engineering formula in electro-optics. say.py and http://www. English scales).com/pynomo11/Type3-Color.gray(0. say. The PyNomo script and output PDF graphic for the color Type 3 nomogram are available online for download. An example of a nomogram with color is a version of the Type 3 nomogram shown on the pages following the color palette. The scale parameter extra_params is used to place the arrows: • extra_params: one or more additional sets of values to plot along a scale.rgb.0 to 1. \small.net/manual.sourceforge.• circle_color: the color of circles at the starting and ending points of line segments in the line_params parameter.3) or color. useful to plot individual ranges.black) unless specified differently. The scale_type parameter has a new value manual arrow introduced here in order to show how the texts and colors are set for arrows. The one exception to this color naming convention is the color parameter within isopleth_params.pdf 36 . Also shown here is another way to size text in extra titles—rather than precede the text with. page 69. lighter nomograms on exercise time vs.rgb. as in color.29 It’s possible to specify the fraction (0.1). which is done in the next example for the pivot lines.BurntOrange or color. but it’s just a demonstration of how different colors are applied. The default color for all items is black (color.blue.myreckonings. This is how I specified the very light red for the titles in the next example.0.0. as in GreenYellow.8) for 80% white (20% black). green and blue as in color. as for example color.myreckonings.0.rgb(0.0. where color. you can specify the text size in the pyx_extra_defs parameter as text.pdf 30 http://www. so all PyNomo scripts are backward-compatible.0.small instead. at http://pyx.cmyk.size. which directly uses the color name with no prefix. You can also specify a shade of gray. with a default of black • (the color of the line segments in the line_params parameter is specified as part of the line_style subparameter) On the next page is the available color palette.0) of red.5.9. to increase tick levels in a particular range of a scale.

red cmyk.Green cmyk.Yellow cmyk.Gray cmyk.Orange cmyk.Tan cmyk.Brown cmyk.RedViolet cmyk.YellowGreen cmyk.LimeGreen cmyk.white cmyk.Thistle cmyk.SeaGreen cmyk.RedOrange cmyk.Aquamarine rgb.Cerulean grey.Magenta cmyk.Goldenrod cmyk.Peach cmyk.BrickRed cmyk.SkyBlue rgb.CarnationPink cmyk.BurntOrange cmyk.blue cmyk.ForestGreen cmyk.Maroon cmyk.black cmyk.Black cmyk.white cmyk.NavyBlue cmyk.CornflowerBlue cmyk.Turquoise rgb.WildStrawberry cmyk.DarkOrchid cmyk.Bittersweet cmyk.black cmyk.APPENDIX A Named colors grey.Violet cmyk.OrangeRed cmyk.Mulberry cmyk.Salmon cmyk.Rhodamine cmyk.Dandelion cmyk.TealBlue rgb.YellowOrange cmyk.Apricot cmyk.RawSienna cmyk.Fuchsia cmyk.green cmyk.Cyan cmyk.Lavender cmyk.JungleGreen cmyk.VioletRed cmyk.Mahogany cmyk.Periwinkle cmyk.RoyalBlue cmyk.Red cmyk.ProcessBlue rgb.Blue 69 37 .CadetBlue cmyk.Orchid cmyk.Sepia cmyk.Purple cmyk.RubineRed cmyk.Plum cmyk.Emerald cmyk.PineGreen cmyk.RoyalPurple cmyk.BlueGreen cmyk.MidnightBlue cmyk.BlueViolet cmyk.OliveGreen cmyk.White cmyk.SpringGreen cmyk.Melon cmyk.GreenYellow cmyk.

size. 'title_x_shift':-0. 8.25.blue.0:''. {'dx':-1.### Type3-Color.0:'four'.rgb. 'axis_color':color.LARGE].0. 'tick_text_levels':2. 'title':r'\LARGE Lens'.5.6. 'dy':0. 'text_color':color.LARGE]. 'function':lambda u:-log10(u).rgb.25.nomographer import * Range_meters_params={ 'tag':'range'.blue. 'pyx_extra_defs':[color.small]. 'tick_levels':2.6. }.0. }]. 'text_format':r"$%3.0. }]. 'tick_levels':2.0.0. 'title_color':color. 'text_color':color.0. 'dy':-2. 7. 'scale_type':'log'. 'title':r'\Huge Resolution'.0.95. 'dy':0. 9. 'text':r'$m$'. 'scale_type':'log'. 'title_x_shift':2.rgb.small].0. 'text_format':r"$%3.0.0.0:''. 'title_x_shift':-1. 'extra_titles':[ {'dx':-2. 'u_max':40.1f$". 'extra_titles':[ {'dx':-1. 'u_max':20. 2.0.\ text.6).0. 4. 3. 5.0.size. 'title_color':color. }].\ text.6).rgb. 'title_y_shift':-2.0. 'width':5. 'tick_text_levels':3. 'tick_side':'left'.0:'ten' }.size.6).45. 'u_min':1.6. Resolution_params={ 'tag':'resolution'.0.rgb(1.3. 'tick_text_levels':1.8.2.6. 'dy':0.size.rgb(1. 'text':r'Length'. }.rgb(1.rgb. } Focal_Length_mm_params={ 'tag':'focal'.2. } Number_of_Cycles_params={ 'u_min':1. 'text':r'Focal'. 'dy':-3.rgb.5.blue. 'function':lambda u:log10(u).size.6.\ text. 'u_max':50. 'extra_titles':[ {'dx':0.4. {'dx':-1. 'tick_levels':3. 'text_color':color.0.25.small].0:'one'.6.rgb(1.0.6). {'dx':0. 'title_color':color.0f$".0.0.6. 'function':lambda u:-log10(u).25.rgb(1. 'scale_type':'manual point'.0. 'scale_type':'log'.0. 'text':r'$m$'. 'title_x_shift':-1. 'u_min':0. 'scale_type':'log'. }.25.0. 'width':5. 'width':5. 'width':5.0.6). 'pyx_extra_defs':[color. 'axis_color':color. 'title':r'\Huge Range'.6). 38 . 'title_y_shift':0.\ text. 'u_max':10.LARGE].0:''. 'function':lambda u:log10(u). 'pyx_extra_defs':[color. 'tick_text_levels':2. 'pyx_extra_defs':[color.0. 'text':r'$mm$'.1.0.6).\ text. 'pyx_extra_defs':[color. 'dy':0. 'scale_type':'log'. 'title_y_shift':-0. 'function':lambda u:log10(u). 'title':r'\LARGE Target'. 'u_min':1.0.0.size. 'u_min':5000. 'pyx_extra_defs':[color.0:''. 'tick_levels':4. 'title_y_shift':-7.rgb.6.0:''.1f$".rgb.9. } Target_Size_meters_params={ 'tag':'size'.0. 'axis_color':color. 'width':5.5. 'text_format':r"$%3.blue.0.\ text.blue. 10. 'title_y_shift':-2.blue. 'title':r'\Large $N$'.0:'two'. 'text_format':r"$%3.7. 'manual_axis_data': {1.py ### 'title_color':color. 'tick_levels':2. 'text':r'Size'. 6. 'width':5.rgb(1.blue. 'u_max':1000.7.0. 'text_format':r"$3.15. 'tick_side':'left'. } from pynomo.0f$". 'title_x_shift':-1.rgb(1.0f$".0.0:'six'.blue. 'tick_side':'left'.7.blue.rgb.

cmyk.0.)]. 'title_x':10. 'paper_height':11.blue. 'tick_text_levels':2. 'width':5. 'manual_axis_data':{4. 'extra_titles':[ {'dx':-2. 'pyx_extra_defs':[color.0/25.block_2_params. 'text':r'\Large Focal Length $\times$ Target Size'.OliveGreen.cmyk. 'title':r'\small $in$'. main_params={ 'filename':'Type3-Color. 'title_str':r'\Large Resolution =\ ------------------------------------------'. 'u_min':1000.Red.0:'\large Req.rgb.0. 'isopleth_values':[[300.cmyk. 'dy':0.0:'\large Req.cmyk.cmyk. } block_3_params={ 'block_type':'type_8'.cmyk.RedOrange].85.0. }.10]].40.cmyk. block_2_params={ 'block_type':'type_8'. C'.4.cmyk. 'text_color':color. 'isopleth_values':[['x']]. } block_4_params={ 'block_type':'type_8'. Target_Size_meters_params. 'title_x_shift':0. }]. 'function':lambda u:-log10(u). 'pyx_extra_defs':[color. 'function':lambda u:log10(u).0. } block_1_params={ 'block_type':'type_3'.OliveGreen.6. 'tick_side':'right'. Resolution_params].cmyk.0. 'tick_side':'left'.25.OliveGreen.OliveGreen. 'function':lambda u:log10(u). 'transformations':[('rotate'. } ### TYPE 8 SINGLE-SCALE BLOCK ### Target_Size_feet_params={ 'tag':'size'. 'isopleth_params':[ {'color':'RedOrange'. 'title_color':color.281.blue. 'axis_color':color.OliveGreen. 'height':10. 'tick_levels':4.0*3.4. 'text_format':r"$%3. 'y':-1. 'isopleth_values':[['x']]. } 'extra_texts':[ {'x':9. block_3_params.cmyk.0.28. 20. }]. 'title_color':color. 'f_params':Focal_Length_inches_params. 'scale_type':'log'.0. 'text_color':color. 'f_params':Target_Size_feet_params. 'title_color':color. 'align_func':lambda u:u*25. 'block_params':[block_1_params. B'.28. 'isopleth_values':[['x']]. 'width':10. A'}.5*3.RedOrange.2f$". 'width':7. 'text_color':color. 'f_params':[Range_meters_params. 'width':5. 'arrow_color':color.\ text.0*3.2. 'title_x_shift':0.5.2. 'u_min':0.0. 'axis_color':color. 'title_color':color.OliveGreen.pdf'.5. 'text_color':color.cmyk. 'tick_levels':2. 'tick_side':'left'.28.0f$".0/25. 'title':r'\small $ft$'.6). 'text_format':r"$%3.cmyk.cmyk.Red.gray(0. 'text_format':r"$%3. 39 .''].4. 'tick_levels':2. 'u_min':5000. 'scale_type':'log'.OliveGreen. 'extra_params':[{ 'tick_side':'right'. 'y':-1.8).0:'\large Req. 'tick_text_levels':3.blue. Focal_Length_mm_params.4. 'pyx_extra_defs':[color.rgb. } ### TYPE 8 SINGLE-SCALE BLOCK ### Range_feet_params={ 'tag':'range'. 'paper_width':25.0.OliveGreen. 'align_func':lambda u:u/3. 'text_color':color. 'title_y':-1. 'reference_color':color.small]. 'align_func':lambda u:u/3. 'axis_color':color.9. 'text':r'\Large $N$ $\times$ Range'. 'linewidth':'THick'. 'axis_color':color. 'tick_text_levels':2. 'u_max':50.0. }]. {'x':7. 'u_max':1.4. 'title_color':color.281.'tick_text_levels':3. 34. 'u_max':20.281.cmyk. 'f_params':Range_feet_params. 'title_box_width': 20. 'text':r'$(line \enspace pairs/mm)$'. 'title':r'\small $ft$'.0.rgb.'x'.('scale paper'.01).0*3. } 'title_x_shift':0. } ### TYPE 8 SINGLE-SCALE BLOCK ### Focal_Length_inches_params={ 'tag':'focal'. Number_of_Cycles_params. 'scale_type':'manual arrow'. 'scale_type':'log'.rgb(1.block_4_params].35.0f$".OliveGreen.RedOrange].size. 'reference_titles':[''.

0 1.00 5.0 0. } Nomographer(main_params) .0 7.60 0. }.0 2.0 7.50 0.00 20.20 0.0 6.80 0.2 2.4 1.0 9.07 0.0 4.0 30.0 10. C Req. B Req.5 0.0 14. 'transparency':0.09 0.1000 100 40 5000 4000 3000 2500 1200 1400 1600 1800 2000 600 700 800 900 500 400 300 250 120 140 160 180 200 60 70 80 90 50 m 12000 14000 16000 6000 7000 8000 9000 5000 4000 3000 2500 1200 1400 1600 1800 2000 600 700 800 900 500 400 300 250 180 200 ft 10000 1000 Range N one two ten six four 2 9 8 7 6 5 4 3 20 90 80 70 60 50 40 30 200 900 800 700 600 500 400 300 mm 0.6 0. 'circle_size':0.00 30.04 0.0 Req.5.5 3.0 Target Size 20.70 0. A (line pairs/mm) 'linestyle':'dotted'.06 0.00 8.7 0.8 0.0 5.00 10.00 0.0 18.0 16.08 0.0 3.0 12.0 4. ].8 1.00 3.0 25.0 Resolution 10 20.00 9.40 0.0 1.0 2.00 4.00 7.9 m 30 40 50 60 20 3 4 5 6 7 8 9 2 ft 1.00 6.10 Length Focal 1.0 6.00 in N × Range Resolution = —————————————— Focal Length × Target Size 1 10 Lens 100 1000 10.6 1.0 9.30 2.90 0.0 5.0 8.10.0 8.0 40.05 0.

3 or 4: the size of the scale labels for particular tick text levels. We orient the labels along the scale (90°) and allow them to turn upside down (this is particularly useful if the dial is physically turned to line up with a fixed. respectively) As before. 2.075 and 0. useful when the labels are rotated 90° as seen in the next example (False by default) • grid_length_#. line up the left-right center of each scale label with its tick mark rather than the end of the label. 3. respectively) • full_angle: allow the scale labels to turn upside down as they run around a curved scale. For a vertical scale a value of 90 would align the labels along the direction of the scale. tiny and tiny. We also define the label sizes. (defaults for #=0–4 are 1.Red. rather than forcing them to stay more-or-less upright within a range of 0° to 180° as seen in the dial face on page 34 (False by default) • extra_angle: an angle in degrees to tilt the scale labels clockwise from their default angle. where # can be 0. 4 or 5: the length in cm of the tick mark of a particular tick level for example.25 and 0. Here we help the situation with the following new scale parameters that can be applied to any scale. (defaults for #=0–4 are small. 0.com/pynomo11/Type8-ColorDial-Smart.size.myreckonings.Red.com/pynomo11/Type8-ColorDial-Smart. 1. where # can be 0. In the previous black-and-white version of this dial face on page 34. (defaults for #=0–4 are 0. curved or straight: • text_size_#. We also set the tick marks to be more uniform in length. First we want to add rainbow colors for the scales. 0. 0. To each Type 8 scale we add the lines 'axis_color':color. we continue to set turn_relative to True so the tick side stays continuous by following the scale curvature rather than being based on the left/right side of the page.225.small. 0. 'text_color':color. 0. 0. respectively) • text_distance_#. 1. for example.pdf 41 .125. 'text_size_0': text.25. many of the tick marks are too short. 'grid_length_2':0.31 31 http://www.Let’s return to our previous Type 8 example of a dial face.cmyk. for example.75.myreckonings.cmyk.Red. where # can be 0. vertical index line). The script and output PDF graphic are available online for download.25.2. 2. where the color is different for the scales at different radii.075. scriptsize.25.py and http://www. in which case you should also set text_horizontal_align_center below to True • text_horizontal_align_center: if True. tiny. 1. The result is a more readable dial face than the previous version on page 34. Zooming in on the dial face shows how it would look when printed on large paper.0.150. 2.cmyk. 'title_color':color. 'text_distance_0':1. 3 or 4: the distance in cm of the scale label for a particular text level # to the scale.

'title_x_shift':-0. 'title_x_shift':-0.0. } Square_Root_block_params={ 'block_type':'type_8'.size.25. 'function_y':lambda u: 7.Red.py ### Square_Root_params={ 'u_min':1. 'axis_color':color. 'base_stop':10.0*cos(2*pi*(log10(u)-log10(1. 'text_size_1': text. 'grid_length_3':0. # new script added below 'grid_length_0':1.0))). 'function_y':lambda u: 3.0))). } CenterHole_block_params={ 'block_type':'type_8'. 'text_size_1': text. 'text_distance_5':0.0. 'function_y':lambda u: 3.0*cos(-2*pi*(log10(u)-log10(0. 'tick_text_levels':0.1623.3. 'grid_length_3':0. 'title':r''.0.tiny. 'text_distance_2':0.75. 'f_params':Cube_Root_params.0*sin(2*pi*(log10(u)-log10(1.scriptsize. 'scale_type':'log smart'.Red. 'text_size_0': text.cmyk. 'base_start':0. 'f_params':Square_Root_params.1623)-log10(1.90.0))).1))). 'grid_length_5':0. 'width':15.0.20. 'u_max':1.95. 'grid_length_1':0. 'function_x':lambda u: 3.0))/ (log10(3.05.nomographer import * CenterHole_params={ 'u_min':0. 'grid_length_1':0. 'title':r'\Large $N^{1/3}$'. 'title_color':color.05*sin(2*pi*u).0. 'function_x':lambda u: 3.0*sin(2*pi*(log10(u)-log10(1. 'text_distance_1':0. 'title':r'\Large $\sqrt{N}$'. 'scale_type':'linear smart'. } Inverse_N_params={ 'u_min':0.25.2.### Type8-ColorDial-Smart. 'u_max':3. 'tick_text_levels':2. 'base_start':1.0)-log10(0.35. 'grid_length_2':0. 'text_distance_3':0. 'text_distance_3':0.101.6. } from pynomo.Red.0.0. 'text_distance_4':0.1))/ (log10(1. 'text_horizontal_align_center':True. 'grid_length_1':0.size. 'base_start':1.1. # new script added below 'grid_length_0':1. 'base_stop':1.size.0. 'grid_length_4':0. 'text_distance_0':1.Red.0.1623)-log10(1.0. 'height':15.6.45. 'text_color':color.1544)-log10(1. 'tick_text_levels':4. 'title_color':color. 'text_distance_0':1.45. 'scale_type':'log smart'.6. 'text_distance_1':0.65.tiny. 'tick_text_levels':4.1. } Cube_Root_params={ 'u_min':1.0. 'axis_color':color. 'grid_length_2':0. 'text_horizontal_align_center':True.65.65.Red. 'tick_levels':5. 'turn_relative':True.cmyk.1))).cmyk. 'text_color':color. 'title_y_shift':-1.3.0. Cube_Root_block_params={ 'block_type':'type_8'.15.45. 'text_distance_4':0. 'function_x':lambda u: 7. 'u_max':2.0.1544)-log10(1.3. 'grid_length_5':0.cmyk. 'function_x':lambda u:0.20.cmyk. 'turn_relative':True. 'title_y_shift':-1.95. 'height':15. 'title_x_shift':-0. 'base_stop':10. 'grid_length_2':0. 'text_distance_5':0. 'extra_angle':90.0*sin(-2*pi*(log10(u)-log10(0. 'text_distance_2':0.0))). 'text_size_0': text.0. 'f_params':CenterHole_params. 'tick_side':'left'.0))/ (log10(3.0))/ (log10(2. 'title':r'\LARGE $1/N$'.20. 'u_max':1. 'extra_angle':90.3.35.size.90.05*cos(2*pi*u). 'title_y_shift':0. 'grid_length_4':0.scriptsize.3.1))/ (log10(1. 'width':15. 'tick_levels':5. 'full_angle':True.Red.45. } 42 . 'turn_relative':True. 'tick_levels':0.cmyk. 'function_y':lambda u:0.90.0.0*cos(2*pi*(log10(u)-log10(1.0))/ (log10(2.0)-log10(0. 'height':15.25.0.25. 'width':15. 'tick_levels':5. # new script added below 'grid_length_0':1. 'full_angle':True.

'width':15.65. 'grid_length_5':0.'grid_length_3':0.Orange. 'axis_color':color.0*sin(2*pi*(log10(u)-log10(1.0. 'scale_type':'log smart'. 'tick_text_levels':4.999.0*sin(2*pi*log10(u)/log10(10. 'text_distance_0':1. 'function_y':lambda u: 11. 'grid_length_4':0.0*cos(2*pi*(log10(u)-log10(1.0.0.cmyk.20.Orange.20.0. 'function_y':lambda u: 7. 'u_max':99. 'grid_length_2':0.35.0))).95.cmyk. 'text_distance_4':0.25. 'text_distance_1':0. 'text_distance_2':0.45.3.cmyk. 43 .0. 'turn_relative':True.0))).0. 'width':15. 'axis_color':color. 'base_start':1. 'base_stop':100.0*sin(2*pi*(log10(u)-log10(1.cmyk.65.Orange. 'grid_length_4':0. 'text_distance_5':0.cmyk. 'text_size_0': text.0)-log10(1. 'title_color':color.35. 'base_stop':1000. 'f_params':N_params. # new script added below N_block_params={ 'block_type':'type_8'. 'u_max':999.0))/ (log10(1000.OliveGreen. 'extra_angle':90. 'title':r'\LARGE $N^2$'. 'text_distance_5':0. 'grid_length_3':0.size.25. 'text_distance_0':1.0))/ (log10(1000.tiny.45.size. 'title_x_shift':-0.2. 'function_y':lambda u: 11.0.6. 'text_color':color. 'f_params':Square_params. 'title_y_shift':0.cmyk. 'base_stop':9.size.2.25.0))). 'axis_color':color. 'full_angle':True. 'text_distance_0':1. 'height':15. 'tick_text_levels':4.2. 'u_max':9.0.0))).3. # new script added below 'grid_length_0':1. 'text_size_1': text.6. 'scale_type':'linear smart'. 'text_horizontal_align_center':True. } Cube_params={ 'u_min':1. 'base_start':1. 'f_params':Inverse_N_params.0.OliveGreen. 'text_color':color. 'turn_relative':True.0*cos(2*pi*(log10(u)-log10(1.scriptsize.OliveGreen. 'extra_angle':90.0)-log10(1. 'grid_length_5':0. 'text_distance_2':0.25. 'function_x':lambda u: 11.90.3.5. } } Square_params={ 'u_min':1. 'title_x_shift':-0. 'text_distance_2':0.25. 'extra_angle':90. 'width':15.0. 'full_angle':True.95. 'text_size_1': text.0*cos(2*pi*log10(u)/log10(10.45. 'base_start':1. 'function_x':lambda u: 7.0)-log10(1.45.0. 'scale_type':'linear smart'. 'title_y_shift':1. 'tick_levels':5.0))/ (log10(100. 'tick_side':'left'.45.0)). 'tick_levels':5.95.Orange. } Inverse_N_block_params={ 'block_type':'type_8'. 'text_size_0': text. 'function_x':lambda u: 11.999. 'text_size_1': text.90.0))/ (log10(100. 'text_distance_3':0.cmyk. 'grid_length_4':0.3. 'text_horizontal_align_center':True.cmyk.scriptsize. 'title_y_shift':-1. 'text_size_0': text.95. 'text_distance_1':0. 'grid_length_5':0. 'height':15. 'title_x_shift':2. 'text_color':color. 'grid_length_1':0. 'turn_relative':True.0.size. 'title':r'\LARGE $N^3$'.tiny. 'grid_length_1':0.3. 'tick_text_levels':4. 'tick_levels':5. 'text_distance_3':0. 'text_distance_3':0.tiny.Orange. 'title_color':color. 'title_color':color. } N_params={ 'u_min':1.35.scriptsize. 'text_distance_4':0.size. } Square_block_params={ 'block_type':'type_8'.0)).65.0.9999. 'text_distance_1':0.size.9999. 'grid_length_2':0.3. 'text_horizontal_align_center':True. 'full_angle':True.0)-log10(1.Orange. 'height':15.45. 'title':r'\huge $N$'.25. 'text_distance_5':0.cmyk.15. # new script added below 'grid_length_0':1.0. 'grid_length_3':0. 'text_distance_4':0.

'full_angle':True. 'grid_length_3':0.90.cmyk.cmyk. 'function_y':lambda u: 15.45.scriptsize.RoyalBlue. 'width':15. } Inverse_Area_params={ 'u_min':0.25. 'grid_length_2':0. 'function_x':lambda u: 19.62035. } Inverse_Area_block_params={ 'block_type':'type_8'.6.tiny.'grid_length_0':1.14159.0.cmyk.3365. 'base_stop':314. 'base_start':0. 'function_x':lambda u: 15.RoyalBlue. } Inverse_Volume_params={ 'u_min':0.5642))/ (log10(1. 'title_y_shift':0. 'title_x_shift':-0.5642))). 'text_horizontal_align_center':True. 'title_x_shift':0. 'width':15. 'base_stop':1. 'axis_color':color.OliveGreen.14159))).7841)-log10(0.15.20. 'base_stop':1. 'text_size_0': text.14159))/ (log10(314.0. 'height':15.0*sin(-2*pi*(log10(u)-log10(0. 'height':15.15.0.65. 'text_color':color.5642.15. 'extra_angle':90.3. 'tick_text_levels':4. 'function_y':lambda u: 19.45.RoyalBlue.0*cos(-2*pi*(log10(u)-log10(0. 'grid_length_5':0. } Area_params={ 'u_min':3.5642.25.0. 'f_params':Inverse_Area_params. 'extra_angle':90. 'text_distance_1':0.size. 'u_max':1. 'title':r'\Large $R \Rightarrow Area$'. 'title_color':color.35.3. 'tick_text_levels':3.25. 'text_distance_5':0. 44 . 'text_distance_3':0. 'title_x_shift':-0.cmyk.2. 'title':r'\Large $Area N \Rightarrow R$'. 'text_distance_5':0. 'height':15. 'grid_length_5':0. 'text_distance_2':0. # new script added below 'grid_length_0':1. 'text_distance_0':1. 'grid_length_5':0. 'grid_length_3':0.cmyk.159)-log10(3.90.95. 'grid_length_2':0. 'full_angle':True.cmyk. 'base_start':0. 'tick_levels':5.size.6.OliveGreen.75. } Cube_block_params={ 'block_type':'type_8'. 'title_y_shift':-1.size. 'turn_relative':True. 'tick_levels':5.0.14159))/ (log10(314.25. 'text_distance_1':0.0*sin(-2*pi*(log10(u)-log10(0. 'grid_length_4':0.scriptsize.cmyk.35.45.3. 'turn_relative':True. 'text_color':color.7841. 'text_horizontal_align_center':True.95. 'grid_length_3':0. 'title':r'\Large $Volume N \Rightarrow R$'. 'f_params':Area_params.0.RoyalBlue.tiny.25. 'u_max':314. 'text_color':color. 'width':15.45.0.0*cos(-2*pi*(log10(u)-log10(0.3.0*sin(2*pi*(log10(u)-log10(3.tiny.62035))/ (log10(1.7841)-log10(0.size.85. 'axis_color':color. 'function_x':lambda u: 15. 'grid_length_1':0. 'text_size_1': text. # new script added below 'grid_length_0':1.0. 'text_distance_3':0. 'text_distance_4':0.RoyalBlue. 'text_distance_4':0. } Area_block_params={ 'block_type':'type_8'.cmyk. 'grid_length_1':0. 'grid_length_4':0. 'title_y_shift':-1. 'text_distance_0':1. 'base_start':3.3.3365)-log10(0.65. 'text_size_1': text.3.OliveGreen. 'grid_length_1':0. 'text_distance_2':0. 'f_params':Cube_params. 'scale_type':'linear smart'.20.5642))).45.14159))).159)-log10(3. 'text_horizontal_align_center':True.25.95.45.3365)-log10(0.62035))). 'text_distance_0':1. 'function_y':lambda u: 15.20.1.5642))/ (log10(1.14159. 'text_distance_4':0.size.5. 'scale_type':'linear smart'. 'u_max':1. 'text_size_0': text. 'title_color':color. 'title_color':color. 'extra_angle':90. 'text_distance_3':0. 'grid_length_4':0.62035))). 'full_angle':True.RoyalBlue.7841.62035))/ (log10(1.90.scriptsize.35. 'tick_levels':5. 'axis_color':color.0*cos(2*pi*(log10(u)-log10(3.6.65.size.cmyk. 'text_distance_5':0. 'grid_length_2':0. 'text_size_1': text. 'text_size_0': text. 'text_distance_2':0. 'text_distance_1':0.

0. 'title_box_width': 6.cmyk.25. 'text_distance_1':0.1888))).45. 'text_distance_3':0. 'axis_color':color.1888))/ (log10(4188.cmyk.8)-log10(4. 'grid_length_2':0.RedViolet. 'grid_length_4':0. 'grid_length_2':0. 'grid_length_1':0.01).45.0*sin(2*pi*(log10(u)-log10(4. 'title_y_shift':1.20. 'text_distance_1':0.8.size. 'text_distance_5':0. 'scale_type':'log smart'. 'function_y':lambda u: 19.6.25. 'text_distance_0':1.25. } Inverse_Volume_block_params={ 'block_type':'type_8'.scriptsize.cmyk. 'full_angle':True. 'text_size_1': text.95. 'scale_type':'log smart'. 'text_size_0': text. 'grid_length_1':0. # new script added below 'grid_length_0':1.'tick_text_levels':4. 'transformations':[('rotate'.0*cos(2*pi*(log10(u)-log10(4. 'title_x': 2.0.65. Square_block_params.1888.size. 'text_size_0': text.95. 'text_size_1': text. 'text_distance_3':0. } Volume_params={ 'u_min':4. } Volume_block_params={ 'block_type':'type_8'.8.20. 'extra_angle':90.tiny. # new script added below 'grid_length_0':1. 'text_horizontal_align_center':True. Cube_Root_block_params. 'grid_length_5':0.].0.25. 'block_params':[CenterHole_block_params.3. 'text_distance_0':1. Inverse_Volume_block_params. 'grid_length_5':0. } 'turn_relative':True.tiny. 'text_distance_2':0. 'f_params':Volume_params.Volume_block_params. 'base_start':1.RedViolet. 'u_max':4188. 'tick_text_levels':3.1888))/ (log10(4188.3.('scale paper'.cmyk.size. 'grid_length_3':0. Nomographer(main_params) 45 .RedViolet.1888))).cmyk.pdf'. 'paper_width':30. 'text_color':color.3. 'extra_angle':90.5. 'text_distance_5':0. 'title':r'\Large $R \Rightarrow Volume$'. 'title_x_shift':3. } main_params={ 'filename':'Type8-ColorDial-Smart.35.45. 'text_distance_4':0.65.Square_Root_block_params. 'grid_length_3':0.cmyk.Sepia. Inverse_Area_block_params. 'text_color':color. Roots and Circle Formulas'. 'turn_relative':True.scriptsize. 'function_x':lambda u: 19. 'height':15.90. 'title_str':r'\huge Powers.35.0.RedViolet.Cube_block_params.6.90.RedViolet. 'tick_levels':5.0. 'grid_length_4':0. Inverse_N_block_params.0.8)-log10(4.3. 'full_angle':True. 'text_horizontal_align_center':True.0.5. 'title_color':color. 'title_color':color.cmyk. 'text_distance_2':0. 'height':15.size. 'title_y': 1. 'base_stop':1000.Area_block_params.0. 'f_params':Inverse_Volume_params.RedViolet. 'paper_height':30. 'text_distance_4':0. 'title_color':color.45.N_block_params.0.)]. 'width':15. 'width':15. 'axis_color':color.

2 92 0. 58 1.6 0.6 38 40 7 0. 5 5.9 3.7 3.4 5 2. 5 0.65. 2. 15 18 24 30 34 0.3 45 37 2. 2. 46 1.75 12 2 0.99 5 1.5 28 29 31 32 100 63 6.4 5 6 1. 2 5 .74 1.6 5 √ N 75 0.5 8 8.7 39 200 75 4.01 1. 1.25 1. 2 7 1. 66 6 0.35. 5 0.7 2.73 1.6 61.4 0. 1. 7.4 0. 83 45 120 110 20 3 2.5 12 3.5 45 1 8 15 .95 0.3 1. 1. 3 1.37 N3 5 4.4 1. 84 0.7 1.1 .5 21 20. 62 7 4.4 11.6 4.5 25.72 0. 57 1.5 27 30.64 0.74 0.7 500 3. 25 1. 1.75 0. 11 15 2. 2.5 3 90 3. 8 66 0. 0. 1 2. 0.29 1. 4 2.34 AreaN ⇒ R 1.95 2. 15 0. 8 1.2 1. 1 2. 5 25 30 39 38 0.8 0. 56 20 1. N2 4 4.5 20 75 85 95 58 10.76 950 650 46 850 750 700 800 900 1000 7 6.4 31. 35 1.73 550 600 55 0 0 50 0 2 0.6 8 0. 50 41 86 0. 13 7 25 0.2 40 36 6 2.55 2.85 1.5 9. 20 . 7 0. 4 13 49 11 10 0 40 0 35 0.6 5 6. 1.5 25 28.5 14 8.5 4000 305 295 3500 285 275 270 260 265 255 245 300 0 240 23 5 5 230 22 0 00 25 0 0 22 5 21 5 20 0 5 19 5 18 0 18 00 15 280 290 300 310 1.5 21 21 . 1.6 621 1. 49 59 1.76 1 1.9 1. 4 5 1. 1. 55 2. 5 0.5 13 14 17 21 22 23 26 27 28 29 33 0. 55 42 85 4.3 6 1. 63 47 70 46 45 5.5 0.7 69 0. 23 24 .4 21. 99 12. Roots and Circle Formulas 15 60 6 1. 1.75 0.0 6 1 . 5 1. 2. 72 .5 1. 5 19 0.94 10 5 9. 5 2. 12 10 1.77 0.5 19 1.4 5 0.5 1 1.78 0.9 4 .75 0.1 3.0 8 35 2.5 80 60 8. 65 52 50 51 83 0. 67 53 0 0 0. 0.1 9.5 2.5 29.2 3 1. 45 1.5 1.5 2 0.96 9 1.3 1.7 8 0.5 1. 35 37 36 1 11 3 68 0.79 0 250 2 9 1.9 1 1.4 0 65 0.35 20 12 11.5 26 27. 61 1.77 1. 8 105 100 0 14 130 71 0.5 2. 9 67 0.88 1.5 6 5. 81 0 5 13 115 5 0 17 0 5 15 5 14 125 85 17 5 16 0.9 5.76 721. 65 4 1 4.02 1. 86 0. 1 9 0. 12.33 1. 82 0.74 0.0 9 6 0.5 2.3 1. 5 1.6 6 5 2. 15 6.95 2. 4 0. 2. 3 90 62 1.78 1.2 9 81.8 1. 16 1. 2 4 .5 16 16 5 7 7.7 15 . 0.28 19 0 50 11 19 18 . 0.8 1 1.6 1 2 5.5 31.9 3 0.6 71. 5 5. 48 1.6 2.77 89 0. 6 0.05 0.9 1. 60 43 95 4.9 0.5 19 . 59 61 0 1. 34 33 32 31 95 90 16 0 15 7 0.5 5.5 15 8 7.8 2. 98 1. 51 1. 1. 91 0.5 55 14 . 14 1.6 1.381.59 75 2 4.6 . 1.31 1.5 9 8. 4 4.5 5 1.5 45 0. 82 0.5 17 11 1.93 9 3.63 80 70 9 3. 1.98 0.5 13 13 .5 0. 4 5 1.58 85 8 3. 22 1. 47 1.8 3. 40 4 43 19 . 18 1.2 10 45 R ⇒ Area 9 65 70 80 90 57 35 Powers. 26 29 28 27 1.4 4 55 1. 45 27 260 240 50 2 0 230 210 22 160 170 180 190 200 65 70 50 55 140 150 64 55 3 0.1 1 9 0. 85 0.2 1.73 1.9 6 1.35 7.5 4 1. 5 1. 1.5 1.1 1 950 900 850 800 750 700 60 0 0 0.07 3 25 2.65 17 . 56 1.3 0.6 .8 60 65 44 85 0.3 3. 53 1.2 21 1.5 6 1.5 2 24 4. 9.5 2 23 2.R ⇒ V olume 25 30 35 40 10 5 9. 2 1. 5 0. 2 1. 24 0. 9 1 1 2 3.85 2. 1.5 19 18 .5 2.5 26.5 2 1.7 9 0.5 16 0.8 1 0. 44 20 87 0. 5 7.05 10. 5 0.5 15 .5 1.5 2 22 1. 64 48 0 25 84 0.92 4. 1 0.0 3 1. 2.75 2 2.0 2.4 1.5 0.4 21 13 7.5 22 22.32 1.04 1.91 6 5. 2 2.711. 52 1. 5 23 2 3.8 16 0.9 5 1.5 4 5 4. 7 1.7 0. 5 N 5 16 20 25 30 150 0. 0.361.2 2.5 18 88 0. 7 1.7 5 0.85. 1.6 64 5 31. 39 5 4. 8 23 1.89 5 3 1/N 0.5 1.1 54 130 0 029 028 120 0.57 95 2 3. 1.5 14 14 1 0.1 V olumeN ⇒ R . 6 N 1/3 1. 68 30 0 0 75 80 40 30 69 0.9 0.75.97 1.1 5.5 18 17 1.1 1 0.8 . 9 8 5 8. 97 11.1 35 35 7 2.8 7 6.9 0. 7 1. 1.

'grid_length_2':0. 32 http://www.. ### Type8-ColorDial-Smart-Defaults.05*cos(2*pi*u). and then the script uses an update command to define the rest of its parameters (or re-define any default parameters). does load the defaults. but they are available online for download.3. which is not included when the scale is included in the block parameters.0. 'height':15.05*sin(2*pi*u).90. 'height':15. 'base_start':1.0. 'function_x':lambda u:0. 'text_distance_1':0. 'grid_length_5':0. The scale parameters name now has . 'text_size_0': text.0. } Cube_Root_params=copy. } from pynomo. 'u_max':1. and this procedure is followed for all the other scales. and so forth . 'full_angle':True.45. 'title':r'\Large $N^{1/3}$'. 'tick_side':'left'. Below is the first part of the previous color dial script that has been modified for default values.myreckonings.0..0.com/pynomo11/Type8-ColorDial-Smart-Defaults.0*cos(2*pi*(log10(u)-log10(1.45.Red. 'function_x':lambda u: 3. 'title_y_shift':-1.. 'text_distance_3':0.1544)-log10(1.20. } Cube_Root_block_params={ 'block_type':'type_8'. 'grid_length_4':0.deepcopy(default_params) is added prior to defining the scale parameters. 'function_y':lambda u: 3. 'turn_relative':True.update({. 'function_y':lambda u:0.25. This can save some lines in the script.}) rather than Cube_Root_params={.95. 'text_distance_2':0.cmyk. . so Cube_Root_params=copy.65.update({ 'u_min':1.Red. } CenterHole_block_params={ 'block_type':'type_8'. }) CenterHole_params={ 'u_min':0. The scale can then override any default parameter by simpy re-defining it. To reduce page count. and the list of parameters in braces is now inserted between the parentheses of the update function. 'text_distance_0':1. 'title_color':color. The default parameters are listed at the beginning of the script in a new set of parameters called default_params. Each scale that loads these defaults has a line of script that copies them in.0. 'f_params':Cube_Root_params. 'tick_levels':5. 'grid_length_1':0.35.cmyk.25. like all the other scales.size.py ### 'f_params':CenterHole_params. the full script and PDF graphic output are not listed here.}. 'axis_color':color. 'tick_text_levels':4.0.0..Notice that in this last color dial script we repeat a certain set of scale parameters in nearly every scale. 'width':15.32 You will see that the nomogram is identical to our previous color dial but the script size has been reduced from 519 to 360 lines. The parameters for this scale are now expressed as Cube_Root_params.tiny.0))/ (log10(2.05.0))).0))/ (log10(2.deepcopy(default_params) Cube_Root_params. 'u_max':2. 'width':15.3... but there is a way to define a set of default parameters that can be loaded into each scale.size. 'scale_type':'log smart'.. 'tick_text_levels':0. The Cube_Root scale. 'tick_levels':0. 'text_horizontal_align_center':True.15. so repeating the parameters is not an issue.py and http://www. 'text_color':color.com/pynomo11/Type8-ColorDial-Smart-Defaults.nomographer import * default_params={ 'grid_length_0':1.0*sin(2*pi*(log10(u)-log10(1.Red.1544)-log10(1. 'base_stop':10.scriptsize. 'text_distance_5':0.myreckonings.0.pdf 47 . Normally a nomogram would consist of fewer scales.6. so it does not use the copy and update mechanism.update added at the end.. 'title':r''. 'text_distance_4':0. 'title_x_shift':-0.cmyk.3. 'grid_length_3':0. 'text_size_1': text. 'extra_angle':90.0))). The CenterHole scale does not use these default parameters at all.

The example for the equations above is shown on the next two pages.myreckonings.com/pynomo11/CompoundType1-Example. We also introduce a new parameter here: • arrow_length: the length in cm of the arrows (default is 1.myreckonings. If substitute the second equation into the first to get a single equation. we can comment out these lines in one of the blocks so we only have one set of tick marks. The main parameters list both blocks as part of the nomogram.py and http://www.0) Here the second line of the title is printed with the extra_texts parameter.pdf 48 34 . we can use the Type 3 format with pivot lines to draw it (after converting it to a sum of logarithms) but we’ve lost the intermediate variable Scene Exitance which is an important parameter of the engineering problem. The tick marks and labels are printed on the Scene Exitance scale by both Type 1 blocks in order to make sure that they are identically aligned.py and http://www.33 33 http://www..2 But we also have a relationship between the Scene Exitance. consider another relationship in electro-optics between the camera Photocathode Illuminance.12 Compounding Type 1 (Three Parallel Scale) Nomograms We’ve seen in earlier sections nomograms with pivot lines for an equation of the form f1 (u1 ) + f2 (u2 ) + . with the tag exitance assigned to the Scene Exitance scale in each block. so the tick_text_levels parameters are reduced to 1 instead of 2. The scale parameter extra_params is used to place additional arrows at specific scale values by specifying manual arrow as the scale_type.com/pynomo11/CompoundType1-Example. there are times when the scale values on the pivot lines are important.myreckonings. the second nomogram is much cleaner than the first one without any loss of precision.com/pynomo11/CompoundType1-Final. This is simply a procedure to connect two Type 1 nomograms. for each equation we need to create a separate Type 1 three-line nomogram block. Target Reflectivity. and Scene Illuminance: Scene Exitance = Scene Illuminance × Target Reflectivity So we have two three-variable equations sharing one variable. This is a Type 3 nomogram directly supported by PyNomo.com/pynomo11/CompoundType1-Final. As you can see.myreckonings. where tick_levels and tick_text_levels are set to 0 for the Scene Exitance scale in the second block.. when the lens transmission is 90% and the image magnification on the focal plane is approximately zero: Scene Exitance × 90% Photocathode Illuminance = 4 × Lens F/No. For example. The tick labels also seem excessively dense in the first example. and then tag the Scene Exitance scale in each of the two nomogram blocks with the same name so they align on top of each other. Scene Exitance (the reflected light off the target) and the Lens F/No.pdf 34 http://www. Only one of these blocks provides the title. However. These PyNomo scripts and output PDF graphics are available online for download. so there is no separate Type number in PyNomo for this combination. It defines two blocks of Type 1. and one has the tick marks on the left side and the other on the right. Therefore. Once we see that this is the case. The result is shown in the second example on the third and fourth pages after this. + fn (un ) = 0.

'scale_type':'log'. 'scale_type':'manual arrow'. 'function':lambda u:-log10(u).0 Magnification))'. # Duplicate labels 'tick_levels':2. } block_12_params={ 'block_type':'type_1'. 'f1_params':Scene_Exitance_2_params.7. 'f2_params':FNumber_params. 'title_y_shift':0.00001.7. # Duplicate labels 'tick_text_levels':2. 'u_min':0. 0. 'u_max':100. 'tick_levels':2.0. } block_11_params={ 'block_type':'type_1'. 'title':r''. } ### MAIN PARAMETERS ### main_params={ 'filename':'CompoundType1-Example. 'title':r'Lens F/No.0. 'scale_type':'log'. 'u_max':5. 'title':r'Scene Exitance (lumen/m$^2$)'. } FNumber_params={ 'u_min':0.py ### { from pynomo.001:'Clear No Moon'. 'title_x':8.7.1. 'manual_axis_data': Nomographer(main_params) 49 . 'title':r'Photocathode Illuminance (lux)'.0. } }].0. } ### TYPE 1 3-LINE BLOCK ### Scene_Illuminance_params={ 'u_min':0.5. 'u_max':1. 'scale_type':'log'. 'tick_side':'left'. 'f3_params':Photocathode_Illuminance_params. 'tick_text_levels':2. 'u_max':0.5. 'function':lambda u:log10(u).7.nomographer import * ### TYPE 1 3-LINE BLOCK ### Photocathode_Illuminance_params={ 'u_min':0.01*u). 'title_y':-1. }]. 'tick_levels':2. 'tick_side':'right'.7. 'scale_type':'log'.01). 'u_max':10. 'paper_height':18. # Duplicate labels } Scene_Exitance_1_params={ 'tag':'exitance'. 'transformations':[('rotate'. 'height':15.)]. 'height':15.0.0000001.0. 'function':lambda u:-log10(0. 'tick_text_levels':2.\ 'extra_texts':[ {'x':2. 'tick_levels':2. 'y':-1. 'function':lambda u:2*log10(u). 'tick_text_levels':2. 'title':r'Target Reflectivity (\%)'.0. 'tick_text_levels':2.0. 'f1_params':Scene_Exitance_1_params. 'block_params':[block_11_params.'.7. 'text':r'\large where Scene Exitance = Scene\ Illuminance $\times$ Target Reflectivity'. 'width':15. 0. 0. 'tick_side':'left'. Target_Reflectivity_params={ 'u_min':1. 'tick_levels':2. 'title_y_shift':0.2:'Clear Full Moon at Zenith'.0.0. 'function':lambda u:-log10(0.0. 'function':lambda u:log10(u).block_12_params].### CompoundType1-Example. 'width':15.('scale paper'. 'f3_params':Scene_Illuminance_params.0. 'title_y_shift':0. 'width':15. 'title_y_shift':0.0002:'No Moon Heavy Clouds'.7.pdf'. 'tick_text_levels':2. 'f2_params':Target_Reflectivity_params.0. 'scale_type':'log'. 'u_max':1.0. 'title_box_width':25. 'title_str':r'\large Photocathode Illuminance = \ (Scene Exitance $\times$ 90\% Lens Transmission)\ / (4 $\times$ Lens F/No. 'u_min':0. 'arrow_length':1. } Scene_Exitance_2_params={ 'tag':'exitance'. 'scale_type':'log'. 'title_y_shift':0. 'paper_width':20. 'tick_levels':2.225*u).0.$^2$ $\times$\ (1 $+$ 0. 'title':r'Scene Illuminance (lux)'.00001.00001. 'extra_params':[ {'tick_side':'left'. 'title_y_shift':0. } }.0.0.

002 0.0009 0.6 0.09 0.02 0.05 0.002 0.003 0.09 0.04 0.004 0.0004 0.06 0.07 0.7 0.001 0.001 0.05 0.09 0.8 0.009 0.009 0.5 0.02 0.006 0.0001 − − − − − 4e − 005 5e 6e 7e 8e 9e 3e − 005 005 005 005 005 005 4e − 005 − − − − − 3e − 005 5e 6e 7e 8e 9e 2e − 005 1e − 005 2e − 005 1e − 005 Scene Exitance (lumen/m2 ) 1 − − − − − 005 005 005 005 005 0.4 0.01 0.50 − − − − − 005 005 005 005 005 0.04 0.7 0.008 0.07 0.3 0.04 0.005 0.4 0.0003 0.2 × (1 + 0.002 0.5 0.004 0.006 0.007 0.9 0.06 0.4 0.003 0.0008 0.0001 005 005 005 005 005 5 4 3 2 0.03 0.006 0. where Scene Exitance = Scene Illuminance × Target Reflectivity 30 40 50 60 70 80 90 20 3 4 5 6 7 8 9 2 Target Reflectivity (%) 0.02 0.003 0.05 0.001 0.0002 0.05 Photocathode Illuminance (lux) Photocathode Illuminance = (Scene Exitance × 90% Lens Transmission) / (4 × Lens F/No.005 0.009 0.0004 0.001 0.0006 0.007 0.06 0.01 0.005 0.7 0.0009 0.0005 0.0006 0.5 2 3 4 9 8 7 6 5 Scene Illuminance (lux) .04 0.0007 0.008 0.08 0.03 0.01 0.005 0.1 0.007 0.0007 0.002 0.8 0.0002 1 0.8 0.0004 0.003 0.0006 0.0002 0.08 0.06 0.009 0.0001 0.0009 0.0007 0.6 0.0006 0.007 0.2 0.8 0.004 0.2 1 10 100 10 1 1 0.0003 0.03 0.3 0.02 0.0009 0.09 0.0005 0.9 0.006 0.07 0.1 − − − − − 1e − 005 006 006 006 006 006 − − − − − 1e − 006 007 007 007 007 007 1e − 007 2e − 007 3e − 007 4e − 007 9e 8e 7e 6e 5e 2e − 006 3e − 006 4e − 006 9e 8e 7e 6e 5e 2e − 005 3e − 005 4e − 005 9e 8e 7e 6e 5e 0.0008 0.6 0.07 0.1 1e − 005 2e − 005 3e − 005 4e − 005 9e 8e 7e 6e 5e 0.008 0.03 0.0003 0.0008 0.0004 0.0001 0.0005 0.3 0.01 0.0005 0.2 0.0007 0.08 0.0003 0.9 Lens F/No.1 0.5 0.9 0.0002 0.0 Magnification)) No Moon Heavy Clouds Clear No Moon Clear Full Moon at Zenith 0.7 0.0008 0.004 0.008 0.6 0.08 0.

'title_y_shift':0. 'f3_params':Scene_Illuminance_params. 'u_min':0. }].225*u).00001. 'tick_text_levels':2. # Don't draw duplicate ticks 'tick_text_levels':0.'.2:'Clear Full Moon at Zenith'. 'paper_height':18.1. 'tick_text_levels':1.0. 'transformations':[('rotate'. 'tick_levels':2. 'u_max':5. 'u_max':1.5. 'y':-1. 'f2_params':FNumber_params.)].('scale paper'. 'width':15.7.0.7. } Scene_Exitance_2_params={ 'tag':'exitance'. 'function':lambda u:-log10(0. 'u_max':10.0. 'scale_type':'log'.7.00001. 'scale_type':'log'.### CompoundType1-Final. 'text':r'\large where Scene Exitance = Scene\ Illuminance $\times$ Target Reflectivity'. 'title':r'Target Reflectivity (\%)'. 'scale_type':'manual arrow'. 'extra_params':[ {'tick_side':'left'. } ### MAIN PARAMETERS ### main_params={ 'filename':'CompoundType1-Final. 0. 'u_max':0.0. 'tick_side':'left'.7. } }]. 'height':15.nomographer import * ### TYPE 1 3-LINE BLOCK ### Photocathode_Illuminance_params={ 'u_min':0. 'paper_width':20. 'arrow_length':1. 'scale_type':'log'. 'block_params':[block_11_params. 'tick_side':'right'. } block_12_params={ 'block_type':'type_1'.py ### { from pynomo. 'title':r'Scene Exitance (lumen/m$^2$)'. 'tick_side':'left'. 'title_y_shift':0.0. 'title':r'Scene Illuminance (lux)'.7. 'title_y_shift':0.0. } FNumber_params={ 'u_min':0. 'title':r'Photocathode Illuminance (lux)'. 'height':15.0. 'tick_text_levels':1. 'tick_levels':2. 'tick_text_levels':1.$^2$ $\times$\ (1 $+$ 0. 0. 'tick_text_levels':1.0.5. 'tick_levels':0. 'width':15. 'scale_type':'log'.0 Magnification))'.7. 'scale_type':'log'. 'scale_type':'log'.\ 'extra_texts':[ {'x':2. 'f3_params':Photocathode_Illuminance_params.001:'Clear No Moon'. 'title_box_width':25. 'manual_axis_data': Nomographer(main_params) 51 . 'tick_levels':2. 'f1_params':Scene_Exitance_2_params.0. 0. 'title':r'Lens F/No. 'u_max':100. 'title_str':r'\large Photocathode Illuminance = \ (Scene Exitance $\times$ 90\% Lens Transmission)\ / (4 $\times$ Lens F/No.0.0.0. 'u_min':0. 'f2_params':Target_Reflectivity_params. } block_11_params={ 'block_type':'type_1'.0. 'title':r''.pdf'. 'f1_params':Scene_Exitance_1_params. 'function':lambda u:-log10(u). 'function':lambda u:-log10(0. 'width':15.0002:'No Moon Heavy Clouds'. 'title_y_shift':0. 'function':lambda u:2*log10(u).01). 'title_y_shift':0.block_12_params].7. 'title_x':8.01*u). } ### TYPE 1 3-LINE BLOCK ### Scene_Illuminance_params={ 'u_min':0. 'tick_levels':2.0.0000001. 'function':lambda u:log10(u). 'title_y_shift':0.0. 'title_y':-1.0. # Don't draw duplicate labels } Scene_Exitance_1_params={ 'tag':'exitance'.00001.0. } }. Target_Reflectivity_params={ 'u_min':1. 'u_max':1. 'tick_levels':2. 'function':lambda u:log10(u).

where Scene Exitance = Scene Illuminance × Target Reflectivity 100 10 1 Target Reflectivity (%) 0.01 0.1 Photocathode Illuminance (lux) Photocathode Illuminance = (Scene Exitance × 90% Lens Transmission) / (4 × Lens F/No.5 0.9 Lens F/No.0001 0.01 0.52 1e − 005 0.0 Magnification)) No Moon Heavy Clouds Clear No Moon Clear Full Moon at Zenith 1 10 Scene Illuminance (lux) .001 0.001 5 4 3 2 0.01 0.1 1 0.001 0.1 0.8 0.0001 1e − 005 Scene Exitance (lumen/m2 ) 1 1e − 007 1e − 006 1e − 005 0.6 0.0001 0.2 × (1 + 0.7 0.

rgb.php/Type_6 36 Epstein. As before. The first equation represents a Type 2 N nomogram for f1 (u1 ) = f2 (u2 ) × f3 (u3 ) after we take the logarithm of both sides and use the relation log ab = b log a: log R = log ST log R = T log S log S = 1/T log R The second equation represents a Type 1 nomogram for simple addition f1 (u1 ) + f2 (u2 ) + f3 (u3 ) = 0: − R −W + Q = 0 So it turns out that it’s impossible to share the same R-scale for the two blocks because R must be a logarithmic scale for the first equation and a linear scale for the second equation. L. but there are occasions where it is needed. but which cannot be represented by the same function. we don’t want to substitute the first equation into the second to get a single equation because we want to see the intermediate variable R. where a low value is a straighter line and a high value is a more curved line (default=0. The new block parameters for this Type 6 nomogram (which are omitted in this example to accept their default values) are • curve_const: sets the length of the angle of the Bezier curve.black)—not set in this example 35 http://www.35 . Interscience Publishers.13 Creating a Type 6 (Ladder) Nomogram A Type 6 Ladder nomogram is a simple connection of two function scales by lines running between matching values on the scales. p. It provides a transition between two nomograms that share a common variable.org/wiki/index.pynomo. Nomography. New York (1958). “It is admittedly a crutch but is widely used. So again for each equation we need to create a separate nomogram block. The example for the equations above is shown next. 53 .36 R = ST where Q = R +W So we have two three-variable equations sharing one variable just as we plotted in the last section as two compounded Type 1 nomograms. As Epstein says. and we will simply modify the script on that page for our example here. Ivan. This is normally avoided if possible by redesigning the nomogram. We will create a nomogram for the following equation from Epstein. 66.” A ladder example is provided on the Type 6 Software Documentation page.5)—not set in this example • ladder_color: the color of the ladder lines (default is color.

5]]. } Ladder_params={ 'block_type':'type_6'. 'tick_side':'left'. 'title':r'\Large $S$'. 'title':r'\Large $T$'.0.3.py and http://www. 'f1_params':S_params. Notice also that the T-scale.0. }. the ladder block must include an isopleth_values parameter in which the two values are the calculated (denoted by ’x’). 'title':r'\Large $R$'.com/pynomo11/Type6-Isopleths. 'tick_side':'right' }. 'tick_text_levels':1. } from pynomo. 'u_max':10. 'tick_text_levels':0. } Type2_params={ 'block_type':'type_2'. but I wanted to show how to add isopleths to a Type 6 nomogram). {'u_min':1. We have drawn isopleths on this nomogram.0. 'u_max':20.0. which always produces straight lines connecting the two sides of the ladder. is drawn as a log scale. 'tick_text_levels':2.0. R1_params={ 37 http://www.37 ### Type6-Isopleths. 'tick_text_levels':0.10. 'tick_levels':0.0. 'tick_text_levels':2. 'tick_levels':3.pdf 54 . } T_params={ 'u_min':0. 'title_distance_center':0. 'function':lambda u:log(u). 'width':10. The T-scale was broken into two parts using the extra_params scale parameter in order to swap the label sides for better readability.myreckonings. 'title':r''. and the tick side for the ladder determines which side the curves originate on. 'title_draw_center':True. 'scale_type':'log'. 'f2_params':T_params. which has a 1/u function associated with it.myreckonings. 'u_min':0.00 and 10. 'tick_levels':3.1. 'u_max':10. 'u_min':1. 'tick_text_levels':2. 'tick_levels':0. 'f3_params':R1_params.py ### 'tag':'r1-scale'.com/pynomo11/Type6-Isopleths. 1. 'u_max':20. 'u_min':1. } R2_Ladder_params={ 'tag':'r2-scale'.nomographer import * ### Type 2 Block ### S_params={ 'u_min':1. 'u_max':0. 'function':lambda u:log(u). 'title':r''.00 so they don’t collide with each other. 'extra_params':[ { 'u_min':0.75.The order of blocks and the order of scales in each block are important for arranging the scales. The PyNomo scripts and output PDF graphics are available online for download. ] } ### Type 6 Ladder Block with Aligned Scales ### R1_Ladder_params={ 'tag':'r1-scale'.0. 'u_max':10. 'tick_levels':3. 'height':10. If we had omitted the isopleth commands the connections would have been curved lines as in the example above (which I prefer.0. Notice that since we defined the isopleth intersection value at the ladder end of the first block. 'tick_text_levels':2.0.0/u. 'function':lambda u:1. 'tick_levels':3. 'isopleth_values':[[6. 'u_max':10.0. which reduces the size of the labels other than 0.9. I found I had to set the mirror_x block parameter to True in the block parameters for the ladder.1.'x'. so you may have to build the nomogram up in pieces and experiment to get these correct.0. 'function':lambda u:u.0. 'tick_side':'left'. 'tick_levels':4. 'function':lambda u:log(u). 'tick_side':'left'.0.

'f1_params':R2_params. 'title':r'\Large $Q$'.0. } W_params={ 'u_min':-10.0. 'isopleth_values':[['x'.6. } ### Type 1 3-Scale Block ### R2_params={ 'tag':'r2-scale'.0. 'paper_width':20.Ladder_params. 'title':r'\Large $W$'.0. 'title_x':10.('scale paper'. 'linewidth':'thin'.6]].7. 'f2_params':W_params.0. 'title_box_width': 5. 'function':lambda u:-u. 'tick_levels':3. 'isopleth_values':[[3. 'height':10. 'text':'\LARGE $Q = R + W$'.0.07.0. 'transparency':0.pdf'.01). 'tick_text_levels':1.0.0. } Type3_params={ 'block_type':'type_1'.5. }]. 'y':-2.'x']]. 'block_params':[Type2_params. 'height':10.0. 'transformations':[('rotate'. 'u_max':10.0. 'width':10. ]. 'function':lambda u:-u. 'title_y':-1. 'u_min':0. 'u_max':10.5.'f1_params':R1_Ladder_params. 'title':r'\Large $R$'. 'f3_params':Q_params. 'tick_text_levels':1. 'function':lambda u:u. } main_params={ 'filename':'Type6-Isopleths. } Nomographer(main_params) 55 . 'mirror_x':True. 'f2_params':R2_Ladder_params. 'circle_size':0. 'title_str':r'\LARGE $R = S^T$'.0.0. 'paper_height':13. 'u_max':10. 'isopleth_params':[ {'color':'black'.)].25. }. 'tick_levels':3.Type3_params]. 'extra_texts':[ {'x':7.'x'.0. 'width':5. } Q_params={ 'u_min':0. 'tick_levels':2. 'tick_text_levels':1.0. 'width':5. 'linestyle':'dashed'.

8 0.5 7.5 5. 7 0.5 1. 3 10 9 8 7 6 5 4 3 2 9.5 R 0.5 6. 5 0. 9 0.5 6.5 8.5 3.5 4.5 2.5 5.5 0.5 8.5 3.5 4.5 7. 6 1 0. 4 0. 2 R 0.5 2.5 1.5 R = ST Q=R+W 9.56 1 2 3 4 5 6 7 8 9 10 S 20 8 9 7 6 4 10 5 3 2 T 0.1 1 10 9 8 7 6 5 4 3 2 1 0 W −10 −9 −8 −7 −6 −5 −4 −3 −2 −1 0 1 2 3 4 5 6 7 8 9 10 Q 0 1 2 3 4 5 6 7 8 9 10 .

The \ symbol preceding sin and cos in the title simply prints them out as non-italic text even within math mode (i. The title_opposite_tick parameter places the title on the opposite side of the scale from the ticks. of particular use when the isopleth or isopleths make the nomogram harder to read or use.php/Type_4 57 .pynomo. The form of equation for this nomogram is f1 (u1 ) f3 (u3 ) = f2 (u2 ) f4 (u4 ) We will use this type of nomogram to graph the Law of Sines for a triangle: B A = sin α sin β where A and B are two sides of a triangle and α and β are the vertex angles opposite A and B. is to provide a key in the nomogram. otherwise it’s based on the F3 and F4 scales (default is ’F1 or F2’)—not set in this example • padding: the length of the scales as a fraction of the width and height. Then the straightedge is placed across the third known value (say B) and the mark. Adding a Key Another very common guide.e.5cm but I felt the α and β symbols were too close to the scale with this default value). so I added a thin space (\thinspace) between them.9)—not set in this example Earlier we saw how to add an isopleth to a nomogram as a guide for using it. To use it. a common problem when doing triangulation as part of a survey. within $ signs).org/wiki/index.38 The following two pages show the script and nomogram.. As described in the section on color on page 35. we can find the third angle as γ = 180◦ − α − β . we have also set the reference_color parameter in block_1_params to define the color of the diagonal reference line (to orange here). we can simply modify the Type 4 example given on the PyNomo site. Once β is found. providing some space between the upper ends of the scales (default = 0. I also felt that the degree sign was too close to those symbols.14 Creating a Type 4 (Proportion) Nomogram A Type 4 nomogram represents a proportional relationship between four functions of individual variables. a straightedge is placed across the known values of. and then we can use that angle on either scale and the same mark on the diagonal to find the remaining side C. A key is a small graphic showing the scale lines and 38 http://www. A and α in degrees. and the title_distance_center that places it a distance from the scale (by default 0. so the complete triangle can be defined if two angles and a side are known. and the fourth value β is found by its intersection with that scale. say. We are using here the title_draw_center scale parameter that moves the title along the scale to its center. There are two new block parameters for this Type 4 nomogram that are omitted in this example to accept their default values: • float_axis: if set to ’F1 or F2’ scaling is done based on those two scales. All three sides have this relationship A/sin α = B/sin β = C/sin γ . and a pencil mark is made on the diagonal pivot line. This example shows how a pair of sample isopleths are added to a proportion nomogram. Again.

5 6.5 4.5 9 16 • make_grid: if True. 4 There can be multiple line_params defined.5 10.5 2 −2 58 1 −1 .5 18 • draw_lines: if True. with a default of 0.5 • circle_color: the color of circles at the starting and ending points of the line segments. The key is drawn inside the nomogram 21 because there’s room for it there.cmyk.5 20 sample isopleths (and sometimes there is helpful text as well).5 • line_params: the characteristics of lines drawn on the nomogram (start/end coordinates.pdf 0 −0. with a default of black 9 8 7 6 5 • line_style:6 the style of the line segments.29]].4.myreckonings.5the ◦ can The new parameters introduced here for creating lines for theβkey be included in the main parameters of any nomogram type: 19 18.g. linewidth (e.5 3.13. draw lines on the nomogram according to the line_params parameters (False by default) 10 17.5 −0.5 15 14. style.5 8 The line_params parameter allows the following sub-parameters: 13 12.5 4 3. consisting of their color (e.5 12 11. separated by commas.5 This PyNomo script and output PDF graphic are available online for download. each with different sub-parameters.dashed).5 1.linewidth.7.39 2 3 2.thin). In this example the line_params entries in main parameters produce a key for the use of the nomogram.5 8 7 6 5 4 −2. thick and dashed A 10 • coords: the 7 x-y coordinates from the grid overlay of one or more line segments.5 39 http://www.5 12. and form (e.67. the starting and ending coordinates specified in square brackets for each segment.5 9.82]. with defaults of black.g.5 8. The 5.5 11. as shown in the figure on this page (False by 15.33. overlay a grid in cm and mm over the nomogram so that start and end coordinates of lines can be easily determined by zooming in.5 2. The example script on the next page shows values for all the sub-parameters to demonstrate their use.5 default) 14 13.com/pynomo11/Type4-Isopleths. style. 20 21.5 22 30 40 50 60 70 80 19.0.linestyle. Connected segments should include the ending coordinates of the previous segment as the starting coordinates of the new segment..5 −2.5 2 1 1. color.5 3 linewidth and linestyle names are provided in the figure on page 18.py and http://www.. The format of the color sub-parameters are described in the earlier section devoted to color. dashed lines with no circles at their endpoints.5 7.5 3 −3 −1. There’s no reason to include both the sample isopleths and the key on a 20.20. 4. in which case only coords needs to be defined.5 13.33.6. The default values sup6.myreckonings. This nomogram is shown with only the key included in the example on page 98.0].[6. style.5 8.5 9.6.5 0.67. but they are both included here simply as a demonstration. circles on endpoints) as described below 17 16.6.7.5 port standard black.0.0 for no circles 7.15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 −1 −2 −3 14..5 5.5 1 B 0.Gray).82.5 • circle_size: 5 the radius in cm of circles centered on the starting and ending points of the line segments.5 −1.5 23 22.33.5 11 10.g.com/pynomo11/Type4-Isopleths.4.5nomogram. as in 'coords':[[0.[13.

('scale paper'.py ### 'f2_params':Alpha_params. 'title_draw_center':True.01). style. 'isopleth_params':[ {'color':'Blue'. 'circle_color':color.4].0.cmyk. style. 'tick_side':'right'.0.pdf'.Black. 'transformations':[('rotate'.thin. 'function':lambda u:sin(u*pi/180.3]. 'tick_text_levels':1.[17. 'function':lambda u:sin(u*pi/180.cmyk.### Type4-Isopleths. 'title_y': -3.0.6. } from pynomo. } B_params={ 'u_min':1. 'title':r'\Large $\beta \thinspace ^\circ$'. 'f3_params':B_params.5. 'transparency':0. 'paper_width':20. 'title_opposite_tick':True. }. } Beta_params={ 'u_min':0. 'tick_levels':3.cmyk.solid]. 'title_draw_center':True.17.3. 'line_style':[color.6]. } main_params={ 'filename':'Type4-Isopleths.16. 'u_max':10. 'f1_params':A_params.thick.08.linestyle.0. 'circle_size':0.dashed].7]]. ].6.linestyle.solid].17. 'title_opposite_tick':False.Orange. } Alpha_params={ 'u_min':0.Blue.linewidth.7]].0. 'u_max':89.9.linestyle.5. 'line_style':[color.17. 'u_max':10.cmyk.0). }. 'reference_color':color. 'make_grid':False.3. Nomographer(main_params) 59 .'x'.13. 'title':r'\Large $A$'.Orange.17.Orange. 'title_distance_center':0.7]]. }.6. } block_1_params={ 'block_type':'type_4'. 'tick_side':'left'. {'coords':[[13.0. 'line_style':[color. 'circle_size':0.0.7.0.cmyk. 'title_opposite_tick':True.7].9.1.linewidth.thin. 'tick_levels':3.4.[14.[13. 'tick_side':'left'.0). style. 'paper_height':20.nomographer import * A_params={ 'u_min':1. 'circle_color':color. 'title_str':r'\LARGE Law of Sines: \ $A / \sin \alpha=B / \sin \beta$'. 'tick_side':'right'.0. 'tick_text_levels':1. 'u_max':89. 'tick_levels':3.5.4. 'title':r'\Large $\alpha \thinspace ^\circ$'.0.0. 'circle_size':0.3. 'isopleth_values':[[9.0. style. ].linewidth. 'function':lambda u:u.0.4.)].3.15. [13.50.Blue. 'title_x':10. 'circle_size':0. 'linestyle':'dashed'. 'title_draw_center':True. 'function':lambda u:u. }. 'linewidth':'thin'. 'tick_text_levels':1. 'title_box_width': 10. 'title_distance_center':0.0.Black. 'circle_color':color. 'block_params':[block_1_params]. 'f4_params':Beta_params.cmyk. 'title_opposite_tick':False.23]].3.cmyk. 'line_params': [ {'coords':[[13. 'title':r'\Large $B$'. 'draw_lines':True. style.4. 'tick_text_levels':1. 'title_draw_center':True. {'coords':[[13. style. 'tick_levels':3.

0 10 20 30 40 50 60 70 80 0 β ◦ 10 10 9 8 20 7 α◦ 6 30 A 5 40 4 50 3 60 2 70 80 1 B 10 9 60 8 7 6 5 4 3 2 1 Law of Sines: A/ sin α = B/ sin β .

Again.pynomo.org/wiki/index. The \parallel TeX command produces the symbol for parallel in the scale titles. A straightedge across R1 and R2 crosses the middle scale R1 k R2 at the value of the equivalent resistance of these two resistors. We simply create two Type 7 blocks with the u3 scale of the first block aligned by a tag with the u1 block of the second block.py and http://www. This PyNomo script and output PDF graphic are available online for download. we can simply modify the Type 7 example given on the PyNomo site.com/pynomo11/Type7-Isopleths. If we decide to scale it to a larger paper size. Then if there is a third resistor the straightedge is placed across that point on the R1 k R2 scale and the R3 scale. I’m rather tempted to add two more of these aligned blocks to get a full snowflake nomogram! Then we could continue going around the snowflake as many times as needed for any number of resistors to find the equivalent resistance.41 40 http://www. as x = 0 for an extra title lines up with the center of the first title. with the intersection on the R1 k R2 k R3 scale (which happens to line up with the R2 scale because we chose 60° angles) providing the equivalent resistance of all three resistors. You can also see that the x offset in the extra_titles parameter for the second row of the title is set to a negative number.myreckonings.php/Type_7 41 http://www. where it can be seen from extending the above formula that R1 = R11 + R12 + R13 . I was pleased to see that the two angles can be set independently. The form of this nomogram is 1 1 1 = + f3 (u3 ) f1 (u1 ) f2 (u2 ) Here we will create a classic nomogram of this form for the equivalent resistance R of two resistors placed in parallel: 1 1 1 + = R R1 R2 This relationship also exists for capacitors in series. the most common implementation of this type of nomogram. The following two pages show the script and nomogram.com/pynomo11/Type7-Isopleths.40 To extend this example we will draw a nomogram for the equivalent resistance of either two or three resistors in parallel.pdf 61 . and there are many others.15 Creating a Type 7 (Reciprocal or Angle) Nomogram A Type 7 nomogram represents functions that are related by their reciprocals. We are introducing the following new parameters specific to a Type 7 nomogram: • angle_u: the angle in degrees between the u1 scale and the center u3 scale • angle_v: the angle in degrees between the u2 scale and the center u3 scale When both angles are set to 60° the scales are identical on all three axes of a block. the scales will likely not be the same length anymore and we would have to adjust the paper width or length if we want them the same length (although they would work fine otherwise).myreckonings. as I’ve spent quite a bit of time in the past trying to find out how to design a reciprocal nomogram with unequal angles. Another common occurrence is the equivalent focal length of lenses in series.

} block_2_params={ 'block_type':'type_7'.0. 'paper_width':20. } from pynomo. 'u_min':0. 'tick_text_levels':2. 'function':lambda u:u.0. 'tick_levels':4. 'linestyle':'dashed'. 'circle_size':0. }. 'title_x_shift':0.0. } main_params={ 'filename':'Type7-Isopleths. 'title':r'\Large $R_3$'. 'title_str':r'\Large Equivalent Resistance of 3\ Resistors in Parallel'. 'function':lambda u:u.5. 'width':20.0. ]. 'f2_params':R3_params.0. 'u_min':5.0f$". 'text_format':r"$%4. 'tick_text_levels':0. 'title':r'\Large $R_1$'. } block_1_params={ 'block_type':'type_7'. 'function':lambda u:u.0f$". } R1R2_params_2={ 'tag':'r1r2'. 'title_y_shift':-4.0f$".py ### 'u_max':1000. 'f2_params':R2_params.900. 'text_format':r"$%4.0. 'title':r''.0.0.0.0.0.0. 'angle_v':60. 'isopleth_values':[['x'. 'transparency':0. 'tick_text_levels':0. 'text':r'\large $1/R = 1/R_1 + 1/R_2 + 1/R_3$'. } R3_params={ 'u_min':0. } R2_params={ 'u_min':5. 'function':lambda u:u.pdf'.0f$".0. 'u_max':1000. 'title_x': 0. 'u_max':1000.0.0. 'f1_params':R1R2_params_2.0f$".0. 'tick_text_levels':2. 'u_max':1000. 'linewidth':'thin'. 'angle_u':60.600.0. 'text_format':r"$%4. 'block_params':[block_1_params. 'transformations':[('rotate'. 'tick_levels':4. 'title_y_shift':0.### Type7-Isopleths.7. 'tick_text_levels':2. 'f3_params':R1R2_params_1. 'extra_texts':[ {'x':-3.0.5. 'height':20.5.0. 'f3_params':R1R2R3_params. 'tick_levels':0. 'u_max':1000.0. 'y':-3. 'title':r'\Large $R_1 \parallel R_2$'.0f$". 'u_max':1000.0. 'angle_u':60.0. 'title':r'\Large $R_1 \parallel R_2 \parallel R_3$'. 'title_x_shift':-10. 'tick_levels':0. 'isopleth_params':[ {'color':'Red'.nomographer import * R1_params={ 'u_min':0. 'function':lambda u:u.block_2_params]. } R1R2_params_1={ 'tag':'r1r2'. 'title_box_width': 12. 'title_y': -3. 'text_format':r"$%4. 'isopleth_values':[[650. 'tick_levels':4.0. }]. 'width':12. 'f1_params':R1_params.'x']]. 'width':20.0. 'function':lambda u:u.0.01)]. 'text_format':r"$%4. 'height':20. 'title':r'\Large $R_2$'. 'tick_levels':4. 'tick_text_levels':2. 'text_format':r"$%4. 'angle_v':60. } R1R2R3_params={ 'u_min':0. 'paper_height':20.'x']].0. Nomographer(main_params) 62 .

R3 0 95 0 85 7 50 0 90 0 0 10 R1 k R2 k R3 R2 0 65 0 80 0 55 0 70 0 45 0 60 0 35 0 50 0 25 0 40 63 0 15 0 30 50 0 20 0 10 15 0 20 0 30 0 40 0 50 0 60 0 0 70 0 80 500 450 400 350 250 300 200 50 0 50 150 100 200 250 350 300 400 450 500 550 650 600 700 750 850 800 900 950 1000 1/R = 1/R1 + 1/R2 + 1/R3 Equivalent Resistance of 3 Resistors in Parallel 10 0 100 150 50 25 0 35 0 45 0 55 0 65 0 75 0 0 85 0 95 0 90 00 10 R1 k R2 950 R1 1000 900 850 750 800 700 650 550 600 .

) The PyNomo script and output PDF graphic for both nomograms are available online for download. so the required ranges of the variables are very important in the design of the nomogram.myreckonings. we get N + MT 2 − T = 0 From the general form above.com/pynomo11/Type10-Range2.com/pynomo11/Type10-Range2. As we will see in the next section when we plot this nomogram in determinant form. We will use this type of nomogram to graph the equation M= T −N T2 If we multiply both sides of this equation by T 2 and arrange the terms on the left side. the equation under consideration is not a friendly one. But in addition to the scaling transformation to the paper size we’ve discussed earlier.16 Creating a Type 10 (One Curved Line) Nomogram A Type 10 nomogram consists of two straight scales and one curved scale.4344 42 http://pynomo. This nomogram is shown on the second page following this one.myreckonings. The script and nomogram are found on the next page.com/pynomo11/Type10-Range1. (We also had to shift the T-scale title to place it correctly in the output. the T-scale would be expected to be roughly horizontal. PyNomo actually performed a shear on the T-scale and M-scale upward so the M-scale is aligned horizontally with the N-scale in order to maximize the size of the nomogram on the paper. as the variable M can range from −∞ to ∞. so let’s limit it to −10 < M < 10.py and http://www.pdf and http://www. you can see that this is a Type 10 nomogram where u=N v=M w=T f1 (u) = N f2 (v) = M f3 (w) = T 2 f4 (w) = −T Selecting the Type 10 link on the Software Documentation page42 shows an example script for this type of nomogram for the equation u + vw + w = 0.myreckonings.php?title=Type_10 43 http://www. Let’s assume a range of −10 < N < 10 and −4 < T < 4.pdf 64 . Now let’s change our ranges to 0 < N < 10 and 0 < T < 4 and limit M to −20 < M < 0.org/wiki/index. However.myreckonings.py 44 http://www. The form of this nomogram is f1 (u) + f2 (v) f3 (w) + f4 (w) = 0. Then M must range from −∞ to ∞.com/pynomo11/Type10-Range1. Here PyNomo did much more for us than it first appears. It’s fairly simple to modify the example for what we need.

'u_max':10. 'f3_params':T_params. 65 . 'title_y':2. 'tick_levels':5. } block_1_params={ 'block_type':'type_10'. 'f1_params':N_params.0. 'tick_levels':3.### Type10-Range1.5. 'u_max':10.0. 'height':10. } Nomographer(main_params) T_params={ 'u_min':-4. 'function':lambda u:u. 'isopleth_params':[ {'color':'black'. 'linewidth':'thick'. 'paper_height':15. 'paper_width':15. 'title':r'$N$'. 'title':r'$M$'. 'transparency':0. } from pynomo. 'u_max':4. 'f2_params':M_params.5. 'tick_text_levels':2. } M_params={ 'u_min':-10.py ### 'title_y_shift':1.0. 'function_3':lambda u:u*u. } main_params={ 'filename':'Type10-Range1.0. 'title_y_shift':0.N) / T^2$'.0.'x']].01). 'title_y_shift':0.('scale paper'. 'isopleth_values':[[-4. 'tick_text_levels':2. 'linestyle':'dashed'.07.0.0. 'function':lambda u:u.5.0.5. 'circle_size':0.pdf'.0. 'title_x_shift':-1. }. 'tick_side':'right'. 'tick_levels':3.)]. 'title':r'$T$'.0.5.0. 'tick_side':'left'. 'block_params':[block_1_params].0. ]. 'scale_type':'log smart'. 'transformations':[('rotate'. 'function_4':lambda u:-u.nomographer import * N_params={ 'u_min':-10. 'tick_text_levels':5. 'title_str':r'$M = (T .0.5. 'width':10.0.

8 0.5 −0.8 −10 −1.3 1.5 M = (T − N )/T 2 −6.5 −4.65 0.5 −1 −2 −1.45 −0.7 1.5 −1.5 2 3.5 7.2 −3 −2.5 −8 −1.5 6.85 −0.8 −0.45 0.5 3 2 1.25 1.75 −0.5 −9.2 1.7 −1.25 0 −0.5 −8.1 −5 −1.5 0 −0.M N 10 10 9.75 0.5 −6.85 0.3 −6 −1.5 2.5 3.5 5.5 8.5 −7.9 −0.9 −2 −1.95 0.25 −7 −1.5 −0.9 0.5 8.5 5.65 −0.5 −4.95 −0.5 1 4 2.6 −1.5 −4 −2.55 −0.05 −1 −0.5 0.25 1 0.5 −1.5 −9.5 7.7 −0.5 −7.5 1.5 −3.5 9 9 8 8 7 7 6 6 5 5 4 4 3 3 T 2.6 0.7 0.5 1.35 0.15 1.5 4.8 1.35 −3.5 1.1 1 2 0.15 −4 −1.6 −0.5 −2.5 −3.5 4.05 0.5 −8.5 −5.5 6.5 0.5 9.5 3.55 1.5 −3 −1.6 1.4 1.9 1.5 66 −1 −2 −3 −4 −5 −6 −7 −8 −9 −10 .4 −9 −1.5 −5.

'title_y_shift':0. 'function':lambda u:u.5. 'function_3':lambda u:u*u.0. ]. 'function':lambda u:u. 'tick_side':'right'.01).### Type10-Range2.0. 'title_str':r'$M = (T . 'tick_text_levels':5. } from pynomo. 'linestyle':'dotted'.0.)]. 'height':10. } main_params={ 'filename':'Type10-Range2. 'isopleth_params':[ {'color':'black'. 'tick_levels':5. 'scale_type':'log smart'.0.'x']]. 'circle_size':0. 'tick_text_levels':2. 'transformations':[('rotate'.0. 'linewidth':'thin'. 'title':r'$M$'. 'tick_text_levels':2. } block_1_params={ 'block_type':'type_10'. 'u_max':4.5.0.py ### 'title_y_shift':-6. 'paper_height':15. 'tick_levels':3. 'u_max':0. 'title':r'$N$'.-13. 'title':r'$T$'. 'width':10.nomographer import * N_params={ 'u_min':0.('scale paper'.08. }. 'u_max':10.0. 'isopleth_values':[[6. 'paper_width':15. 'block_params':[block_1_params].2. 'f3_params':T_params.0.0. 'tick_side':'left'.0.pdf'.N) / T^2$'. 'function_4':lambda u:-u. 'f1_params':N_params.5. 'f2_params':M_params.0. 'transparency':0. 'title_y_shift':0. } M_params={ 'u_min':-20. 67 . 'title_y':2.01.5. } Nomographer(main_params) T_params={ 'u_min':0. 'tick_levels':3. 'title_x_shift':-7.

5 4 −15.5 −8. 9 85 0.5 −14.5 −10. 1 68 −1 −2 −3 −4 −5 −6 −7 −8 −9 −10 −11 −12 −13 −14 −15 −16 −17 −18 −19 −20 .5 0.5 1 95 0. 2 1. 25 1.5 5 0.5 3 9. −2.5 0.5 −12. 55 0.5 6 0.M N 0 10 43.5 0.5 8.5 2 9 −0.5 M = (T − N )/T 2 −16. 05 1.5 0.5 −17. 35 1.5 0 −1. 2. 6 0.5 −13.5 5 2.5 0.5 −19.5 0.5 0. 4 1.5 1 1.5 2 0. 15 0. 0. 1. T 8 75 0.5 −18. 45 3 −4. 5 7 0.5 5 1. 15 1. 5. 4 3. 65 4.5 −11. −3. 35 2 −5. 8 7. 7 0. 6. 3 1.5 −9.5 3 0. 25 1 −6.01 −7.

17

Creating a Type 9 (General Determinant) Nomogram

If an equation does not fall into one of the standard equation types supported directly by PyNomo, we can
convert the equation into a general determinant form for PyNomo. This provides us with the ability to draw
any nomogram, because an equation can be drawn as a classic nomogram (i.e, alignment chart) if and only
if it can be put into determinant form.45 As a benefit, there is generally no need to manipulate a determinant
into Standard Nomographic Form for PyNomo as long as no variable appears in more than one row. PyNomo
also supports equations with more than three variables in which case two variables share a row—this is called
a grid nomogram. A grid nomogram is shown in the example of this type on the PyNomo site.46
A determinant represents a particular operation on a matrix, and it is
denoted by vertical bars on the sides of the matrix. The determinant of a
3x3 matrix is given by
a11 a22 a33 + a12 a23 a31 + a13 a21 a32 − a13 a22 a31 − a11 a23 a32 − a12 a21 a33
But there are visual ways of deriving this result. In the figure on the right
the first two columns of the determinant are repeated to the right of the
original, and then the products of all terms on diagonals from upper left to
lower right are added and the products of all terms on diagonals from upper right to lower left are subtracted.
A convenient mental shortcut is to find these diagonal products by
“wrapping around” to get the three components of each term. Here the
first product we add is the main diagonal a11 a22 a33 , then the second is
a12 a23 a31 where we follow the curve around after we pick up a12 and a23
to pick up the a31 , then a13 a32 a21 by starting at a13 and wrapping around
to pick up the a32 and a21 . We do the same thing right-to-left for the
subtracted terms. This is much easier to visualize than to describe. Determinants of larger matrices are not considered here.
Let’s create the determinant form of the equation we discussed in the previous section, N + MT 2 − T = 0.
By arranging terms in the determinant positions we can find this solution:
N + MT 2 − T = 0

.

T 2 1 −T

.

.

.

.

.

.

1 0 −M .

= 0 .

.

.

.

.

.

.

0 1 −N .

.

.

Now historically a determinant such as this has to be manually transformed into Standard Nomographic Form in order to be plotted.org/wiki/index.pynomo.php/Type_9 69 . see http://myreckonings.  If you multiply out this determinant this equation becomes T 2 × 0 × (−N) +{1 × (−M) × 0}+{−T × 1 × 1}−  {−T × 0 × 0} − T 2 × 1 × (−M) − {1 × 1 × (−N)} = 0 which simplifies to our original equation.projectrho.com/nomogram/ 46 http://www. so this is a valid determinant to use for this equation.com/wordpress/2008/01/09/the-art-of-nomography-ii-designing-with-determinants/ or the webpages on the determinant forms of nomograms at http://www. in which the determinant has only 1’s in the last column and no variable in more 45 For more details.

47 But PyNomo can handle a determinant like this that is not in standard form as long as no variable is in more than one row. which should be set to the value of u_min in each of the outer two scales • u_max_trafo: the maximum value for the transformation. So here we specify this initial transformation by introducing the following new parameters: • u_min_trafo: the mininum value for the transformation.48 47 See http://myreckonings.com/wordpress/2008/01/09/the-art-of-nomography-ii-designing-with-determinants/ for the rules for transforming a determinant to standard form. The values of u_min_trafo and u_max_trafo indicate the points that will be transformed to the corners of a rectangle with sides along the x. a singularity. dividing the first row by T 2 + 1. The nomogram that is produced matches the first Type 10 nomogram from the previous section.and y-axes. By adding the first column to the second column. there is a problem for the case T = 0 in our range. −4 < T < 4 and −10 < M < 10 as we did in the previous section. and moving the third row to the top row. which should be set to the value of u_max in each of the outer two scales • transform_ini: a block parameter to set to True to indicate that an initial transformation should be performed The PyNomo script and output nomogram are shown on the following page. This PyNomo script and output PDF graphic are available online for download. where a value T = 0 will result in N = 0 and M being any number at all. swapping the first and third columns. Another clue is when the PyNomo build does not end because it is encountering large numbers due to the singularity. multiplying the second column by -1. New scale parameters specific to a Type 9 Determinant nomogram are • grid: set to False to indicate that this scale (row of the determinant) contains only one variable • f : the function in u given by the first column in the determinant row corresponding to the scale • g: the function in u given by the second column in the determinant row corresponding to the scale • h: the function in u given by the third column in the determinant row corresponding to the scale We will let −10 < N < 10. In the original equation M = TT−N 2 you can see that M is infinity when T = 0. You can also see this in the way the equation is expressed above as N + MT 2 − T = 0.than one row. Here PyNomo uses matrix multiplication to transform the nomogram such that four points on the paper end up at a different set of four points on the paper. However. we have the great advantage that we do not need to derive the determinant form as we did here. the determinant would end up as . This is an indication that we should perform an initial transformation on the scales. For an equation like this that can be expressed in one of the basic types that PyNomo recognizes.

.

.

.

.

0 N 1.

.

.

.

.

.

.

2 .

.

T T 1.

= 0 .

T 2 +1 T 2 +1 .

.

.

.

.

.

.

1 M 1.

myreckonings.myreckonings.pdf 70 .com/pynomo11/Type9-Range1.com/pynomo11/Type9-Range1. 48 http://www.py and http://www.

'title_str':r'$M = (T . 'u_max_trafo':10. 'title':r'$N$'. } Nomographer(main_params) 71 .0. } main_params={ 'u_min':-4. 'u_max':4. 'f':lambda u:0.5. 'linestyle':'dashed'. 'circle_size':0.### Type9-Range1. 'scale_type':'linear'. 'tick_side':'left'. ].0. 'g':lambda u:1.5.0.nomographer import * N_params={ } T_params={ M_params={ 'u_min':-10. 'h':lambda u:-u. 'isopleth_values':[[-4.py ### from pynomo. 'tick_text_levels':2. 'title_y_shift':1. 'tick_levels':5. 'f3_params':M_params. 'block_params':[block_params]. 'f':lambda u:u*u. 'f1_params':N_params. 'paper_width':15.'x'.5. 'h':lambda u:-u. 'u_max':10.0. 'grid':False } 'f':lambda u:1.07.N) / T^2$'. 'isopleth_params':[ {'color':'black'. 'g':lambda u:0.pdf'. 'tick_levels':3. 'scale_type':'linear'. 'transformations':[('rotate'. }. 'paper_height':15.('scale paper'. 'title':r'$M$'. 'title_x_shift':-1. 'filename':'Type9-Range1.0.0.)].0. 'u_min_trafo':-10. 'grid':False } 'u_min':-10. 'title_y':2. 'transparency':0.0.0. 'u_min_trafo':-10. 'u_max':10.0.0. 'title':r'$T$'. 'grid':False block_params={ 'block_type':'type_9'. 'tick_levels':3. 'tick_text_levels':2. 'linewidth':'thick'.0. 'u_max_trafo':10.01). 'f2_params':T_params. 'h':lambda u:-u. 'transform_ini':True.0]].5. 'tick_text_levels':5. 'g':lambda u:1.0.0. 'scale_type':'log smart'.0.

9 0.15 −4 −1.6 1.5 7.5 −1 −2 −1.2 −3 −2.5 −8 −1.6 0.5 −1.65 −0.5 −7.5 −5.5 1 4 2.4 1.5 5.5 −3.5 −4.85 −0.8 0.55 −0.95 0.5 −9.5 7.5 0.5 4.5 3.5 72 −1 −2 −3 −4 −5 −6 −7 −8 −9 −10 .5 6.95 −0.8 −10 −1.5 5.2 1.9 −0.5 9.65 0.7 −0.5 −8.5 −0.M N 10 10 9.9 1.9 −2 −1.25 −7 −1.35 0.45 −0.5 −6.3 1.5 2.7 −1.5 −0.25 1.25 1 0.5 −5.55 1.5 0 −0.5 3 2 1.75 0.5 −4 −2.05 −1 −0.5 −8.15 1.5 −1.5 6.5 −4.5 3.5 −2.6 −0.25 0 −0.5 9 9 8 8 7 7 6 6 5 5 4 4 3 3 T 2.5 8.45 0.7 1.8 −0.35 −3.5 M = (T − N )/T 2 −6.5 −3 −1.4 −9 −1.5 1.05 0.7 0.5 4.75 −0.5 0.5 1.5 −7.85 0.5 1.1 1 2 0.5 −9.5 2 3.8 1.1 −5 −1.5 −3.5 8.6 −1.3 −6 −1.

we would find that we get the same sheared result as we obtained in the previous section. We would like to have this in order to maximize the size of the nomogram on the paper.('polygon'.myreckonings. You can see that unlike our Type 10 plot there is no automatic shearing of the T-scale and M-scale upward so the M-scale is aligned horizontally with the N-scale. really.py and http://www. This nomogram is shown on the following page.pdf 73 .49 49 http://www.)]. if we were to replace the transformations line from 'transformations':[('rotate'.0. and then applying a mathematical operation for a shear transformation to the determinant. In the script on the following page. with the center scale rotating along with them as if the scales were linkages.)]. But here’s where the polygon transformation of PyNomo helps us so much.01).01).('scale paper'.).('scale paper'. It’s not a lot of fun to do this. to 'transformations':[('rotate'.0.Now we’ll change our ranges to 0 < N < 10. This PyNomo script and output PDF graphic are available online for download.com/pynomo11/Type9-Range2. 0 < T < 4 and −20 < M < 0 as we did in the second Type 10 example of the previous section. The shear effectively slides the outer scales vertically. one that provides individual scale factors for M and N so they can be made the same length. To adjust our determinant to do this involves looking up the most general form of the standard determinant for this equation.myreckonings. pushing the right scale up until the outer scales are aligned leftto-right.com/pynomo11/Type9-Range2.

'g':lambda u:0.### Type9-Range2. 'transformations':[('rotate'. 'title_y':2.0. 'u_max_trafo':10. 'u_min_trafo':-10. 'u_max':4. 'grid':False block_params={ 'block_type':'type_9'. 'paper_height':15. 'grid':False } 'u_min':-20.py ### from pynomo. 'g':lambda u:1.0. 'tick_levels':3. 'scale_type':'linear'. 'tick_levels':3. 'tick_text_levels':2. ].0. 'paper_width':15. 'title':r'$N$'. 'h':lambda u:-u. 'block_params':[block_params].0. 'circle_size':0.5. 'f':lambda u:u*u.0.01).-13]]. 'u_max':0.0. 'isopleth_values':[[6. 'transparency':0. 'title_str':r'$M = (T . 'linewidth':'thin'.nomographer import * N_params={ } T_params={ M_params={ 'u_min':0. 'scale_type':'linear'.0. 'transform_ini':True. } Nomographer(main_params) 74 . 'u_max':10.)].1. 'f2_params':T_params. 'linestyle':'dotted'. }.2. 'u_max_trafo':10.'x'. 'tick_text_levels':5. 'filename':'Type9-Range2. 'title':r'$M$'.5.0.08. 'title_y_shift':0. 'scale_type':'log smart'. 'f3_params':M_params. 'tick_levels':5. 'f1_params':N_params. 'f':lambda u:0. 'tick_side':'left'. 'u_min_trafo':-10.pdf'.0. 'h':lambda u:-u.0.0.0. 'tick_text_levels':2.('scale paper'.N) / T^2$'. 'g':lambda u:1. 'title_x_shift':-1. 'h':lambda u:-u. 'title':r'$T$'. } main_params={ 'u_min':0. 'grid':False } 'f':lambda u:1. 'isopleth_params':[ {'color':'black'.0.

25 7 8.5 −8.05 9 9.3 0.5 −9.5 1.5 1.75 0.2 0 T 1.5 −3.5 M = (T − N )/T 2 −14.5 −19.55 0.5 −17.25 0.1 1.35 1.5 1.65 0.7 0.5 2.5 0.5 1.8 1 2.35 0.5 1.7 0.9 2 3.5 −4.5 −11.85 0.8 0.1 8 1.5 75 0 −1 −2 −3 −4 −5 −6 −7 −8 −9 −10 −11 −12 −13 −14 −15 −16 −17 −18 −19 −20 .5 −18.5 −5.5 1.5 −2.5 0.6 0.5 −15.15 10 −0.2 5 6.45 0.5 1 −1.5 −13.5 −12.5 1.4 6 7.5 −16.4 0.5 −7.5 3 4.95 0.9 0.5 2 0.6 4 5.5 1.3 1.5 −10.5 −6.N M 3 4 3.5 1.

A Grid Nomogram We can plot a nomogram for an equation of up to six variables using this Type 9 determinant form if we can find a way to express the determinant with no more than two variables per row and no variables used in more than one row.50 The celestial navigation example on the PyNomo site is also a grid nomogram created as a Type 9 determinant form. Notice that no variables appear in more than one row. . This second row will result in a grid where the effective scale point is the intersection of the curves for the given values of k and θ . Each row having two variables is plotted as a grid rather than a curvilinear scale—the Type 9 example on the PyNomo site shows how the grid parameters are specified.51 This is a very useful capability—grid nomograms are striking in appearance but very tedious to draw by hand! Let’s draw a nomogram for the following relation based on its determinant form. and the second row contains two variables.

.

.

0 .

.

.

.

100 cos θ .

1+cos θ .

.

.

100 .

m = k sin θ + l cos θ .

.

m 1.

.

.

.

.

=0 k sin θ +100 cos θ 1 .

1+cos θ .

.

100 − l 1.

.

com/wordpress/2008/03/13/a-4-variable-nomogram-%e5%9b%9b%e5%8f%98%e9%87%8f%e8%af%ba%e6%a8%a1%e5%9b%be/ Also see the comments at the bottom of this post and the paper on applying shear transformations to the nomogram at http://www.myreckonings.php/Type_9 51 http://www. New scale parameters specific to a Type 9 Determinant nomogram with at least one grid are: • f_grid: the function in u and v given by the first column in the determinant row corresponding to the grid scale • g_grid: the function in u and v given by the second column in the determinant row corresponding to the grid scale • h_grid: the function in u and v given by the third column in the determinant row corresponding to the grid scale • u_start: the starting value of u in the grid scale • u_stop: the ending value of u in the grid scale • v_start: the starting value of v in the grid scale • v_stop: the ending value of v in the grid scale • u_values: values of u (if specified) in the grid scale • v_values: values of v (if specified) in the grid scale • text_prefix_u: text to add before every value of u in the grid scale • text_prefix_v: text to add before every value of v in the grid scale • u_texts: text to add before each value of u specified by u_values in the grid scale 50 http://www.org/wiki/index.pynomo.php/Example:Star_navigation 52 http://myreckonings.52 but you can expand the determinant to verify that it produces the same equation given above it.com/wordpress/wp-content/uploads/FourVariableNomogram/FourVariableNomogramShaping033008.org/wiki/index.pynomo.pdf 76 . This nomogram was designed by Liunian Li. and his derivation is provided in another essay.

g_grid and h_grid. Here we also set u_line_color and v_line_color to better distinguish the grid lines. We will assign θ to u and k to v. as well as text_distance.k and add 'tick_side':'left'.com/pynomo11/Type9-Grid-Isopleth.53 53 http://www. Then we could change the title of the m-scale to m. u_stop. in m_params to move its labels to the left side of the scale.• v_texts: text to add before each value of u specified by v_values in the grid scale • u_texts_v_start: set to True if the labels for u should lie at the starting values of the v curves in the grid scale • u_texts_v_stop: set to True if the labels for u should lie at the ending values of the v curves in the grid scale • v_texts_u_start: set to True if the labels for v should lie at the starting values of the u curves in the grid scale • v_texts_u_stop: set to True if the labels for v should lie at the ending values of the u curves in the grid scale • text_distance: the space between the label and the grid • u_line_color: the color of the u curves • u_text_color: The color of the u-scale labels • v_line_color: the color of the u curves • v_text_color: The color of the v-scale labels The PyNomo script and nomogram are shown on the following two pages.pdf 77 . To clean up this nomogram we could set u_texts to all empty '' strings in theta_k_params to remove the k-scale labels. so there really is no need to have both sets of labels.myreckonings. Notice that it happens that the scale values of m and k line up with each other at θ = 90. This PyNomo script and output PDF graphic are available online for download. The start and stop values for these are specified in u_start.com/pynomo11/Type9-Grid-Isopleth. The u_values and v_values parameters are specified because we only want the grid curves to be constructed for those specific values of θ and k.myreckonings. u_texts_v_stop. I could have chosen a common text prefix to add to the labels using text_prefix_u and text_prefix_v. so there I set it to the word theta. (For some reason using \theta produces θ in the text prefix parameters but not in the individual text values. while u_min and u_max are still needed in case we align (tag) another curve to the u-scale (which we are not doing). resulting in a nomogram with better readability. where only one value has the prefix. but I didn’t want “θ =” and “k =” for every value so I commented out these lines and specified the complete label for each value of u and v with u_texts and v_texts.py and http://www.) We set the True/False values of u_texts_v_start. The grid parameter is set to True to indicate a grid scale and f . v_texts_u_start and v_texts_u_start to place the grid labels where we want them. v_start and v_stop. g and h parameters are replaced by f_grid.

0. } theta_k_params={ 'u_min':10.'30'.0.'80'. 'grid':False.'140'.30. 'v_line_color':color.'120'.40.[60. 'tick_levels':3. 'h':lambda u:1.'x']] } main_params={ 'filename':'Type9-Grid-Isopleth.0.'40'. 'isopleth_params':[ {'color':'black'.cmyk.v:1.0.0]. 'circle_size':0. 130. 'f':lambda u:100.0. 'u_start':10. # default value 'v_texts_u_stop':True.0.90. 'u_max':90. 'u_text_color':color. 'linestyle':'dashed'.0)+ 100. 'title_box_width': 6.Red.10. 'title':r'\Large $m$'.'40'.0. } Nomographer(main_params) 78 .0.0.'50'. 'v_values':[0.0-u.'30'. 'tick_levels':3.0. 'g':lambda u:u.0))/(1+cos(u*pi/180.v:100. 'u_line_color':color. 'title_x_shift':0.pdf'. #'title_y_shift':0.0.50. 'f_grid':lambda u.('scale paper'.0.0.'50'. 'g_grid':lambda u.5.'80'. 'title_str':r'\Large $m = k sin \theta + l cos \theta$'. 'h':lambda u:1.60.80.0.110. 'block_params':[block_params].0. 'paper_height':15.0.0. 'u_max':150.0. #'text_prefix_v':r'$k$='.0.100.'20'. # default value 'u_texts_v_start':False.0.'100'.0*cos(u*pi/180.0.'90'].08. 'scale_type':'linear'. 'grid':True. 'linewidth':'thin'.20.### Type9-Grid-Isopleth. 'title_x': 8.0.0.4. 'u_values':[10.0.cmyk.01).'60'.0. 'k = 70'.0. 'tick_text_levels':2.130].Red. 'v_texts':['0'. 'v_stop':150. 80.cmyk. block_params={ 'block_type':'type_9'.'150']. '130'.0. 'transform_ini':False. 'tick_text_levels':2. } l_params={ 'u_min':0.90. 'u_max':100. 'transparency':0.0].Green. 'f3_params':l_params.60. 'u_stop':90.'90'.0)).0. # default value 'u_texts_v_stop':True.)]. '70'. 'transformations':[('rotate'. 'f':lambda u:0.v:(v*sin(u*pi/180.0.py ### #'text_prefix_u':r'$\theta$='. } from pynomo. 'u_texts':[''.4. 70. }.30.140. 'title':r'\Large $l$'.Green.0)/ (1+cos(u*pi/180. 'paper_width':15.'110'. 'v_start':0. # default value 'text_distance':0.40.5. 'h_grid':lambda u.0)).nomographer import * m_params={ 'u_min':0.50.0.0.'20'.'10'.0.cmyk.20. 'scale_type':'linear'.0.'theta = 60'.0.0*cos(u*pi/180. 'grid':False. 'title_y': 0.0. 'f2_params':theta_k_params. 'title_x_shift':0.0. 'isopleth_values':[[135.0. 'f1_params':m_params. ]. 'g':lambda u:100.150.0. 'v_texts_u_start':False. 'v_text_color':color.0.120.70.0.0.0.

90 150 m 130 130 125 120 70 140 135 theta = 60 140 80 150 145 120 50 115 110 110 l 40 105 100 100 30 95 10 90 90 15 85 20 80 80 30 70 35 65 40 60 60 45 55 50 40 20 25 75 k = 70 50 50 55 45 60 40 65 35 70 30 30 25 20 15 10 5 0 5 75 80 20 85 10 m = ksinθ + lcosθ 90 95 100 0 0 79 .

We are going to create a circular nomogram. a form in which one scale on a circle provides two values when the straightedge crosses it. but when expressed in this form the first scale becomes a circle. but you can expand the determinant here if you want to verify that it does indeed produce our equation. The determinant appears overly complicated for this simple formula.A Circular Nomogram Let’s do one more nomogram from the determinant form. This nomogram provides the roots of the quadratic equation q2 − aq + b = 0. q2 − aq + b = 0 . The derivation of this form of the determinant is provided elsewhere54 .

.

.

.

.

q .

.

q2 +1 q21+1 1.

.

.

.

.

.

1 0 1.

.

= 0 .

a .

.

.

.

.

0 −1 1.

.

.

Otherwise it would be an ellipse. b−1 The script and nomogram are found on the following pages. Actually. If it intersects the circle in two places.55 54 http://myreckonings. If it misses the circle entirely there are no real roots. The scale parameter extra_params is used to break the scales into different ranges to change from linear to logarithmic scaling and to avoid intervals where values go to infinity (a = 0 or b = 1). Finally.myreckonings.pdf 80 . but this is a rough estimate of the final size of the nomogram.py and http://www. the b-scale value turns out to always be the product of the two values on the q-scale. which works perfectly well but doesn’t look nearly as striking as a circle.5×30. three things can happen. ranges with no tick marks or labels are provided for the q-scale and a-scale to extend their lines closer to the origin to bring the circle closer to closure (full closure would require the variables to go to infinity).com/wordpress/2008/01/09/the-art-of-nomography-iii-transformations/ 55 http://www. so in the end I tweaked the values to 25.com/pynomo11/Type9-Circular.4cm to get the q-scale to be perfectly circular (which I did by overlaying the nomogram with a grid by setting make_grid to True in the main parameters). The q-scale curves until it is upside down.com/pynomo11/Type9-Circular. When a straightedge is placed across particular values of a and b. those two values of q are the two real roots of the equation (the values of q from the quadratic formula that solve the equation). that value is the one repeated real root (where the discriminant B2 − 4AC in the quadratic formula is zero). or no real solutions to the equation (B2 − 4AC < 0). The page size to scale to was originally set to 25×25cm. which would normally switch the side of the ticks and labels on the bottom half of the circle to keep the labels mostly upright. If it grazes the edge of the circle as a tangent.myreckonings. This PyNomo script and output PDF graphic are available online for download. so we also set the turn_relative parameter to True for that scale to allow them to follow around the circle.

0. 'title_y_shift':0.0. 'text_format':r"$%3. 'grid_length_3':0.01). 'tick_levels':5. 'text_distance_0':0. 'text_distance_2':0. 'tick_levels':5. 'title':r'\huge $q$'. 'grid_length_2':0. 'grid_length_1':0. 'g':lambda u:0. 'grid_length_0':0.20.25.15.3. 'scale_type':'linear smart'.5. } } } ] 'tick_levels':5. 'title_str':r'\Huge $q^2-aq+b=0$'.0. 'text_distance_4':0.35.20. 'grid_length_3':0. 'tick_levels':5. 'grid_length_1':0.30. 'title':r'\huge $b$'. 'tick_text_levels':5. 'grid_length_4':0. 'text_distance_3':0.20. 'base_stop':50.25. 'title_y_shift':-0.0.1. 'g':lambda u:-1/(u-1). 'grid_length_2':0. 'scale_type':'log smart'. 'turn_relative':True. 'transformations':[('rotate'. 'tick_text_levels':0. 'extra_params': [{ 'u_min':-50.15.0. 'u_max':15. 'grid_length_0':0. 'grid_length_1':0.('scale paper'. 'extra_params': [ { 'u_min':-50. 'text_distance_2':0. 'h':lambda u:1. 'u_max':50. 'tick_levels':5. 'title_box_width': 6.)].py ### from pynomo.30. 'text_distance_3':0. 'text_distance_0':0.55.0.5.0. 'scale_type':'log smart'. 'base_start':-50. 'h':lambda u:1. 'scale_type':'log smart'. 'paper_width':30.0. 'paper_height':25.3g$ ". }] } A_params={ 'u_min':1. 'grid_length_2':0. 'f3_params':B_params.20.0.### Type9-Circular. 'title_y': 21. 'text_distance_1':0. } Nomographer(main_params) 81 . 'transform_ini':False. 'grid_length_0':0. 'grid_length_4':0. 'f':lambda u:0. 'grid_length_3':0.20. 'title_x_shift':-1. 'extra_params': [{ 'u_min':0. 'title_x':7.5. 'text_distance_2':0.15.55. 'text_distance_3':0. 'u_max':-1. 'u_max':0. 'block_params':[block_params]. 'tick_text_levels':5.3.55.01.25.3.4. 'scale_type':'log smart'. 'text_distance_1':0. 'text_distance_0':0.0. 'grid_length_4':0.0.25. 'f':lambda u:u/(u**2+1).35. 'title':r'\huge $a$'. 'tick_levels':0.0. { 'u_min':4.4. }. 'f1_params':Q_params.5. 'scale_type':'log smart'. 'u_max':50.3. 'u_max':-0. } main_params={ 'filename':'Type9-Circular.8.35. 'tick_levels':5. 'title_x_shift':7. block_params={ 'block_type':'type_9'. 'u_max':50.2.15. 'make_grid':False. 'text_distance_4':0.pdf'.0.30. 'tick_text_levels':5.0. 'tick_text_levels':5.15.nomographer import * Q_params={ 'u_min':-50. 'text_distance_1':0.0.15.0. 'text_distance_4':0. } ].0. 'title_y_shift':-2. 'f':lambda u:1/u. 'h':lambda u:1.20. 'tick_text_levels':5. 'scale_type':'log smart'. 'title_x_shift':-7. 'g':lambda u:1/(u**2+1).5. 'f2_params':A_params. 'tick_text_levels':5. B_params={ 'u_min':-10.

65 2 2.35 0 .5 5 1 1.55 −0.2 1.75 −0.6 −1.15 −0 − − − − 0.5 6 7 8 20 6.05 1 1.6 −0.45 −1.8 1. − 1. − 35 0.4 −2 −2.5 5 4 5. −0 25 0.7 −0.2 −1.07 0.25 1.1 q 2 − aq + b = 0 0. −0.2 1. − 9 1. −0.7 −1.05 15 10 −10 5 3.15 −1 −1.45 −0.95 −1 −1 −1.7 1.15 4 4 −0.6 −1 7 1.45 1.85 −0.9 −0.5 1.15 1.9 2.3 −1. 0.2 0.1 5 0.8 −1.4 5 1.7 0.5 1.1 1.05 0.5 82 5.65 0.8 −0.95 −0.3 5 1.4 1.0.2 1.1 q 0.85 0.5 2.45 −1 .9 0. − 0.4 −1.55 1.2 3 3.5 −4 −5 −4.1 −1.3 5 55 0.5 4 4.5 −2.1 −1. −8 4 −4 3 − 3 5 2.1 −1. −0.25 3 −1.25 b 5 0.1 0 −0.5 −1.5 −1. −0.4 −0 .1 0.1 1.7 5 5 0.5 4.5 1.3 1.4 −1. .2 0.7 −0.75 1.2 1.4 −1 . 0.7 −0. 25 0.3 −2. 7 1.6 0.8 0.01 45 0. 35 3 −0.65 −1. 5 − −50 −20 −15 −5 −6 −7 −8 −5 .5 −1.05 .25 −1.3 1.5 5 4.5 −0. 5 − −4 .5 −1 −2 .3 2.05 1.8 −0.6 −2.5 15 −50 50 10 8 7 a 6 7 8 15 20 50 −10 −20 −15 −8 −7 −6 −5.6 1. 55 −0 .25 0.65 5 0.5 −3 −3.6 −0.35 −1.15 −1.9 −0. 3 −0.6 −0.5 10 6 5. 9 −4 −4. 45 .55 −1.15 0.5 −10 3.35 −1 .2 0.75 −1. −5 −6 .05 −1.2 −0 .1 1.35 1.4 1.4 2.5 2.3 −1.1 −1.03 0.9 −2.2 −1. 8 −3 2 − 2 −3.15 −1. − 8 1.5 −2.05 0.25 1.

This contour block provides the relationship between the Photocathode Illuminance.php/Type_5 and http://www. You do the reverse if navigating from the left.pynomo.org/wiki/index. but it can also be part of a larger nomogram. There are a few examples involving contour blocks on the PyNomo site.org/wiki/index.pynomo. This is often seen by itself as a graph with multiple curves as shown in the figure below. the Scene Contrast. You may notice that we’ve already created the nomogram portion to the left of the contour block (see page 29) and the portion below the contour block (see page 52).pynomo. then horizontally to meet the y-axis.56 A well-known electro-optic nomogram from the RCA Electro-Optics Handbook shown on the next page includes this contour block in the upper-right corner.org/wiki/index. 56 http://www.php/Photography_exposure and http://www. If you’re navigating the nomogram from below with a straightedge and encounter the x-axis. where the y-value is found from a particular x-value by the curve for a particular value of a third variable.org/wiki/index. After we create the contour block here we’ll connect all three parts together (using tags to align the outer scales) to recreate this entire nomogram in vector form with PyNomo.php/Example:Amortized_loan_calculator and http://www.18 Creating a Type 5 (Contour) Nomogram A Type 5 nomogram consists of an x-y plot of a family of curves. at which time you continue navigating the nomogram with the straightedge.pynomo. and the Contrast-Limiting Resolution of a camera.php/Example:Radio-frequency_single_electron_transistor 83 . you simply move parallel to the y-axis until you hit the curve for the particular Contrast value.

84 .

20.134 )) + v/150 (x + 0. denoted here by the variable v.com/agrapher/ 85 .57 I started experimenting by plotting equations and adjusting constants and terms until I had a close match (Advanced Grapher can do curve-fitting.2)2 where x is the exponent of 10 from the original contour block and v = 10. First. I figured that a sinusoidal curve might be the simplest type of function to fit.alentum. This equation took quite a while to come up with. Do you see how the second term gets large as x approaches zero to give a boost so the sine term doesn’t drop off there? 57 http://www. but here we also have this third variable v. The small squares are the actual values I read off of the contour block. 30. Therefore. With an easy-to-use shareware package called Advanced Grapher that I’ve happily used for at least 10 years. but again only for one dependent variable). I didn’t have the equation for the family of curves since it was derived from experimental data. and the colored curves are my best fit to them: y = 1.36(x + 4. My initial results are shown in the screen capture below. so I had to make educated guesses and make adjustments to find a good fit.5 sin(0. 50 and 100 is the Contrast variable. although I’d have to add something near the yaxis to prevent it from dropping back down again. Each curve is made up of a relatively straight section followed by a flattened section. There are tools for fitting a single curve as y = f (x). I needed to do some curve fitting to find an equation that would provide the x-y curve for every value of the Contrast. We are interested in the curves to the left of the y-axis.The construction of the nomogram for this contour block turned out to take some effort.25 × 200.

50 1.70 2. So I changed x to −x in the equation.00 7. The way the Type 5 nomogram is constructed is to take the y-value and the v-value and find the x-value that produces it.80 2.90 0. where there 86 .30 Photocathode Illuminance (log10 (lux)) Contrast Limiting Resolution vs. Photocathode Illuminance for an Image-Intensifier Photocathode Responsivity of 200µA/lm It’s plotting the correct set. not the ones I wanted from x < 0.60 1.60 2. realizing that the resulting x-axis would be the negative of the exponent in the original contour block.00 4.00 6.60 0.90 2.80 0.40 2.10 1.10 0.30 2.50 2.90 2. It worked for only two of the v-values: 40 t %% 20 30 10 50 100% Contras 30 Contrast Limiting Resolution (Line Pairs/mm) 20 10 1 2. and the wrong set is chosen. but the curves stop where they curve upward.00 5.20 1. Here there is more than one x.80 1.The final PyNomo script will be seen shortly.00 1.00 Photocathode Illuminance (-log10 (lux)) Contrast Limiting Resolution vs.00 3.70 1.20 2.00 1.40 1. or in other words.30 1.50 0.40 0.70 0. Photocathode Illuminance for an Image-Intensifier Photocathode Responsivity of 200µA/lm You can see that it plotted the curves from the x > 0 part of the curve. but here’s the result of using the equation above in it: 100 % 50 % 30 % t = 20 % tras Con % 10 40 30 Contrast Limiting Resolution (Line Pairs/mm) 20 10 1 2.

New block parameters specific to this are: • manual_x_scale: if True. and it’s given the tag illum so we can attach the nomogram below it.are two values of x for a given y. manual line. axis is treated as reference line that is a turning point • u_tick_levels: the level to which the tick marks are printed for the u-scale • u_tick_text_levels: the level to which the tick labels are printed for the u-scale • u_title_opposite_tick: if True. The lesson here is to use a simple. For example. and it’s given the tag resolution so we can attach the nomogram on the left to it later.25 × 200. only block and main parameters. non-undulating function for the contour block. polynomial functions will not work if a local minimum or maximum occurs in the range covered by the contour block. You can see how constants and formulas can be defined at the top of the script for convenience. draw a line between the tick mark and the label for manual axis data • x_corr and y_corr: x and y offsets in cm of the labels for manual axis data • u_title: the title of the u-scale • scale_type_u: type of scale (linear.15 + v/200)2 Finally it worked. The variable wd is the x-axis.5cm by default) • u_title_draw_center: if True.nn is the default) for the u-scale 87 .5 sin(0. First. The variable v is the Contrast value.36(−x + 4. So I played around with my original curve-fitting equation until the curves were sufficiently flat in that area that they did not curve upward. y = 1.134 )) + v/150 (−x + 0. manual arrow or manual point) for the u-scale • u_tick_side: the side of the scale to print the tick marks and labels for the u-scale • u_tag: scales with the same tag are aligned (overlaid) in the final nomogram • u_reference: if True. These variable names are defined in PyNomo and must be the ones used. place the centered title on the opposite side from the tick marks for the u-scale • u_title_distance_center: distance of the title from the u-scale center (0. log.2 f ” or nnn. there is only one parameter set (a block parameter set) rather than separate ones for the block and individual scales. There are no scale parameters for a Type 5 Contour block. define the minimum and maximum values of x with x_min and x_max (this scale is normally wd) • x_min: minimum value of x (this scale is normally wd) • x_max: maximum value of x (this scale is normally wd) • u_scale_opposite: place the u-scale on the opposite side of the block • u_func: the function of the variable for the u-scale • u_values: values to plot for the u-scale • u_manual_axis_data: a list of custom labels to write for each u_value • draw_line: if True. There are also a number of new parameters specific to this Type 5 nomogram. The script and output nomogram are shown on the following page. Here the variable u is the y-axis. locate the title at the center of the scale point of the u-scale • u_text_format: the number of digits to the left and right of the decimal point in the tick labels (r”%3.

myreckonings. the x and y offset of the label. I left the wd-scale as a default linear scale. draw equally-spaced horizontal grid lines (not related to values on the y-axis) as a visual aid (False by default) • vertical_guides: if True. respectively (where the ’x’ entry for wd value means that it is computed from the other two values).com/pynomo11/Type5-Isopleth. The isopleth_values entries are for u.myreckonings. there are also analogous parameters for the v and wd scales. or −log(Illuminance).com/pynomo11/Type5-Isopleth. v and wd.py and http://www. The u_scale_opposite parameter is also set to True to move the labels on the u-scale to the left side of the block rather than the right. where mirror_x flips the wd-scale (if it were used. The minimum and maximum values of wd. We set u_values and v_values to specific values we want plotted for the Resolution and the Contrast. It works very nicely.pdf 88 . draw equally-spaced vertical grid lines (not related to values on the y-axis) as a visual aid (True by default) • u_axis_color: The color of the u-scale axis (or family of curves if the v-scale is specified) • u_title_color: The color of the title text of the u-scale • u_text_color: The color of the u-scale labels Also. however. In order to prevent the Contrast curve labels from overlapping. Here we set u_func to log10(u) to make the y-axis a simple logarithmic scale. but I could have made it logarithmic by setting the parameter scale_type_wd to log. mirror_y would flip the u-scale). I left the colors of the u/v/wd scales at their default color of black. and the draw_line flag to draw a line between the end of the curve and the label.• u_align_func: the function used to align the u-scale with another scale with the same • horizontal_guides: if True. I had to indicate in its title that the value is actually the negative of the exponent of the actual Photocathode Illuminance. tick level and tick text levels we’ve seen for all scales before. The wd-scale (the x-axis) has the same title. we use the v_manual_axis_data parameter to specify the specific label text for each curve. and we set v_func to the equation above in x and v (this may not seem to make sense but that’s the way it works).58 58 http://www. for each parameter above that contains u. are set by the x_min and x_max parameters. The paper width and height in the main parameters give the contour block the size ratio I was looking for. This PyNomo script and output PDF graphic are available online for download. To get the contour block oriented as I wanted required setting the mirror_x parameter to True.

0.'x']].0. 'transformations':[('rotate'.0.100. 'height':13.2. 'block_params':[block_20_params].py ### 100. 'u_title':r'Contrast Limiting Resolution \ (Line Pairs/mm)'.0.0.0. 'draw_line':True}].0.40.0.2.25 .0. {'x_corr':0.0. 'u_scale_opposite':True. 'isopleth_params':[ {'color':'black'.0.0]. 'y_corr':-. 'y_corr':0. 'wd_title_distance_center':2.4. 'linestyle':'dashed'. {'x_corr':0.0. } def f1(x.0.0.pdf'.7.30. 'title_str':r'Contrast Limiting Resolution vs. 'draw_line':True}]. 'paper_height':10. main_params={ 'filename':'Type5-Isopleth. } Nomographer(main_params) 89 .20. 'title_y': -4. 'draw_line':True}].0:['$50 \%$'. {'x_corr':0.nomographer import * const_A const_B const_C const_D const_E const_F = = = = = = 1.3. 'wd_title':r'Photocathode Illuminance \ (-log$_{10}$(lux))'.08.0:['$10 \%$'. 'u_values':[1.0.8.0. 'u_func':lambda u:log10(u).0. 'x_max':7.0.\ Photocathode Illuminance for an Image-Intensifier\ Photocathode Responsivity of 200$\mu$A/lm'. 'u_tag':'resolution'.15 }.50. 50.0.20.0. 'y_corr':0. 30.0. 'wd_tick_text_levels':1.1. 'transparency':0.1. 'draw_line':True}].134 150 0. 'circle_size':0. 'v_title':r'Contrast'.5 0.)]. 'y_corr':. 6.01). 'draw_line':True}].v): return const_A*sin(const_B*(-x+const_C*v**const_D))+ \ (v/const_E)/(-x+const_F+(v/200))**2 block_20_params={ 'block_type':'type_5'. {'x_corr':0. 'title_box_width':20.5. 'manual_x_scale':True.0]. 10.0:['$100 \%$'. 'u_text_format':r"$%3.45.0. ]. 'isopleth_values':[[15. 'wd_tag':'illum'. 'linewidth':'thin'. 'wd_tick_levels':3. }.('scale paper'.0.0:['$20 \%$'. 20.0. 'v_values':[10.36 4. 'width':10. 'paper_width':20. 'v_manual_axis_data': { 10. 'x_min':1.0. from pynomo.0.3. 'y_corr':-.0.22.2. 'wd_tick_side':'right'.0f$ ".5.9.3. 'mirror_x':True. 'v_func':f1.2f$".0:['$30 \%$'.### Type5-Isopleth.30.20.22. {'x_corr':0. 'wd_text_format':r"$%3.

5 to 7. Beyond the change of units of the x-axis in the contour block the individual nomograms combine to make up the nomogram in the Electro-Optics Handbook. We add tags to the end scales of the earlier two nomograms so they will align with the x-axis and y-axis of the contour block.com/pynomo11/EO-Isopleths. we replace log(u) in that scale of the lower nomogram with -u over the same range 1. We’ve constructed a very complicated nomogram here by building smaller pieces and connecting them together. Isopleths are also drawn as guidelines.59 59 http://www.myreckonings. Then the other nomogram blocks will line up as we want relative to those axes.100% 40 30 50% rast 30% Cont 20% 10% Contrast Limiting Resolution (Line Pairs/mm) 20 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 Photocathode Illuminance (-log10 (lux)) Contrast Limiting Resolution vs.pdf 90 . So we take the three scripts and put them together into one very large script. For those aligned scales we also remove the titles. as you can see if you zoom in on it.com/pynomo11/EO-Isopleths. Because the x-axis of the contour block is now a linear scale of the exponent of the actual value. I found originally that the lower nomogram blocks proceeded vertically upward from the x-axis of the contour block rather than downward. but changing the order of those blocks in the main parameters caused them to proceed downward instead. the nomogram on the lower right found on page 52. Photocathode Illuminance for an Image-Intensifier Photocathode Responsivity of 200µA/lm An Electro-Optic Nomogram Now we have the three nomograms needed to recreate the entire electro-optic nomogram on page 84: the nomogram on the left side found on page 29.myreckonings. A good number of lines of the script are added here simply to place text onto the nomogram—this is a heavily annotated nomogram. It looks very nice when printed on large paper. I suggest listing the contour block first in order to lock in the orientation of its axes. The order of the blocks listed in the main parameters turns out to be important in orienting the blocks in the overall nomogram. The PyNomo script and output PDF graphic are shown below and are available online for download. and the contour block we just designed.py and http://www. tick marks and tick labels so we don’t duplicate those on the contour block (after we verify that they match).0 and plot it as a linear scale.

'title_y_shift':0. 'tick_side':'left'.''].0:'2'.1f$". 'extra_titles':[ {'dx':-1.0f$".8.nomographer import * Target_Size_meters_params={ 'tag':'size'. }] } from pynomo. 'text_format':r"$%3. 'f_params':[Range_meters_params. 'extra_titles':[ {'dx':-1. #'title':r'Resolution'.25.0:''. 'title_x_shift':0. 'text':r'\small $m$'. 'tick_side':'left'. 'function':lambda u:log10(u). 7. 'height':10. 'scale_type':'log'.nomographer import * ######################################################## ########## Previous Type 3 Example 2 Nomogram ########## ######################################################## from pynomo. 'tick_levels':0.### EO-Isopleths.1f$". # Remove titles.0:'6'.'x'. ### TYPE 8 SINGLE-SCALE BLOCK ### Range_feet_params={ 'tag':'range'.0:'4'. 'tick_levels':4. 'tick_text_levels':3.8. 9.0. Resolution_params]. 'width':5. 'u_min':5000. 'scale_type':'log'.0. 6. 'width':5. 'title_y_shift':1. 'tick_levels':2. 'u_max':20.4. 'scale_type':'log'. 'text':r'Focal Length'. 'title_y_shift':0. 'title':r'Target Size'.75.0:'10' }. 'scale_type':'log'. 'extra_titles':[ {'dx':-1.28. 'tick_text_levels':1.py ### }.25. 8.2. 'text_format':r"$%3. 5.0f$".40.0:''.0. 'u_min':0.0.25. 'text_format':r"$3.4. 'u_max':10. 'tick_text_levels':2.0f$". 'title':r'$N$'. 3. #'title_y_shift':0. 'function':lambda u:log10(u). 'tick_levels':2.0:'1'. 'title_y_shift':0. 'function':lambda u:log10(u). 'dy':0. 'isopleth_values':[[700.0. 4.0. #'text_format':r"$%3. 'tick_side':'left'.28. 'dy':0. 'tick_text_levels':0.0*3. 'u_max':50. 'title':r'\small $ft$'. ticks marks and tick labels as they # duplicate those on the y-axis of the Contour Block. 'width':10. 'width':5.8. 'scale_type':'log'. } Focal_Length_mm_params={ 'tag':'focal'. {'dx':-1.0.0. 91 . 'u_max':50.0:''. }] } Resolution_params={ 'tag':'resolution'. 2. 10. Focal_Length_mm_params.25.15]]. 'scale_type':'manual point'. 'tick_text_levels':2.25.0f$". Number_of_Cycles_params. 'function':lambda u:-log10(u).0*3. 'u_min':5000. 'u_min':1.28. Target_Size_meters_params. 'manual_axis_data': {1. 'text':r'\small $mm$'. } block_1_params={ 'block_type':'type_3'. #'tick_text_levels':3. #'tick_levels':3. 'u_min':1. 'text_format':r"$%3. 'title':r'Lens'. 'u_max':1000. 'align_func':lambda u:u/3. 'tick_levels':2. 'text_format':r"$%3.0. 'dy':0.0. }] } Range_meters_params={ 'tag':'range'. 'title':r'Range'.2.0:''. 'function':lambda u:-log10(u). 'dy':0. } Number_of_Cycles_params={ 'u_min':1. 'scale_type':'log'. 'width':5.4. 'text':r'\small $m$'.0.8.0:''. 'reference_titles':[''. 'u_max':40.5. 'function':lambda u:-log10(u).

0.0]. 'tag':'illum'.5 to 7.0.0. 'scale_type':'log'. 'function':lambda u:log10(u).281. 'u_tag':'resolution'. 'text_format':r"$%3. 'u_max':7. } block_3_params={ 'block_type':'type_8'.5 0. 'y_corr':0. 30. 'v_manual_axis_data': { 10.4. 6. 50. 'u_min':1000.0:['$30 \%$'.5. 'f_params':Focal_Length_inches_params.7.1. } ### TYPE 8 SINGLE-SCALE BLOCK ### Focal_Length_inches_params={ 'tag':'focal'.0:['$100 \%$'. 'draw_line':True}]. 'wd_title':r'Photocathode Illuminance \ (-log$_{10}$(lux))'.22. #'v_text_format':r"$%3. 'draw_line':True}]. } block_2_params={ 'block_type':'type_8'. {'x_corr':0.'x']].0. 'isopleth_values':[['x']]. 'u_text_format':r"$%3.0/25.0.0. {'x_corr':0. 100. 'u_min':1.281.0.20. 'mirror_x':True.3. 'wd_title_distance_center':2.2f$".2.0. 'u_min':0. 'wd_tick_text_levels':1.22.0:['$10 \%$'.50.20. 'u_func':lambda u:log10(u). 'title_x_shift':0. 'scale_type':'log'.5.30. 'y_corr':-. {'x_corr':0.2.0.20.0. 'tick_text_levels':3. 'wd_tag':'illum'. 'function':lambda u:log10(u).v): return const_A*sin(const_B*(-x+const_C*v**const_D))+ \ (v/const_E)/(-x+const_F+(v/200))**2 block_20_params={ 92 .0. } 'block_type':'type_5'.0.0f$". 'wd_tick_levels':3. 'v_title':r'Contrast'.25 . ticks marks and tick labels. } ### TYPE 8 SINGLE-SCALE BLOCK ### Target_Size_feet_params={ 'tag':'size'. 'title':r'\small $in$'.35. 'u_title':r'Contrast Limiting Resolution \ (Line Pairs/mm)'. 'x_max':7.0:['$50 \%$'. 'title':r'\small $ft$'. 'v_func':f1. 'title_x_shift':0. 'y_corr':.0.0/25. 'tick_side':'left'.0. 'draw_line':True}]. 'width':10.15 def f1(x.2. 'u_scale_opposite':True.0 # and plot linearly to match the wd-scale on the # x-axis of the Contour Plot. 'tick_text_levels':2. 'tick_text_levels':2.0*3. 'text_format':r"$%3.0. 'tick_side':'right'.0.5.0f$ \%% ".0.40. 'f_params':Target_Size_feet_params. 'height':13. 'u_max':1. 'y_corr':0.281. as = = = = = = 1. 'align_func':lambda u:u*25. 20.4. 'isopleth_values':[['x'. 'draw_line':True}]. 'function':lambda u:u. } ######################################################## ########### Previous Type 5 Example Nomogram ########### ######################################################## ######################################################## ###### Previous Compound Type 1 Example Nomogram ####### ######################################################## const_A const_B const_C const_D const_E const_F ### TYPE 1 3-LINE BLOCK ### Photocathode_Illuminance_params={ # Replace log(u) with -u over range 1.0:['$20 \%$'.30. 'tick_levels':2.0.134 150 0. 'isopleth_values':[['x']]. 'wd_text_format':r"$%3.5*3.2f$".0. 'wd_tick_side':'right'. and assign the # illum tag here as was assigned to that axis. 'u_values':[1.'tick_levels':4. 'isopleth_values':[['x']].3. 'align_func':lambda u:u/3. 'f_params':Range_feet_params.0].0f$ ". 'draw_line':True}].4.8. {'x_corr':0.0.9. }. 'x_min':1.4.45. 'manual_x_scale':True. 'tick_levels':2.0. } block_4_params={ 'block_type':'type_8'.36 4. 'scale_type':'linear'. 'y_corr':-. 10.4.100.1. 'v_values':[10. # Remove title. {'x_corr':0. 'u_max':20.0.0.3.

'tick_levels':0. 'arrow_length':1.01).225*u). 'title_box_width': 22.0. # Don't draw duplicate labels } block_11_params={ 'block_type':'type_1'.2:'\scriptsize Clear Full Moon at Zenith'. 'f2_params':FNumber_params. 'function':lambda u:log10(0.0. 'title_y_shift':0. 'title':r'Lens F/No.0.'. 'scale_type':'log'. 'title_str':r'\LARGE Nomogram for determining\ 93 . 'title_y_shift':0. #'title':r'Photocathode Illuminance (lux)'.5G$".0. 'text':r'Reflectivity'. } ### TYPE 1 3-LINE BLOCK ### Scene_Illuminance_params={ 'u_min':0. 'scale_type':'manual arrow'. }]. 'title':r'Scene Illuminance (lux)'.00001.5G$". 'dy':-1. 'scale_type':'log'. 'tick_side':'left'. 0.0002:'\scriptsize No Moon Heavy Clouds'.0. 0.0. 'tick_levels':2. 'isopleth_values':[['x'. 'scale_type':'log'. 'dy':-1. 'scale_type':'log'.5. 'isopleth_values':[['x'. } block_12_params={ 'block_type':'type_1'. 'text_format':r"$%2. 'title_y_shift':-0.00001. 'extra_params':[ {'tick_side':'left'.2.5G$".225*u) # Replace 2*log10(u) with -2*log10(u) 'tag':'exitance'. 'f1_params':Scene_Exitance_2_params.# they duplicate those already drawn on the # y-axis of the Contour Block. 'title_y_shift':-0. 'text_format':r"$%3.1f$".block_4_params]. 'title':r'Scene Exitance (lumen/m$^2$)'. 'scale_type':'log'.01*u). 'tick_levels':2. #'text_format':r"$%2.0. 'function':lambda u:log10(u). 'title_x_shift':-0.85. 'u_max':10.01]].)]. 'title_y': 0.('scale paper'.block_1_params.001:'\scriptsize Clear No Moon'. } }. block_3_params.'x'. #'tick_side':'left'. 'extra_titles':[ {'dx':-2.5G$".0. 'u_min':0. 'text_format':r"$%2.9.block_2_params. } 0. #'tick_levels':2.block_11_params. 'paper_height':24. } Scene_Exitance_1_params={ # Replace -log10(0.3.0.15. 'u_max':100. 'tick_text_levels':1. Target_Reflectivity_params={ 'u_min':1. 'u_max':5. 'block_params':[block_20_params.'x']]. 'u_min':0.0. #'title_y_shift':0. 'width':5. }] } FNumber_params={ # Replace 2*log10(u) with -2*log10(u) 'u_min':0.0. 'tick_levels':2.6. 'tick_text_levels':1. 'tick_levels':2.0. 'f3_params':Scene_Illuminance_params.7. #'tick_text_levels':1.7. 'width':15. 'title':r''.0. 'f2_params':Target_Reflectivity_params. 'tick_levels':0. # Don't draw duplicate ticks 'tick_text_levels':0. {'dx':-1. 'function':lambda u:-log10(u).7.0f$".0.8. 'text_format':r"$%2. 'manual_axis_data': { ######################################################## ######## Main Parameters of Overall Nomogram ########## ######################################################## main_params={ 'filename':'EO-Isopleths. 'title_x': 10. 'width':15. 'function':lambda u:log10(0. 'height':15. 'width':5. 'title_x_shift':1.4. 'transformations':[('rotate'. 'paper_width':32.00001. 'tick_text_levels':2. 'tick_text_levels':1. 'f1_params':Scene_Exitance_1_params. 'u_max':1. 'title':r'Target'. 'u_max':1. 'function':lambda u:-2*log10(u). 'text':r'(\%)'. 'text_format':r"$%3. block_12_params. 'tick_side':'left'. 'tick_text_levels':0. 'height':15. }.225*u) with log10(0. } Scene_Exitance_2_params={ 'tag':'exitance'. 'f3_params':Photocathode_Illuminance_params.45.pdf'.0.

0. 'width':15. 'linestyle':'dashed'. 'text':r'Responsivity = 200 $\mu$A/lm'. 'y':8.2. 'width':10. 'width':5.2. 'y':2. 'x':7. {'color':'black'.performance parameters of a low-light-level\ { image intensifier target detection or recognition\ 'x':7. 94 . 'y':2.6.5. { 'width':15. }.$^2$\ } $\times$ (1 + Magnification)'. }.0. }. Nomographer(main_params) }.0. 'width':15.85. 'x':11.2. 'y':3. 'y':4.3. 'width':10. { 'width':15.0.3. 'x':23. 'text':r'Scene Exitance = Scene Illuminance\ }. 'y':5. }. 'x':0. 'x':7. }. system \it (after the RCA Electro-Optics Handbook)'. 'x':0.7.08. 'transparency':0. }.3. 'circle_size':0.2. 'extra_texts':[ 'text':r'where:'. { }]. 'x':5. 'width':15. 'y':8. { }. 'text':r'Image-Intensifier Photocathode'. { 'text':r'$N$ $\times$ Range'. --------------------------------------------------------'.0.7.7. 'width':15. 'width':5. 'y':3. }. 'x':11.3. ---------------------------------------'. { 'width':15.65. 'y':22. 'y':8. { 'text':r'Focal Length $\times$ Target Size'.8. 'x':7. 'text':r'Lens Transmission = 90\%'. 'text':r'Magnification (of scene onto\ { focal plane) $\approx$ 0'.2.0. }. ]. 'text':r'Scene Exitance $\times$\ 'linewidth':'thin'. 'width':15. { 'text':r'Contrast Limiting Resolution =\ 'x':7.15. 'text':r'where $N$ is the number of picture\ { element cycles required'. 'y':7. { 'width':5.0. }. $\times$ Target Reflectivity'. 'text':r'4 $\times$ Lens F/No. Lens Transmission'. 'isopleth_params':[ 'y':5.0. { 'text':r'Photocathode Illuminance =\ 'x':23.0. 'y':21. 'make_grid':False. }. 'x':6.

0 5.5 0.00 4.20 0.00 10.0 3.07 0.0 8.0 Scene Exitance × Lens Transmission Photocathode Illuminance = ——————————————————– 4 × Lens F/No.9 m 40 50 60 30 20 4 5 6 7 8 9 3 2 ft Target Size 95 1 2 3 10 9 8 7 6 5 4 Lens F/No.0 5.00 6.06 0.1 0.60 0.05 0.0 3.0 4.0 6.30 0.00 9.0 where: Scene Exitance = Scene Illuminance × Target Reflectivity Lens Transmission = 90% Magnification (of scene onto focal plane) ≈ 0 10 20 30 6 1.90 0.50 0.0 0.2 × (1 + Magnification) 0.00 5.10 1.0 20.7 0.00 3.01 0.0 2.01 Clear No Moon 0. Photocathode Illuminance (-log10 (lux)) 2.08 0.1 No Moon Heavy Clouds 0.0 7.0 4.9 where N is the number of picture element cycles required 2 3 9 8 7 6 5 4 20 30 90 80 70 60 50 40 200 300 900 800 700 600 500 400 in 4 N × Range Contrast Limiting Resolution = ————————————— Focal Length × Target Size 16000 14000 12000 8000 9000 7000 6000 1000 N 1000 mm Lens Focal Length 3 0.00 8.40 2.0 9.6 0.8 0.04 0.00 7.0001 Clear Full Moon at Zenith 0.09 0.00 20.8 0.7 0.00 10.0 1.001 0.00 40 Image-Intensifier Photocathode Responsivity = 200 µA/lm 5 0.001 100 10 Target Reflectivity (%) 1 Contrast Limiting Resolution (Line Pairs/mm) Nomogram for determining performance parameters of a low-light-level image intensifier target detection or recognition system (after the RCA Electro-Optics Handbook) 5000 4000 3000 2500 1600 1800 2000 5000 4000 1200 1400 3000 2500 1600 1800 2000 1400 1200 800 900 700 600 800 900 700 600 500 400 300 250 160 180 200 500 400 120 140 300 250 180 200 80 90 70 60 50 ft Range m 100% 2 % 50 Contrast 30% 20% 10% Scene Illuminance (lux) Scene Exitance (lumen/m2 ) 1E − 005 10 1 0.70 0.80 0.5 0.6 0.00 30.1000 100 10000 1 2 6 4 10 1 10 100 0.0001 7 1 1E − 005 .

com/rgb/ 62 http://www.stroke.y coordinates and its width and height. that has a variety of PyX drawing commands added to it.15cm and filled with a light ivory color61 • line: a line segment with starting and ending x. the only PyX drawing prior to the nomogram.com/pynomo11/Type4-PyX.y coordinates specified • rect: another rectangle with its starting x. Another option is to import your PyNomo nomogram into an image editor. here Sepia-colored (which could also be drawn in PyNomo by the extra_texts parameter) • arc: an arc with the x.pdf 61 Floral 96 . with its starting x. Then we add the lines 'post_func':post. and the initial and final angle in degrees. with its starting and ending x.com/pynomo11/Type4-PyX. The logo in the lower right corner is drawn only to show some more drawing commands.fill and a hollow version using c. say.fill was used instead of c. here a Sepia-colored thick line (which could also be drawn in PyNomo by the line_params parameter) • text: text with an x-y coordinate.path operation required) • arrow: a line with an arrow decoration. and 'pre_func':pre. specified here as Sepia-colored and thick (note the additional path.y coordinates and its width and height.y coordinates.myreckonings.py and http://www. with a Sepia-colored line of width 0. with the rgb fractions calculated from http://www. which is critical for determining the coordinates needed by the PyX commands while writing the script.pdf White. using coordinates in cm defined in PyNomo for the nomogram The PyX website and Reference Manual describe a number of commands for editing your nomogram. to the main parameters. our earlier Type 4 Proportion nomogram.tayloredmktg. One option is to use directly in PyNomo the drawing commands available in the PyX package installed as part of the PyNomo installation.sourceforge.stroke. • rect: a background rectangle in pre(c).net/manual. More details are found in the PyX references. pre(c).62 60 http://pyx.sourceforge. containing PyX drawing commands to perform after PyNomo draws the nomogram. such as adding another graphic showing the machine part or a geometrical figure to which the nomogram applies. Editing with PyX PyNomo offers two main parameters that provide access to the lower-level PyX drawing commands: • pre_func: execute the PyX commands as defined in the named function before drawing the nomogram. in a filled version using c. using coordinates in cm defined in PyNomo for the nomogram • post_func: execute the PyX commands as defined in the named function after drawing the nomogram.60 We can define a function before the main parameters that contains any PyX drawing commands to perform before PyNomo draws the nomogram. and colored Sepia • circle: a circle with its center x.y coordinates of the center. The PyNomo script and output PDF graphic below and are available online for download.19 Editing Your PyNomo Nomogram You may want to embellish the nomogram beyond what has been described here.net/ and http://pyx. filled because c. Setting make_grid to True overlays a grid on the nomogram. the radius in cm.myreckonings. We can also define a function.y coordinates and its radius. say post(c). On the next page is an example of a nomogram.

stroke(path.fill(path. } main_params={ 'filename':'Type4-Pyx.5. }.5.path(path.color.cmyk. 'transformations':[('rotate'.Sepia]) # Draw arrows from labels to angle curves c.12.Sepia]) c.5.65. -1.Blue.line(7. 12.text(3.color.6.[17. 'tick_side':'right'.text(4. 'title_x':10.0). 12.arc(8. color. [color.05.linestyle.text(7.15). 'title':r'\Large $\beta \thinspace ^\circ$'.01). 'post_func':post. 108. style. -4.7]].thin.8. [style.5. -1. 13.rect(20.linewidth.dashed]. }. 'title_y': -3.cmyk.9.r"\Large $\alpha$".Orange. 'title_opposite_tick':False.linewidth. 16) + path. 0. 1.3).9.cmyk.Blue. 'tick_text_levels':1. 'circle_size':0.0. 'title_opposite_tick':True.[color. 'draw_lines':True.stroke(path.4. 16. 13.('scale paper'.line(8. 'block_params':[block_1_params].)]. 13. } def pre(c): c.0. 'title':r'\Large $A$'.color.6.15).fill(path.Sepia]) c. 'f1_params':A_params.[color. color.### Type4-PyX.thin.circle(20.linewidth. 'tick_text_levels':1.thick.0. 36.4.75. 'line_style':[color.Sepia.solid]. 0.5.Orange. 3. 'title_draw_center':True.arc(3.Orange]) from pynomo. 'function':lambda u:u.cmyk. 13). 'title_opposite_tick':True.5.large]) c.4.linewidth.Black.14.stroke(path.cmyk.Sepia]) c.earrow.0.thin.deco.[13.r"\Large $\beta$". [style.3).circle(21.6.3].cmyk.Orange]) c.stroke(path.7].17. [style. 'circle_color':color. 'title_opposite_tick':False. 'line_style':[color. [color.deco.Orange.0. 'u_max':89. 'title_distance_center':0.thick.text(8. 'tick_side':'left'.cmyk.0.Sepia.thick.thick.solid].15.0.large]) # Draw logo c.98.3. 'tick_levels':3.linewidth.0.py ### path.cmyk. 0.linewidth(0. 'paper_height':20.12.5.9)). 7. {'coords':[[13.linewidth.4.0. 0. style. 'pre_func':pre. } B_params={ 'u_min':1.linewidth.5.9.[14. 'line_style':[color. 'line_params': [ {'coords':[[13.cmyk. 'u_max':10. style.3.3. deco.linewidth. 'title_draw_center':True. 'function':lambda u:sin(u*pi/180. {'coords':[[13.stroke(path.path(path. 'tick_levels':3. 'circle_size':0. 'f2_params':Alpha_params.8).[color. }.Sepia]) # Draw angle curves c. 0.3. 'tick_side':'right'.13. 'tick_text_levels':1.0. style. 'paper_width':20.0.0). 'circle_color':color.3.17. 'function':lambda u:sin(u*pi/180.linewidth.4. } block_1_params={ 'block_type':'type_4'. [style. [style. 13.line(3.Sepia]) c.cmyk. 'u_max':10.7.0. 'tick_side':'left'. 8. 'tick_levels':3.5.15. 3. 'circle_size':0. 13.thick.Sepia]) c.Sepia. [13.6]. } Beta_params={ 'u_min':0. 'make_grid':False. 'tick_text_levels':1.94)])]) def post(c): # Draw and triangle and labels c.rect(-3.15). 'f3_params':B_params. [style.cmyk.cmyk.filled([color. 'title_draw_center':True.08.7.7]].linestyle.nomographer import * A_params={ 'u_min':1.pdf'.cmyk.17.line(7. 'circle_color':color.cmyk.0.4.0.color. 'tick_levels':3.r"\Large B".linestyle. -1. 'reference_color':color. 0. 'title_str':r'\LARGE Law of Sines: \ $A / \sin \alpha=B / \sin \beta$'. 'title':r'\Large $B$'.cmyk.7]].16.Sepia]) c.line(3.thick.stroke(path.3.17.4].Black.rgb(1.05.stroke(path. 'u_max':89.cmyk. ]. [style. 'function':lambda u:u.75.cmyk.earrow. 27. 13. 'title_distance_center':0. 7.0.4.[color. 'title_box_width': 10.cmyk. 13) + Nomographer(main_params) 97 . style.6.0. } Alpha_params={ 'u_min':0.r"\Large A". 'title_draw_center':True.cmyk. color. 27). 180)).cmyk. 'title':r'\Large $\alpha \thinspace ^\circ$'. 'f4_params':Beta_params. style.

0 10 20 30 40 50 60 70 80 0 β◦ 10 10 9 A B 8 20 7 β α α◦ 6 30 A 5 40 4 50 3 60 2 70 80 1 B 10 9 8 7 6 5 4 3 2 1 Law of Sines: A/ sin α = B/ sin β Vector vs. which is essential for nomograms where you might want to produce large drawings for greatest accuracy. .TIFF and so forth. PyNomo can also produce output files in the EPS format (if the output file is specified as yourfilename. as you can see by zooming in when viewing the PDF file. Therefore. .eps. . the image can be zoomed in to any level and it remains sharp. It can also be printed or plotted on any size of paper without loss of clarity or precision. or in other words the image is drawn on your printer or screen according to instructions within the PDF file. such as . they begin to show rough edges (or become fuzzy) because the image consists of discrete pixels. Raster Images The output of PyNomo is a vector image.PNG. and this is also a vector format that may be more universally accepted by image editors.BMP.JPG. 98 . . There are also raster images that you can create for specific sizes. If you zoom into these or print them with enlargement.GIF. Raster image editors also produce much larger files.

Inkscape can open EPS files.66 CAD drawing software such as Microsoft Visio or AutoCad can also edit vector images.com/2008/12/05/20-vector-graphic-editors-reviewed/ or a simple list at http://en. There is another free option. The big disadvantage in converting the PyNomo output to a raster image is the large file sizes that are needed to preserve high resolution.wikipedia. The file size will be much smaller and the printed resolution will be limited only by the resolution of the printer or plotter. such as EMF. and pstoedit can do this with a shareware plugin. The outstanding TikZ users manual can be found at http://www. to edit the nomogram while retaining its vector nature. DXF for CAD packages. Illustrator can directly open the PDF or EPS format produced by PyNomo. Adobe Photoshop is one example of such an editor.com/Online-PDF-Converter. and it can open PDF files if the free image converter pstoedit is installed.69 Within a LaTeX script file you can input the PDF file and use. but when I input the resulting SVG file into Visio I could simply delete them and add them back in as new text. and for this reason I would not recommend using a raster image editor. but there is a free online converter from Texterity68 that I’ve tested. and that is to use the MiKTeX distribution of LaTeX that is already installed as part of the PyNomo installation.65 There are many other vector image editors of varying sophistication. though. There are expensive PDF-to-SVG converters.pstoedit.ctan. Most vector editors (Illustrator. the TikZ drawing package to add a wide variety of graphics. 99 . but since these are vector images you will be asked to specify the size that you want your nomogram to converted to as a raster image. which is very important given that the sharpness of a nomogram is critical for the precision of its calculations. Some warnings are generated about undefined fonts.63 You can often open the PDF or EPS output file of PyNomo in these programs. In general.org/ 66 See a very nice comparison at http://www. If you do. and in fact the title strings are sometimes run together. but there are many others such as the powerful yet free GIMP software.texterity. you can use an image converter to convert your nomogram to the desired format.coolutils. 70 A gallery of TikZ examples can be found at http://www. or example. There is a free 30-day trial of its PDF Converter on that site. After that you are limited to that size for full resolution viewing and printing. and SWF for Flash editors.pdf TikZ requires adding the pgf package to MiKTeX.) Once you input the nomogram as a raster image you can edit it as you like depending on the features of the editor. the PNG format is much better for the nomograms (and somewhat smaller in file size) than the JPG format because it tends to preserve edges such as the scales.org/wiki/List_of_vector_graphics_editors 67 http://www.net/tikz/examples/all/ . though.php 65 http://www. it appears to be under construction at the moment. Using a Vector Image Editor It is almost essential.org/ 64 http://www.67 You can also use pstoedit standalone to convert your PDF file to vector formats accepted by other vector editors. If you can’t directly input the PyNomo file.net/ 68 http://www. but missing fonts will be converted to Courier.org/tex-archive/graphics/pgf/base/doc/generic/pgf/pgfmanual.texample.smashingmagazine.com/artstech/freesvg/submit/ 69 This paper you are reading is written in LaTeX. I would really only recommend this approach if you know LaTeX.Using a Raster Image Editor So one way to edit your PyNomo nomogram is in a raster image editor.inkscape.gimp.64 (However. Inkscape and Visio included) accept SVG format. A free online PDF image converter is also available.70 63 http://www. Adobe Illustrator is one (very expensive) means of editing a vector image—a free but powerful alternative is Inkscape.

PyNomo supports a number of common types of nomograms in equation form without having to derive the standard determinants.barbecuejoe.20 The Benefits of Using PyNomo to Draw Nomograms As I’ve tried to point out in the examples here. Dr. very quickly. Roschier has provided a software tool of real benefit to those of us with an interest in nomography. PyNomo offers significant advantages in creating precision nomograms. PyNomo can also provide transformations and optimization. I continue to try things with PyNomo and I am surprised at what it can produce. 71 Joe Marasco provides an example of how he improved one of his nomogram designs by experimenting with PyNomo at http://www. The examples of these on the PyNomo website are outstanding.71 I relied on it extensively in preparing a variety of nomograms for a math journal article and a PowerPoint presentation.htm 100 . PyNomo provides a fast way of testing and fine-tuning the layout and optimizations very. And perhaps its most amazing capability is to create grid and compound nomograms for more than three variables. while offering the determinant form as another more general type.com/scan.

87. 99 electro-optic nomogram. 88 u/v/wd_manual_axis_data. 9 errors. 36. 88 mirror_x. 96 rect. 87 u/v/wd_tick_levels. 4 isopleth. 87 u/v/wd_title. 96 line. 88 wd_axis_color. 88 u/v/wd_func. 14 isopleth_values. 88 draw_lines. 88 u/v/wd_align_func. 87. 35 u_title_color. 53 building the output. 87 u/v/wd_title_color. 88 u/v/wd_tag. 35 palette. 87. 90 grid. 14. 87. 27. 87 u/v/wd_tick_text_levels. vector. 80 circular scale. 87 u/v/wd_title_opposite_tick. 96 raster. 37 conversion scale. 1. 87 horizontal_guides. 35 changing relative sizes. 69. 53 ladder_color. 35 Type 5 only: draw_line. 88 u/v/wd_text_format. 35 v_title_color. 76 grid nomogram. 96 text. 26 default_params. 88 u/v/wd_title_distance_center. 36 overview. 90 f#_params. 96 circle. 88 mirror_y. 88 x_min. 100 block parameters (order of listed scales). 88 u/v/wd_reference. 99 raster vs. 17 circular nomogram. 88 u_axis_color. 87. 14 height. 35 wd_text_color. 54. 57 reference_color. 17. 9 benefits of PyNomo. 96 arrow. 47 editing. 14. 87 u/v/wd_text_color. 30 color default (black). 1. 35. 35 wd_title_color. 35 x_corr. 1. 88 u/v/wd_axis_color. 57 padding. 96 arc. 14 filename. 87 u/v/wd_values. 88 y_corr. 87.Index vertical_guides. 17 installation. 35 v_text_color. 87 u/v/wd_tick_side. 88 width. 87 x_max. 96 PyX:. 98 vector. 87 Type 6 only: curve_const. 54. 87 u/v/wd_title_draw_center. 17. 87 scale_type_u/v/wd. 35. 35 u_text_color. 17 101 . 88 manual_x_scale. 14 Type 4 only: float_axis. 35 v_axis_color. 87 u/v/wd_scale_opposite. 57 isopleths. 87. 76 index line.

18 line_params. 35. 58. 26 width. 61 arrow_color. 12 natural log. 30 function_y. 15 scale paper. 35 102 . 26. 30 base_stop. 17. 77. 15. 22 log smart. 27 italic letters between $. 26 y. 48 manual_axis_data.starting. 17 paper_width. 48 axis_color. 27 Python. 22. 36 manual line. 35. 35 text. 58 extra_texts. 22. 15. 96 pyx_extra_defs. 30 text_color. 1. 26 x. 30 grid_length_#. 18. 26 width. 35 axis_color. 36 text. 1. 36. 73 rotation. 12 e e. 73 math functions. 96 paper_height. 17 post_func. 15 title_color. 18 transparency. 57 logarithms. 14. 11 key. 58. 57 reference_titles. 18 color. 96 circle_color. 15 polygon. or log(u). 35. 35 circle_size. 12 math titles. or log10(u). 23 tag. 26 angle_u. 15 transformations. 26. 58 circle_size. 73 rotate. 22 log. 22 manual arrow. 61 angle_v. 14. 14 function_x. 1. 48 manual arrow. 23 reference_color. 23 manual point. 61 dx. 26. 61. 15 title_y. 41 linear. 36. 35 title_str. 35 arrow_length. 15 title_x. 96 title_box_width. 35. 22. 11 pivot line. 22 linear smart. 11 superscript ^. ending with $. 48. 35 linestyle. 26. 36. 83 text_box_width. 15 draw_lines. 80. 26. 58 make_grid. 1. 36. 26 filename. 1. 11 common log. 30 extra_titles. 58 coords. 35. 41 function. 48 title. 54. 9 scale parameters align_func. 22. 3 main parameters block_params. 17. 36. 23. 22. 23. 58 line_style. 22. 30 extra_angle. 26 pyx_extra_defs. 41 extra_params. 80 extra_texts. 11 fractions. 11 subscript _. 48. 14 isopleth_params. 17. 12 pi π. 27 scale_type. 26 full_angle. 26 dy. 41 base_start. 22. 96 pre_func. 48.

35. 57 title_x_shift. 70. 11 Greek letters. 11 times ×. 76 g. 14. 10 italic. 77 u_max_trafo. 77 u_min. 61 percent %. 11 \qquad. 76 types of nomogram listing by section. 41 text_color. 76 u_stop. 14. 77 titles. 14 tick_text_levels. 11. 64. 35. 36 spanning script lines \. 70 u_start. 27 transformation initial. 77 h_grid. 76 grid. 41 turn_relative. 15 shear. 14. 10 carriage return. 11 underscore _. 1 spaces \enspace. 10 bold. 11 text_distance. 11 tick ’. 14. 57 structure of scripts. 35. 22 title_y_shift. 11 division ÷. 14 title_color. 76 u_texts_v_start. 48 title. 41 tick_levels. 76 v_line_color. 2 text_size_#. 10 degrees ◦ . 11 pi π. 11 approximately equals ≈. 77 u_texts. 77 g_grid. 22 title_color. 14. 77 Type 1 only: proportion. 57 title_opposite_tick. 76 v_text_color. 11 √ square root . 10 size. 70.v_start. 35 title_distance_center. 11 backslash \ 57 copyright ©. 10. 7 symbols ampersand &. 76 v_stop. 30. 70 polygon. 11 parallel k. 73 rotation. G. 77 v_texts_u_stop. 6 103 . 35. 14. 15 scale paper. 70. 70. 70. 30. 48 tick_side. 14. 77 v_texts. 77 u_texts_v_stop. 76 text_prefix_v. 41 text_distance_#. 2. 77 v_values. 77 v_texts_u_start. 77 f_grid. 11 \quad. 76 smart axes. 76 text_distance. 57 title_draw_center. 70 u_min_trafo. 76 transform_ini. 11 pound #. 10. 14 Type 3 only: reference_color. 35 Type 9 only: f. 77 text_prefix_u. 6 supported by PyNomo. 70 u_line_color. 22 f vs. 11 dollar sign $. 76 u_text_color. 41 text_format. 14. 15. 73. 70. 11 \thinspace. 77 u_values. 77 h. 30 u_max.

7. 20 Type 3 (compound parallel scales). 83 Type 6 (ladder). 41 Type 9 (general determinant).three parallel scales compounded. 26. 48 Type 1 (three parallel scales). 64 104 . 22 Type 4 (proportion). 57 Type 5 (contour). 61 Type 8 (single scale). 53 Type 7 (reciprocal or angle). 2. 69 Type 10 (one curved line). 4. 13 Type 2 (N or Z). 2.