Artistic Interpretation of Scientific Data

Supplement to the Article in Scientific Data Management v. 2. No. 1 (1998).

The Artlandia code is presented to generate one of the images for the cover design of Scientific Data Management v. 2, No. 1 (1998). As described in the article, the images are designed around the graphically encoded words "scientific data management". The Artlandia users can substitute other words, such as somebody's name or a favorite quote, and create a customized version--a birthday present, or a personalized postcard--from this, stunning in the words of Scientific Data Management, design.

The algorithm starts from creating an array of sorted ASCII values of the non-space characters in the journal's title in which similar characters are grouped together. As an example, the first element of the array indicates that there are four characters "a" (the ASCII code 97) in the data.

Here is the array.

    chars = ToCharacterCode[
        "scientific data management"]//
            Sort//Split//Rest
Graphics

It is a simple matter to map this array onto the plane--for example, by letting the length of each element on the first level of the array (which is the number of the given characters in the title) represent the x-coordinate and the scaled ASCII value of the corresponding character represent the y-coordinate.

To demonstrate a possible mapping, here is a set of points that represent the array.

    Show[Graphics[{PointSize[0.05], 
        Point[{Length[#1], First[#1]/4}]& /@ chars}],
        Axes -> True, AspectRatio -> Automatic];
[Graphics:SDMgr2.gif][Graphics:SDMgr5.gif]

At this point we load Artlandia.

[Graphics:SDMgr2.gif][Graphics:SDMgr6.gif]

Here is the color palette for the design. Note using the purely random GeneratingFunction, which leads to more dynamic effects.

[Graphics:SDMgr2.gif][Graphics:SDMgr7.gif]

[Graphics:SDMgr2.gif][Graphics:SDMgr8.gif]
[Graphics:SDMgr2.gif][Graphics:SDMgr9.gif]

Each element of the array chars is then represented on the plane as a "snail", a superimposition of slightly displaced randomly colored in the above palette concentric disks.

This is the previous mapping of the array chars, in which an ad hoc function Snail is used instead of points.

    snails = Show[Graphics[
        Snail[{Length[#1], First[#1]/4},
            30, palette]& /@ chars],
        Axes -> True, AspectRatio -> Automatic,
        PlotRange -> All];
[Graphics:SDMgr11.gif]

We then counterpoint dynamic randomness in "snails" and the calming element of visual symmetry.

The following Artlandia command creates a tile of the specified wallpaper symmetry group, 6, in the crystallographic notation.

[Graphics:SDMgr2.gif][Graphics:SDMgr12.gif]
[Graphics:SDMgr2.gif][Graphics:SDMgr13.gif]

Various parts of this tile, and the tiles of other symmetry groups, as well as the complete tiles and tilings make the design for the cover of the magazine. In this instance, we pick up the first two of 12 unit cells of the tile.

This picks up and displays the portion of the tile.

[Graphics:SDMgr2.gif][Graphics:SDMgr14.gif]
[Graphics:SDMgr2.gif][Graphics:SDMgr15.gif]

The background graphics for the cover images is based on an ad hoc function Stroke that provides the coordinates of lines which imitate a stroke of a brush. To paint the lines we create a utility function ColorLines. A set of two orthogonal two-dimensional arrays of such strokes is then used for the backgound. In the rest of this Section we briefly outline the algorithm. More detailed description of the code can be found in the separate section.

This utility function paints lines with the supplied arrays of color and thickness directives.

ColorLines[colors_, thickness_, lines_, opts___] := With[
{len = Length[lines]},
Transpose[{
ArrayOf[colors, len, opts],
ArrayOf[thickness, len, opts],
Line /@ lines
}]
]

The thickness palette is created similarly to the color palette.

    thickness = Shades[
        {AbsoluteThickness[0.5], AbsoluteThickness[1.5]}, 5];

As an illustration, here are two types of coloring a brush, using RandomArray and NaturalArray. Note that the brush is the same in both cases (it is a "natural" brush).

    stroke = Stroke[100, {0.1, 0.2}, {1, 2}, {{0, 0}, {1, 0}}]; 
    Show[GraphicsArray[
        Graphics[ColorLines[Sort[palette], thickness, stroke,
                GeneratingFunction -> #1],
            AspectRatio -> Automatic, PlotLabel -> #1]& /@
                {RandomArray, NaturalArray},
        GraphicsSpacing -> 0.5]];
[Graphics:SDMgr2.gif][Graphics:SDMgr18.gif]

Each stroke will be placed in a naturally distorted lattice. This sets the dimension of the lattice and creates the seeds.

    dim = {5, 4};
    seeds = Lattice[dim] +
        MapThread[List, Table[NaturalArray[dim], {2}], 2];

These are the maximum number of lines in a stroke, and the parameters that specify the length and the width of the strokes. For this background, we let the strokes overlap.

    maxlines = 40; lengthrange = {0.5, 3}; width = 5; 

This creates the background graphics.

    strokes[vect_] := Map[ColorLines[palette, thickness, 
        Stroke[Random[Integer, {1, maxlines}],
            lengthrange, {#1, #1 + vect}]]&,
        seeds, {2}];
    backgr = Show[Graphics[
        {strokes[{width, 0}], strokes[{0, width}]}],
        AspectRatio -> Automatic];
[Graphics:SDMgr2.gif][Graphics:SDMgr22.gif]

Using the function Match we find a place for the background that we like and combine the background and the main graphics.

    Show[Match[backgr,
        {{{-1.3, 9.4}, {2.3, 9.4}}, {{-3.8, 28.}, {-2.3, 30}}}],
            ptile];
[Graphics:SDMgr2.gif][Graphics:SDMgr24.gif]

Finally, we zoom into the "interesting" part of the graphics.

    Zoom[%, {{-3.97489, 1.42732}, {23.801, 30.2431}},
        Background -> SkyBlue];
[Graphics:SDMgr2.gif] [Graphics:SDMgr26.gif]