Abstract:
An algorithm is provided for optimizing the layout of labels associated with a visual data object such as a chart. The labels are first placed into a chart definition file that defines the labels as a shape. An initial layout of the labels is created and scored. The shapes are then manipulated iteratively until an optimal layout of the labels is obtained that corresponds to the layout having the score closest to an optimal score. The optimal layout is then used in rendering the visual data object on a screen.

Description:
CROSS-REFERENCE TO RELATED APPLICATIONS 
   The present invention is related to a patent application having Ser. No. 10/941,566, entitled “Common Charting Using Shapes”, filed on Sep. 15, 2004. The related application is assigned to the assignee of the present patent application and is hereby incorporated by reference. 
   BACKGROUND OF THE INVENTION 
   A chart is a graphical representation of numerical data. Charts are particularly useful for presenting complicated data in a concise and easily-understandable form. In today&#39;s desktop publishing environment, users can create impressive presentations using charts. Charts are based on underlying data that is entered into an application program such as “EXCEL” from MICROSOFT CORPORATION of Redmond, Wash. The underlying data can then be used to create a chart of the data in a number of different formats, such as pie-chart, bar-chart, histogram, line chart, etc. In addition, each part of the chart can have associated colors, textures, and other effects to improve the appearance of the chart, which is very important for conveying information. 
   The labels included in a chart contribute to the visual function and presentation of a chart. A chart with more than a few data points may become hard to read if the user activates an automated data label function. Generally, previously provided automated chart labeling algorithms result in overlapping text and positioning of labels that is not optimized to use the chart area. Accordingly, alternate methods are needed. 
   SUMMARY OF THE INVENTION 
   Embodiments of the present invention are related to a system and method that solves for the above-mentioned limitations by optimizing the placement of labels on charts and graphs. The optimization of the label is provided according to an algorithm that scores a specified positioning of the labels based on a set of constraints. The better the current positioning of the labels conforms with the stated constraints, the better the score for the chart. The algorithm attempts to minimize the score by calling a function multiple times, wherein the function repositions a single label each time it is called. In one implementation of the present invention, labels that were manually positioned are exempt from consideration during the optimization process. 
   In one aspect of the present invention, the functions of the optimization process are defined according to an objective function, or score function, and perturbation function that operate on the labels and anchors of the chart or graph. An anchor refers to a display element of the chart that has an associated label, such as a specific slice of a pie chart, a bubble of a bubble chart, or other elements depending on the chart used. The objective function refers to a function that defines the goal of the optimization by which a chart may be scored. For example, an objective function may correspond to minimizing overlap of labels, minimizing distance from the edge of an anchor, other goals for optimizing the position of the labels, and possible combinations of these goals. The perturbation function refers to a function that defines the limitations for the adjustment of the labels on the chart. For example, the perturbation function may define range limitations for relocating a label, a limited subset of the types of changes that may be made with regard to a label, and other limitations. 

   
     BRIEF DESCRIPTION OF THE DRAWINGS 
       FIG. 1  illustrates an exemplary computing device that may be used in one exemplary embodiment of the present invention. 
       FIG. 2  illustrates exemplary views of a pie chart with automatic labeling before and after label position optimization in accordance with the present invention. 
       FIG. 3  illustrates exemplary views of a bubble chart with automatic labeling before and after label position optimization in accordance with the present invention. 
       FIG. 4  illustrates exemplary views of a timeline chart with automatic labeling before and after label position optimization in accordance with the present invention. 
       FIG. 5  illustrates an exemplary charting system for carrying out generating a chart and optimizing the label position in accordance with the present invention. 
       FIG. 6  illustrates exemplary pseudo-code for determining the layout of a visual data object that corresponds to the optimal layout of the labels in accordance with the present invention. 
   

   DETAILED DESCRIPTION 
   The present invention now will be described more fully hereinafter with reference to the accompanying drawings, which form a part hereof, and which show, by way of illustration, specific exemplary embodiments for practicing the invention. This invention may, however, be embodied in many different forms and should not be construed as limited to the embodiments set forth herein; rather, these embodiments are provided so that this disclosure will be thorough and complete, and will fully convey the scope of the invention to those skilled in the art. Among other things, the present invention may be embodied as methods or devices. Accordingly, the present invention may take the form of an entirely hardware embodiment, an entirely software embodiment or an embodiment combining software and hardware aspects. The following detailed description is, therefore, not to be taken in a limiting sense. 
   Illustrative Operating Environment 
   With reference to  FIG. 1 , one exemplary system for implementing the invention includes a computing device, such as computing device  100 . Computing device  100  may be configured as a client, a server, mobile device, or any other computing device. In a very basic configuration, computing device  100  typically includes at least one processing unit  102  and system memory  104 . Depending on the exact configuration and type of computing device, system memory  104  may be volatile (such as RAM), non-volatile (such as ROM, flash memory, etc.) or some combination of the two. System memory  104  typically includes an operating system  105 , one or more applications  106 , and may include program data  107 . In one embodiment, application  106  includes a chart label optimization application  120  for implementing the functionality of the present invention. This basic configuration is illustrated in  FIG. 1  by those components within dashed line  108 . 
   Computing device  100  may have additional features or functionality. For example, computing device  100  may also include additional data storage devices (removable and/or non-removable) such as, for example, magnetic disks, optical disks, or tape. Such additional storage is illustrated in  FIG. 1  by removable storage  109  and non-removable storage  110 . Computer storage media may include volatile and nonvolatile, removable and non-removable media implemented in any method or technology for storage of information, such as computer readable instructions, data structures, program modules, or other data. System memory  104 , removable storage  109  and non-removable storage  110  are all examples of computer storage media. Computer storage media includes, but is not limited to, RAM, ROM, EEPROM, flash memory or other memory technology, CD-ROM, digital versatile disks (DVD) or other optical storage, magnetic cassettes, magnetic tape, magnetic disk storage or other magnetic storage devices, or any other medium which can be used to store the desired information and which can be accessed by computing device  100 . Any such computer storage media may be part of device  100 . Computing device  100  may also have input device(s)  112  such as keyboard, mouse, pen, voice input device, touch input device, etc. Output device(s)  114  such as a display, speakers, printer, etc. may also be included. 
   Computing device  100  also contains communication connections  116  that allow the device to communicate with other computing devices  118 , such as over a network. Communication connection  116  is one example of communication media. Communication media may typically be embodied by computer readable instructions, data structures, program modules, or other data in a modulated data signal, such as a carrier wave or other transport mechanism, and includes any information delivery media. The term “modulated data signal” means a signal that has one or more of its characteristics set or changed in such a manner as to encode information in the signal. By way of example, and not limitation, communication media includes wired media such as a wired network or direct-wired connection, and wireless media such as acoustic, RF, infrared and other wireless media. The term computer readable media as used herein includes both storage media and communication media. 
   Illustrative Embodiment for Optimizing Automatic Label Placement 
   As used herein, the terms “chart” and “visual data object” are used interchangeably to describe various visual objects such as pie charts, bubble charts, line charts, timelines, line graphs, bar graphs, photographs, digital images, and other objects that may have associated labels. 
   Embodiments of the present invention are related to using an algorithm for optimizing the positions of labels on a chart. The present invention uses functions to search for an optimal layout of the labels from a set of possible layouts. To frame the layout problem as a search the present invention defines an initial layout and two functions: an objective function that assesses the quality of a layout based on evaluation criteria, and a perturb function that manipulates a given layout to produce a new layout within the search space. Both the score and the perturb functions are defined by the set of constraints on the layout. Given these two functions the search can be performed to determine the optimal layout. In one embodiment, a simulated annealing method is used as a randomized search algorithm for determining the optimal layout. 
   The constraints may be divided into two sets: hard constraints and soft constraints. Hard constraints consist of characteristics required of any acceptable layout and therefore hard constraints bound the space of possible layouts. In contrast, soft constraints consist of characteristics desired in the final layout but not required. The hard constraints are typically imposed through the perturb function which is designed to only generate layouts that meet the hard constraints. The score function checks how well a given layout achieves the soft constraints. 
   Using the algorithm, a set of data may be used to automatically populate a chart with labels while optimizing the position of the labels in the chart area. 
     FIG. 2  illustrates exemplary views  200  of a pie chart with automatic labeling before and after label position optimization in accordance with the present invention. 
   View  210  illustrates that the labels on the pie chart are overlapping due to the number of data points included in the pie chart. The overlapping text makes it difficult to visually discern the labels and their association with the elements of the pie chart. 
   View  220  results in a pie chart with improved labeling by running the optimization algorithm of the present invention. The readability of the pie chart is greatly improved by optimizing the position of the labels within the chart space. The algorithm has moved certain labels away from the anchors (slices) to which they are related, while others have been moved closer or even centered, or partially centered, within their anchors. Other labels have had lead line added to visually link the label with their associated anchor. View  220  illustrates that the algorithm uses various methods for providing the optimal layout for the labels of the chart. 
     FIG. 3  illustrates exemplary views  300  of a bubble chart with automatic labeling before and after label position optimization in accordance with the present invention. 
   View  310  illustrates that the labels on the bubble chart may be positioned such that determining their related anchors may not be possible. Furthermore, the text of the labels may not be positioned for optimal viewing of the bubbles within the chart, with text that overlaps the bubble edges. 
   View  320  is a bubble chart with improved labeling by running the optimization algorithm of the present invention. The readability of the bubble chart is greatly improved by optimizing the position of the labels within the chart space. The algorithm has moved certain labels away from the anchors (bubbles) to which they are related, while others have been moved closer or even centered, or partially centered, within their anchors. Other labels have had lead line added to visually link the label with their associated anchor while moving the label a distance away from its associated anchor. View  320  illustrates that the algorithm uses various methods for providing the optimal layout for the labels of a bubble chart similar to the various method employed for the pie chart. 
     FIG. 4  illustrates exemplary views  400  of a timeline chart with automatic labeling before and after label position optimization an accordance with the present invention. 
   View  410  illustrates that the labels on the timeline chart are overlapping due to the number of data points included in the space provided. Furthermore, the automated labeling algorithm without the benefit of the present invention is not intelligent enough to vary the spacing of the text from the data points on the timeline. 
   View  420  is a timeline chart with improved labeling by running the optimization algorithm of the present invention. The readability of the timeline is greatly improved by optimizing the position of the labels within the chart space. The algorithm has changed the text format and moved the labels throughout the chart space to optimize the use of the chart space. View  420  illustrates that the algorithm uses various methods for providing the optimal layout for the labels of a runeline chart similar to the various method employed for the pie chart and bubble chart examples provided above. 
   Embodiments other than the embodiments shown in  FIGS. 2-4  may be provided in accordance with the present invention. For example, the present invention may be used optimize the position of labels on a line graph, within a photograph, or in conjunction with other visual data objects. 
     FIG. 5  illustrates an exemplary charting system  500  for carrying out generating a chart and optimizing the label position in accordance with the present invention. Included in system  500  are application program  502  that provides access to document  504  and graphics module  506  for rendering document  504  on computer monitor screen  508 . 
   As used herein, document  504  is a computer-readable file that includes user-readable information, such as text and graphics. Document  504  may be viewed and edited by a user through a user interface of the application program  502 . Exemplary types of documents include, but are not limited to, a spreadsheet, a presentation, or a conventional text document. Thus, depending on the type of document, application program  502  may be, for example, but not limited to, MICROSOFT “WORD”, “POWERPOINT”, “EXCEL”, or other application program. By way of example, as shown on screen  508 , document  504  is a ‘Presentation,’ which is often, but not always, associated with “POWERPOINT”. 
   Particularly relevant to the present description is chart  510  in the presentation. Chart  510  shown in the particular implementation of  FIG. 1  is a column chart. In accordance with other implementations, chart  510  is not limited to a column chart, but can be any other type of chart, such as, but not limited to, a pie chart, a line chart, a scatter plot, a photograph, or other visual data objects. The various data in chart  510  is originally specified by document  504 . Document  504  specifies chart  510  with a chart definition called chart object  512 . 
   Chart object  512  defines the chart  510  in terms of chart elements. Generally, a chart element is a data unit representing an aspect of a chart. Typically a chart element represents an aspect of the chart in relation to the information that the chart conveys or the type of chart. Exemplary chart elements include bars (e.g., for a bar chart), chart axis, chart legends, chart titles, chart labels, element colors, text fonts, element locations, data sources and so on. Chart elements may be referred to as anchors with relation to a label. One implementation of chart object  512  is a set of extensible markup language (XML). To illustrate, an example XML from chart object  512  is shown below: 
   
     
       
             
             
           
         
             
                 
                 
             
           
           
             
                 
               - &lt;c:Chart xmlns:c=“chart” xmlns:s=“shape”&gt; 
             
             
                 
                - &lt;c:Scaling&gt; 
             
             
                 
                  &lt;c:ScaleID&gt;0&lt;/c:ScaleID&gt; 
             
             
                 
                  &lt;c:Orientation&gt;MinMax&lt;/c:Orientation&gt; 
             
             
                 
                 &lt;/c:Scaling&gt; 
             
             
                 
                - &lt;c:Scaling&gt; 
             
             
                 
                  &lt;c:ScaleID&gt;1&lt;/c:ScaleID&gt; 
             
             
                 
                  &lt;c:Orientation&gt;MinMax&lt;/c:Orientation&gt; 
             
             
                 
                 &lt;/c:Scaling&gt; 
             
             
                 
                 &lt;c:Name&gt;Chart 1&lt;/c:Name&gt; 
             
             
                 
                - &lt;c:PlotArea&gt; 
             
             
                 
                 &lt;c:Shape /&gt; 
             
             
                 
               - &lt;c:Graph&gt; 
             
             
                 
                 &lt;c:Type&gt;Column&lt;/c:Type&gt; 
             
             
                 
                 &lt;c:SubType&gt;Clustered&lt;/c:SubType&gt; 
             
             
                 
                 &lt;c:Overlap&gt;0&lt;/c:Overlap&gt; 
             
             
                 
                 &lt;c:ScaleID&gt;0&lt;/c:ScaleID&gt; 
             
             
                 
                 &lt;c:ScaleID&gt;1&lt;/c:ScaleID&gt; 
             
             
                 
                - &lt;c:Series&gt; 
             
             
                 
                 &lt;c:Index&gt;0&lt;/c:Index&gt; 
             
             
                 
                 &lt;c:Name&gt;Series 1&lt;/c:Name&gt; 
             
             
                 
                - &lt;c:Shape&gt; 
             
             
                 
                 - &lt;s:Fill&gt; 
             
             
                 
                  - &lt;s:Pattern&gt; 
             
             
                 
                    &lt;s:Title&gt;Wide upward diagonal&lt;/s:Title&gt; 
             
             
                 
                    &lt;s:Color&gt;black&lt;/s:Color&gt; 
             
             
                 
                    &lt;s:Color2&gt;white&lt;/s:Color2&gt; 
             
             
                 
                   &lt;/s:Pattern&gt; 
             
             
                 
                  &lt;/s:Fill&gt; 
             
             
                 
                 - &lt;s:Border&gt; 
             
             
                 
                   &lt;s:Weight&gt;0&lt;/s:Weight&gt; 
             
             
                 
                   &lt;s:Solid&gt;black&lt;/s:Solid&gt; 
             
             
                 
                  &lt;/s:Border&gt; 
             
             
                 
                 &lt;/c:Shape&gt; 
             
             
                 
                - &lt;c:DataLabels&gt; 
             
             
                 
                 - &lt;c:Shape&gt; 
             
             
                 
                  - &lt;s:Font&gt; 
             
             
                 
                    &lt;s:FontName&gt;Arial&lt;/s:FontName&gt; 
             
             
                 
                    &lt;s:Size&gt;18&lt;/s:Size&gt; 
             
             
                 
                    &lt;s:AutoScale /&gt; 
             
             
                 
                  &lt;/s:Font&gt; 
             
             
                 
                  &lt;/c:Shape&gt; 
             
             
                 
                 - &lt;c:Number&gt; 
             
             
                 
                   &lt;c:FormatString&gt;0.0&lt;/c:FormatString&gt; 
             
             
                 
                  &lt;/c:Number&gt; 
             
             
                 
                  &lt;c:ShowValue /&gt; 
             
             
                 
                 &lt;/c:DataLabels&gt; 
             
             
                 
                - &lt;c:Category&gt; 
             
             
                 
                   &lt;c:DataSource&gt;0&lt;/c:DataSource&gt; 
             
             
                 
                   &lt;c:Data&gt;Sheet1!$A$1:$A$3&lt;/c:Data&gt; 
             
             
                 
                  &lt;/c:Category&gt; 
             
             
                 
                 - &lt;c:Value&gt; 
             
             
                 
                   &lt;c:DataSource&gt;0&lt;/c:DataSource&gt; 
             
             
                 
                   &lt;c:Data&gt;Sheet1!$B$1:$B$3&lt;/c:Data&gt; 
             
             
                 
                  &lt;/c:Value&gt; 
             
             
                 
                  &lt;/c:Series&gt; 
             
             
                 
                  &lt;c:PlotVisible /&gt; 
             
             
                 
                 &lt;/c:Graph&gt; 
             
             
                 
                - &lt;c:Axis&gt; 
             
             
                 
                  &lt;c:Placement&gt;Bottom&lt;/c:Placement&gt; 
             
             
                 
                  &lt;c:AxisID&gt;0&lt;/c:AxisID&gt; 
             
             
                 
                  &lt;c:ScaleID&gt;0&lt;/c:ScaleID&gt; 
             
             
                 
                  &lt;c:CrossingAxis&gt;1&lt;/c:CrossingAxis&gt; 
             
             
                 
                 - &lt;c:Shape&gt; 
             
             
                 
                  - &lt;s:Font&gt; 
             
             
                 
                    &lt;s:FontName&gt;Arial&lt;/s:FontName&gt; 
             
             
                 
                    &lt;s:Size&gt;18&lt;/s:Size&gt; 
             
             
                 
                    &lt;s:AutoScale /&gt; 
             
             
                 
                   &lt;/s:Font&gt; 
             
             
                 
                  &lt;/c:Shape&gt; 
             
             
                 
                 - &lt;c:Number&gt; 
             
             
                 
                   &lt;c:SourceLinked /&gt; 
             
             
                 
                   &lt;c:BuiltInFormat&gt;0&lt;/c:BuiltInFormat&gt; 
             
             
                 
                   &lt;/c:Number&gt; 
             
             
                 
                   &lt;c:MajorTick&gt;None&lt;/c:MajorTick&gt; 
             
             
                 
                   &lt;c:TickMarkSkip&gt;1&lt;/c:TickMarkSkip&gt; 
             
             
                 
                   &lt;c:Type&gt;Automatic&lt;/c:Type&gt; 
             
             
                 
                  &lt;/c:Axis&gt; 
             
             
                 
                 - &lt;c:Axis&gt; 
             
             
                 
                   &lt;c:Placement&gt;Left&lt;/c:Placement&gt; 
             
             
                 
                   &lt;c:AxisID&gt;1&lt;/c:AxisID&gt; 
             
             
                 
                   &lt;c:ScaleID&gt;1&lt;/c:ScaleID&gt; 
             
             
                 
                   &lt;c:CrossingAxis&gt;0&lt;/c:CrossingAxis&gt; 
             
             
                 
                   &lt;c:CrossesAt&gt;Minimum&lt;/c:CrossesAt&gt; 
             
             
                 
                   &lt;c:CrossBetween&gt;Between&lt;/c:CrossBetween&gt; 
             
             
                 
                 - &lt;c:Shape&gt; 
             
             
                 
                  - &lt;s:Font&gt; 
             
             
                 
                    &lt;s:FontName&gt;Arial&lt;/s:FontName&gt; 
             
             
                 
                    &lt;s:Size&gt;18&lt;/s:Size&gt; 
             
             
                 
                    &lt;s:AutoScale /&gt; 
             
             
                 
                   &lt;/s:Font&gt; 
             
             
                 
                  &lt;/c:Shape&gt; 
             
             
                 
                 - &lt;c:Number&gt; 
             
             
                 
                   &lt;c:SourceLinked /&gt; 
             
             
                 
                   &lt;c:BuiltInFormat&gt;0&lt;/c:BuiltInFormat&gt; 
             
             
                 
                  &lt;/c:Number&gt; 
             
             
                 
                  &lt;c:MajorTick&gt;Cross&lt;/c:MajorTick&gt; 
             
             
                 
                  &lt;c:MinorTick&gt;Cross&lt;/c:MinorTick&gt; 
             
             
                 
                  &lt;c:Type&gt;Value&lt;/c:Type&gt; 
             
             
                 
                  &lt;c:MajorUnit&gt;5&lt;/c:MajorUnit&gt; 
             
             
                 
                 &lt;/c:Axis&gt; 
             
             
                 
                &lt;/c:PlotArea&gt; 
             
             
                 
               &lt;/c:Chart&gt; 
             
             
                 
                 
             
           
        
       
     
   
   Document  504  typically also has other document data  514 , which includes, but is not limited to, text and formatting information. In accordance with one implementation, when application program  502  is launched and document  504  is opened, chart object  512  is passed to graphics interface  516  of graphics module  506  for rendering. 
   Graphics interface  516  determines what type of graphic is represented by the chart object  512 . Types of graphics that may be handled by the graphics interface  516  include, but are not limited to, diagrams, charts, or arbitrary shapes. Chart object  512  includes an identifier that indicates that it defines a chart. Based on the chart identifier, graphics interface  516  determines that chart object  512  defines a chart and sends it to charting module  518 . 
   Charting module  518  includes translation engine  520  that translates Chart object  512  into a form that graphics module  506  uses for rendering chart  510  to screen  508 . Specifically, translation engine  520  translates chart object  512  into shape-based chart definition  522 . As its name suggests, shape-based chart definition  522  defines the chart in terms of shapes, rather than chart elements. Use of shapes can improve the chart rendering process, chart appearance, and chart manipulation, by allowing for a mechanism for interacting with graphics. 
   In the translation process, translation engine  520  performs a number of operations. For example, translation engine  520  retrieves data (e.g., numerical data) that makes up chart  510  from data source(s) referenced in chart object  512 . The data source(s) may be document  504  itself, or some other source, such as, but not limited to, another document, a database, a file, the Internet, or a queue. In addition to the data, translation engine  520  may retrieve numerical formatting information that describes how the data is formatted. Numerical formatting information includes, but is not limited to a currency symbol, number of decimal points, percentage or fraction format, or date and time format. 
   Translation engine  520  also translates the chart elements into shapes, such as lines, rectangles, circles, triangles, and so on. A shape is a data unit that simply represents the visual appearance of a chart element and is not tied to, or reliant upon, the underlying numerical chart data. Thus, for example, a bar in chart object  512  will be translated into a rectangle in shape-based chart definition  522 ; a chart axis will be translated into a line, and so on. 
   In addition, translation engine  520  groups selected related shapes to facilitate manipulation of related shapes by the user. Graphics interface  516  provides functions that allow a user to interact with groups of related shapes. Translation engine  520  takes advantage of those functions by grouping related chart elements such as, but not limited to, related data labels and related data series. After retrieving the data, translating chart elements into shapes, and grouping related shapes, translation engine  520  generates shape-based chart definition  522 . 
   An implementation of the shape-based chart definition  522  is composed of XML code. To illustrate, XML code from an exemplary shape-based chart definition  522  is shown below: 
   
     
       
             
           
         
             
                 
             
           
           
             
               - &lt;group&gt; 
             
             
                &lt;id&gt;Chart&lt;/id&gt; 
             
             
               - &lt;shapes&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;ChartArea&lt;/id&gt; 
             
             
                &lt;style&gt;margin-left:0;margin-top:9.75pt;width:501pt;height:319.5pt;z- 
             
             
               index:1&lt;/style&gt; 
             
             
               - &lt;border&gt; 
             
             
                &lt;Solid&gt;black&lt;/Solid&gt; 
             
             
                &lt;Weight&gt;0&lt;/Weight&gt; 
             
             
                &lt;/border&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;group&gt; 
             
             
                &lt;id&gt;Series 1&lt;/id&gt; 
             
             
                &lt;style&gt;margin-left:88.5pt;margin- 
             
             
               top:60pt;width:359.25pt;height:220.5pt;z-index:3&lt;/style&gt; 
             
             
                &lt;coordorigin&gt;438,743&lt;/coordorigin&gt; 
             
             
                &lt;coordsize&gt;479,294&lt;/coordsize&gt; 
             
             
               - &lt;Fill&gt; 
             
             
               - &lt;Pattern&gt; 
             
             
                &lt;Title&gt;Wide upward diagonal&lt;/Title&gt; 
             
             
                &lt;Color&gt;black&lt;/Color&gt; 
             
             
                &lt;Color2&gt;white&lt;/Color2&gt; 
             
             
                &lt;/Pattern&gt; 
             
             
                &lt;/Fill&gt; 
             
             
               - &lt;border&gt; 
             
             
                &lt;Solid&gt;black&lt;/Solid&gt; 
             
             
                &lt;Weight&gt;0&lt;/Weight&gt; 
             
             
                &lt;/border&gt; 
             
             
               - &lt;shapes&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Point 1&lt;/id&gt; 
             
             
                &lt;style&gt;left:438;top:839;width:80;height:198&lt;/style&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Point 2&lt;/id&gt; 
             
             
                &lt;style&gt;left:638;top:743;width:80;height:294&lt;/style&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Point 3&lt;/id&gt; 
             
             
                &lt;style&gt;left:837;top:931;width:80; height:106&lt;/style&gt; 
             
             
                &lt;/rect&gt; 
             
             
                &lt;/shapes&gt; 
             
             
                &lt;/group&gt; 
             
             
               - &lt;group&gt; 
             
             
                &lt;id&gt;Y Axis&lt;/id&gt; 
             
             
               - &lt;border&gt; 
             
             
                &lt;Solid&gt;black&lt;/Solid&gt; 
             
             
                &lt;Weight&gt;0&lt;/Weight&gt; 
             
             
                &lt;/border&gt; 
             
             
               - &lt;shapes&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Line&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:4&lt;/style&gt; 
             
             
                &lt;from&gt;45pt,32.25pt&lt;/from&gt; 
             
             
                &lt;to&gt;45pt,280.5pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 1&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:5&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,281pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,281pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 2&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:6&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,256pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,256pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 3&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:7&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,231pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,231pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 4&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:8&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,207pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,207pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 5&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:9&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,182pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,182pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 6&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:10&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,157pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,157pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 7&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:11&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,132pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,132pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 8&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:12&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,108pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,108pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 9&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:13&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,83pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,83pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 10&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:14&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,57pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,57pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 11&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:15&lt;/style&gt; 
             
             
                &lt;from&gt;40pt,33pt&lt;/from&gt; 
             
             
                &lt;to&gt;48pt,33pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 12&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:16&lt;/style&gt; 
             
             
                &lt;from&gt;38.25pt,281pt&lt;/from&gt; 
             
             
                &lt;to&gt;49.5pt,281pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 13&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:17&lt;/style&gt; 
             
             
                &lt;from&gt;38.25pt,157pt&lt;/from&gt; 
             
             
                &lt;to&gt;49.5pt,157pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;Y Axis Tick Mark 14&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:18&lt;/style&gt; 
             
             
                &lt;from&gt;38.25pt,33pt&lt;/from&gt; 
             
             
                &lt;to&gt;49.5pt,33pt&lt;/to&gt; 
             
             
                &lt;/line&gt; 
             
             
                &lt;/shapes&gt; 
             
             
                &lt;/group&gt; 
             
             
               - &lt;line&gt; 
             
             
                &lt;id&gt;X Axis&lt;/id&gt; 
             
             
                &lt;style&gt;z-index:19&lt;/style&gt; 
             
             
                &lt;from&gt;44.25pt,281pt&lt;/from&gt; 
             
             
                &lt;to&gt;492.75pt,281pt&lt;/to&gt; 
             
             
               - &lt;border&gt; 
             
             
                &lt;Solid&gt;black&lt;/Solid&gt; 
             
             
                &lt;Weight&gt;0&lt;/Weight&gt; 
             
             
                &lt;/border&gt; 
             
             
                &lt;/line&gt; 
             
             
               - &lt;group&gt; 
             
             
                &lt;id&gt;Series 1 DataLabels&lt;/id&gt; 
             
             
                &lt;style&gt;margin-left:106.5pt;margin- 
             
             
               top:33pt;width:324pt;height:164.25pt;z-index:20&lt;/style&gt; 
             
             
                &lt;coordorigin&gt;462,707&gt;&lt;/coordorigin&gt; 
             
             
                &lt;coordsize&gt;432,219&lt;/coordsize&gt; 
             
             
               - &lt;Font&gt; 
             
             
                &lt;FontName&gt;Arial&lt;/FontName&gt; 
             
             
                &lt;Size&gt;18&lt;/Size&gt; 
             
             
                &lt;AutoScale /&gt; 
             
             
                &lt;/Font&gt; 
             
             
               - &lt;shapes&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Series 1 DataLabel 1&lt;/id&gt; 
             
             
                &lt;style&gt;left:462; top:803;width:33; height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;6.0&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Series 1 DataLabel 2&lt;/id&gt; 
             
             
                &lt;style&gt;left:661;top:707; width:33;height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;8.9&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Series 1 DataLabel 3&lt;/id&gt; 
             
             
                &lt;style&gt;left:861;top:895; width:33;height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;3.2&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
                &lt;/rect&gt; 
             
             
                &lt;/shapes&gt; 
             
             
                &lt;/group&gt; 
             
             
               - &lt;group&gt; 
             
             
                &lt;id&gt;Y Axis Labels&lt;/id&gt; 
             
             
                &lt;style&gt;margin-left:10.5pt;margin- 
             
             
               top:22.5pt;width:19.5pt;height:271.5pt;z-index:21&lt;/style&gt; 
             
             
                &lt;coordorigin&gt;334,693&lt;/coordorigin&gt; 
             
             
                &lt;coordsize&gt;26,362&lt;/coordsize&gt; 
             
             
               - &lt;Font&gt; 
             
             
                &lt;FontName&gt;Arial&lt;/FontName&gt; 
             
             
                &lt;Size&gt;18&lt;/Size&gt; 
             
             
                &lt;AutoScale /&gt; 
             
             
                &lt;/Font&gt; 
             
             
               - &lt;shapes&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Y Axis Labels 0&lt;/id&gt; 
             
             
                &lt;style&gt;left:347;top:1024; width:13;height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;0&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Y Axis Labels 5&lt;/id&gt; 
             
             
                &lt;style&gt;left:347;top:858; width:13;height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;5&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;Y Axis Labels 10&lt;/id&gt; 
             
             
                &lt;style&gt;left:334;top:693; width:26;height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
                stroked=“f”&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;10&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
                &lt;/rect&gt; 
             
             
                &lt;/shapes&gt; 
             
             
                &lt;/group&gt; 
             
             
               - &lt;group&gt; 
             
             
                &lt;id&gt;X Axis Labels&lt;/id&gt; 
             
             
                &lt;style&gt;margin-left:112.5pt;margin- 
             
             
               top:296.25pt;width:312pt;height:23.25pt; z-index:22&lt;/style&gt; 
             
             
                &lt;coordorigin&gt;470,1058&lt;/coordorigin&gt; 
             
             
                &lt;coordsize&gt;416,31&lt;/coordsize&gt; 
             
             
               - &lt;shapes&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;X Axis Labels Category 1&lt;/id&gt; 
             
             
                &lt;style&gt;left:470;top:1058; width:15;height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;A&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;X Axis Labels Category 2&lt;/id&gt; 
             
             
                &lt;style&gt;left:670;top:1058; width:16;height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;B&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
                &lt;/rect&gt; 
             
             
               - &lt;rect&gt; 
             
             
                &lt;id&gt;X Axis Labels Category 3&lt;/id&gt; 
             
             
                &lt;style&gt;left:869;top:1058; width:17;height:31;wrap-style:none;text- 
             
             
               anchor:top&lt;/style&gt; 
             
             
               - &lt;textbox style=“fit-shape-to-text:t” inset=“0,0,0,0”&gt; 
             
             
                &lt;div style=“text-align:left”&gt;C&lt;/div&gt; 
             
             
                &lt;/textbox&gt; 
             
             
               &lt;/rect&gt; 
             
             
               &lt;/shapes&gt; 
             
             
               &lt;/group&gt; 
             
             
               &lt;/shapes&gt; 
             
             
               &lt;/group&gt; 
             
             
                 
             
           
        
       
     
   
   Graphics interface  516  receives shape-based chart definition  522  and renders chart  510  on screen  508  as a set of shapes specified by the shape-based chart definition. Graphics interface  516  typically performs the rendering by making calls to operating system or display controller functions. For example, in the WINDOWS operating system, graphics interface  516  may make calls to the graphics display interface (GDI+). 
   As shown, graphics module  506  includes a set of graphics services  524 . Graphics services  524  include services accessible by the application program for manipulating chart  510 . Graphics services  524  provide one or more application programming interface(s) (API) to access the services. 
   Because graphics module  506  renders shapes, graphics services  524  are able to offer high-level functions for manipulating chart  510 . Graphics services  524  can, for example, perform vector-graphics functions on shapes within the chart. To illustrate, a rectangle can be moved easily by calling a single function of graphics services  524  that moves a shape, rather than calling numerous low-level functions to redraw the rectangle in a new location. In addition, graphics module  506  is common to multiple application programs, so that shape manipulation/editing and appearance will be consistent among the application programs. Thus, graphics module  506  can present a graphics user interface for editing shapes in chart  510 , regardless of the type of application program  502 . 
   Label Optimization  526  is the code directed to the present invention within system  500 . Label Optimization  526  receives shape-based chart definition  522  and optimizes the position of the labels according to the optimization algorithm. As previously stated, shape-based chart definition  522  allows the labels to be easily moved since they are defined by their shape rather than by other low-level functions that would require the labels to be redrawn. Label Optimization  526  may be utilized before or after chart  510  is rendered on screen  508  to optimize the positioning of the labels. For example, positioning of the labels according to the optimization algorithm may be automatic for every chart rendered. In contrast, optimization of the labels may be provided according to a user selection, where the user affirmatively selects to have the labels optimized. In one embodiment, labels that are manually positioned by the user are ignored during the optimization process. 
   The term module is used in a general sense to describe a component that is operable to perform one or more designated functions. A module may be implemented in various ways and forms. For example, a module may be implemented in or as hardware, software, firmware, or in various combinations of hardware, software, and/or firmware, depending on such factors as speed, cost, size, etc. For example, and without limitation, in one implementation each of the modules in the system  100  comprises software, such as a dynamic link library (DLL), that is stored on a computer-readable medium and executed on a computing system, such as the computing system described above with respect to  FIG. 1 . 
     FIG. 6  illustrates exemplary pseudo-code for determining the layout of a visual data object that corresponds to the optimal layout of the labels in accordance with the present invention. 
   Implementing exemplary algorithm  600  requires the specification of different functions. The InitializeLayout( ) function defines the initial placement for each of the visual elements and thereby provides a starting point for the search. The PerturbLayout( ) function corresponds to the perturb function previously described and provides a method for changing a given layout into a new layout. The RevertLayout( ) function inverts the actions of PerturbLayout( ) to go from the new layout back to the previous layout. The Random( ) function returns a number between 0.0 and 1.0. Finally, the ScoreLayout( ) function, which corresponds to the objective function previously described, computes how close the current layout is to optimal. In one embodiment, the termination condition may vary according to time limits for achieving a usable layout, the proximity of the layout to optimal, and other factors. In another embodiment, scores are defined to be positive and the lower the score the better the layout. Therefore, the goal is to minimize the score according to the constraints used. The score that is acceptable for a layout to be used, depends on the termination condition of the algorithm. 
   As shown in the pseudo-code, the algorithm accepts all good moves within the search space and, with a probability that is an exponential function of a temperature T, accepts some bad moves as well. As the algorithm progresses, T is annealed (or decreased), resulting in a decreasing probability of accepting bad moves. Accepting bad moves in this manner allows the algorithm to escape local minima in the score function. 
   The constraints defined for providing the optimal layout of the labels may include constraints such as minimizing the distance from the anchor, minimizing the overlap of the labels, minimizing the overlap with elements, font restrictions, orientation restrictions, and other limitations that affect how a label may be manipulated. Any number of constraints may be fed into the algorithm for manipulating the labels to optimize their position with the viewable space. 
   The above specification, examples and data provide a complete description of the manufacture and use of the composition of the invention. Since many embodiments of the invention can be made without departing from the spirit and scope of the invention, the invention resides in the claims hereinafter appended.