<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us"><title>Juice Analytics: Agile Analytics</title><link href="http://www.juiceanalytics.com/writing/" rel="alternate" /><id>http://www.juiceanalytics.com/writing/</id><updated>2008-07-13T12:56:43Z</updated><link rel="self" href="http://feeds.feedburner.com/JuiceAnalyticsElsewhere" type="application/atom+xml" /><entry><title>Godin Dumps on Bar Charts; Data Visualization Record Falls to 1 and 1</title><link href="http://www.juiceanalytics.com/writing/godin-dumps-bar-charts/" rel="alternate" /><updated>2008-07-13T12:56:43Z</updated><id>http://www.juiceanalytics.com/writing/godin-dumps-bar-charts/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.sethgodin.com/sg/"&gt;Seth Godin&lt;/a&gt;, well-known marketing guru, took a strong and misguided stand against bar charts&lt;sup&gt;1&lt;/sup&gt; in a recent blog post entitled &lt;a href="http://sethgodin.typepad.com/seths_blog/2008/07/the-three-laws.html"&gt;&amp;#8220;The three laws of great graphs&amp;#8221;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Godin suggests that bar charts (and presumably other chart types like scatterplots, bubble charts, bullet charts, treemaps, etc.) give too much latitude for data confusion and ambiguity when used in presentations. In Godin&amp;#8217;s view, a chart should make a single, clear point and leave no room for alternative conclusions.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;The only reason (did I mention only) to use a chart in a presentation is to make a point. If you want to prove some deep insight or give people textured data to draw their own conclusions, DON&amp;#8217;T put it in a presentation.&amp;#8221;
  &amp;#8220;If the facts demand nuance, don&amp;#8217;t use a graph, because you won&amp;#8217;t get nuance, you&amp;#8217;ll get confusion.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Godin had hit on a similar point a while back when he &lt;a href="http://www.juiceanalytics.com/writing/godins-take-on-tufte/"&gt;critiqued&lt;/a&gt; Edward Tufte&amp;#8217;s favorite infographic &lt;em&gt;Napoleon&amp;#8217;s March to Moscow&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;I think [Tufte] is completely out of his gourd and totally wrong. I think this is one of the worst graphs ever made&amp;#8230;To make me take 15 minutes to study it doesn&amp;#8217;t make sense.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I agree that complex infographics aren&amp;#8217;t an effective communication mechanism for many audiences, particularly if you are interested in telling a focused story.&lt;/p&gt;

&lt;p&gt;Unfortunately, he uses this reasonable foundation as a jumping off point to claim that bar charts are overrated and unnecessary (he throws in a heinous 3D column chart for emphasis). &amp;#8220;The problem with bar charts,&amp;#8221; he says &amp;#8220;is that they should either be line/area charts (when graphing a change over time, like unemployment rates) or they should be a simple pie chart&amp;#8221;&lt;/p&gt;

&lt;p&gt;That popping sound you hear is &lt;a href="http://www.perceptualedge.com/blog/?p=247"&gt;Stephen Few&amp;#8217;s&lt;/a&gt; head bursting.&lt;/p&gt;

&lt;p&gt;It is reasonable to argue that a value changing over time is often better suited to a line or area chart. But pie better than bar. Sorry, no can buy. He obviously got some flak after this first post:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;I stepped on the toes of many data presentation purists&lt;sup&gt;2&lt;/sup&gt; yesterday, so let me reiterate my point to make it crystal clear: In a presentation to non-scientists (or to bored scientists), the purpose of a chart or graph is to make one point, vividly. Tell a story and move on. If you can&amp;#8217;t be both vivid and truthful, it doesn&amp;#8217;t belong in your presentation.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;His follow-up post &lt;a href="http://sethgodin.typepad.com/seths_blog/2008/07/bar-graphs-vs-p.html"&gt;Bar graphs vs. Pie charts&lt;/a&gt; attempts to solidify his argument but ends up stepping in more goo. To make his point, he shows a effective pie chart versus an ineffective bar chart.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/godin_pie.jpg" alt="Godin Pie Chart" title=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/godin_bar.jpg" alt="Godin Bar Chart" title=""&gt;&lt;/p&gt;

&lt;p&gt;In a not so subtle sleight of hand, he has added another data series to the bar chart to show how it doesn&amp;#8217;t make a single, clear point. As my colleague Pete likes to say, &lt;a href="http://www.google.com/search?q=if+my+aunt+had"&gt;if my aunt had&amp;#8230;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;His argument appears to boil down to a belief that pie charts are so simple that it is impossible to deviate from his one-point-per-chart rule. Or put another way: presenters can&amp;#8217;t be trusted to follow this rule, so best to take away anything dangerous. This parallels the misplaced anger people have toward PowerPoint. I wrote a post called &lt;a href="http://www.juiceanalytics.com/writing/a-poor-craftsman-blames-his-tools/"&gt;A Poor Craftsman Blames His Tools&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That question aside, I reject his rejection of bar charts for a number of reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is a lot of evidence that bar charts &lt;a href="http://www.juiceanalytics.com/writing/the-problem-with-pie-charts/"&gt;are&lt;/a&gt; &lt;a href="http://www.perceptualedge.com/blog/?p=89"&gt;superior&lt;/a&gt; to pie charts even when showing simple data. Bar charts allow for better labeling and show relative size more effectively.&lt;/li&gt;
&lt;li&gt;Pie charts are the most frequently mis-used charts in my experience. There seems to be an irresistible need to craft animated, 3D, shiny pies &amp;#8212; all of which adds zero communication value.&lt;/li&gt;
&lt;li&gt;Restricting data presentation to a few chart types limits your ability to communicate. Scatterplots, for example, can carry powerful and clear messages about relationships between variables.&lt;/li&gt;
&lt;li&gt;If the data and message is super simple (as Godin would want), using a chart is likely a waste of pixels. In his pie chart above, the only message he wants to convey is that trolls rule. Why not simply state: &amp;#8220;Trolls are the largest segment with 45% share&amp;#8221; and leave out the chart.&lt;/li&gt;
&lt;li&gt;Bar charts can show trends and magnitudes simultaneously. I don&amp;#8217;t believe this has to be a liability in communication, nor should they always be separated. If I wanted to show that trolls are both the biggest segment and the fastest growing, breaking those facts into separate slides seems more distracting than useful. The points are tightly linked and supportive of each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;&lt;em&gt;1. The &amp;#8220;bar&amp;#8221; chart that Godin refers to is actually a column chart. I&amp;#8217;ll use the term bar charts to refer to both bar and column charts in this post. However, the distinction between these two chart types is important as each chart is appropriate in different circumstances. For example, when there are a lot of categories, a (true) bar chart allows for much clearer labeling.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. &amp;#8220;Purists&amp;#8221; seems to be used to label the objectors as a bunch of academics who don&amp;#8217;t appreciate the realities of the business world. If you&amp;#8217;re a loyal reader of our blog, you know that is a stick we prefer to use on others.&lt;/em&gt;&lt;/p&gt;
</summary><category term="chart" /><category term="graph" /><category term="visualization" /></entry><entry><title>Why Analytical Applications Fail</title><link href="http://www.juiceanalytics.com/writing/why-analytical-applications-fail/" rel="alternate" /><updated>2008-07-07T09:16:56Z</updated><id>http://www.juiceanalytics.com/writing/why-analytical-applications-fail/</id><summary type="html">&lt;p&gt;Many analytical applications fail for a simple reason: they assume users know precisely what they need before they&amp;#8217;ve begun the analysis. There are cases where this assumption holds and the user has a specific end-point in mind. But more often, users depend on the tool to track down an answer with only a vague idea of where to start. The exploratory analysis that follows can feel like swimming upstream when the application isn&amp;#8217;t designed to facilitate the journey.&lt;/p&gt;

&lt;p&gt;The source of this mismatch is partly rooted in the technical perspective of database developers. The simplest path to providing data access is to let users fill out a form to define a SQL query. It is a linear mindset that isn&amp;#8217;t well-suited to ambiguous problems.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d like to offer a couple examples that illustrates the difference between the common, form-based approach and a more dynamic, interactive approach. Then I&amp;#8217;ll explain the implicit assumptions behind the different models and why it matters.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;At its heart, &lt;a href="http://www.travelocity.com/"&gt;Travelocity&lt;/a&gt; is a travel analysis tool intended to help you find the best flight (or hotel, car rental, package, etc.) given a complex set of parameters. The relative importance of each of these parameters (departure day/time, return day/time, airports, connections, preferred airlines, price, etc.) is a personal preference&amp;#8230; but not one that is explicitly or fully known even to the user. For example, it would be hard for me to say exactly how much more I would pay for a non-stop flight or what is the relative value of a more convenient airport versus a more reliable airline. These preferences are hard to understand prior to seeing specific trade-offs.&lt;/p&gt;

&lt;p&gt;Travelocity approaches this complex problem in the way that so many analytical problems do: it asks for all your preferences first then offers a static list results for the specified query.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/travelocity_results.png" alt="Travelocity Results" title=""&gt;&lt;/p&gt;

&lt;p&gt;A few things to note about this search results page:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On a busy web page, &amp;#8220;Change Your Search&amp;#8221; is not emphasized.&lt;/li&gt;
&lt;li&gt;The &amp;#8220;tracker&amp;#8221; across the top shows a linear five-step process. The user is expected to flow through this sequence in order.&lt;/li&gt;
&lt;li&gt;Getting results for a new search takes more than ten seconds.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I&amp;#8217;ve been a loyal Travelocity user for years, and I don&amp;#8217;t want to imply that this site is poorly designed or difficult to use. The problem is more subtle than that.&lt;/p&gt;

&lt;p&gt;By way of comparison, let&amp;#8217;s take a look at a more recent entrant to the online travel business, &lt;a href="http://www.kayak.com/"&gt;Kayak&lt;/a&gt;. This site is designed with a different usage model in mind. Kayak starts by asking for the same information as Travelocity, but the results pages is designed to support further analysis:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/kayak_results.png" alt="Kayak Results" title=""&gt;&lt;/p&gt;

&lt;p&gt;The biggest difference is the prominent filtering functionality on the left side of the page. The filters allow users to narrow down their original search without leaving the results page (it takes less than a second to view refreshed results after changing a filter&amp;#8212;no &amp;#8220;run report&amp;#8221; button required). In addition, Kayak places more emphasis on the start-over option. The designers of this site did not assume your first search would be enough to get you to the perfect flight option. Finally, notice the different &amp;#8220;views&amp;#8221; of the data that are available for a given result set. The views help support different types of decisions based on the same search parameters.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Analytical applications for business have similar underlying structures and usage models. The analysis process in Omniture SiteCatalyst, the leading web analytics platform for large sites, offers a typical example:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/omniture_start.png" alt="Omniture start page" title=""&gt;&lt;/p&gt;

&lt;p&gt;This application offers lots of functionality, and it feels like featuring functionality is the primary purpose of the start page. If you want to get to useful data rather than view an advertisement for Omniture products and events, you can start by selecting the &amp;#8220;Report Builder:&amp;#8221;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/omniture_form.png" alt="Omniture form" title=""&gt;&lt;/p&gt;

&lt;p&gt;Now, it is form-filling time. Like Travelocity, the user is expected to choose the precise parameters before they get to see anything. The resulting report requires a 10 second wait, and the result is static. Any additional filtering will require you to run a new report&lt;/p&gt;

&lt;p&gt;Now let&amp;#8217;s look at how Google Analytics chooses to structure the user experience:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/google_analytics_results.png" alt="Google Analtyics dashboard" title=""&gt;&lt;/p&gt;

&lt;p&gt;In contrast to SiteCatalyst, Google Analytics shows you results immediately&amp;#8212;no defining or configuring a report before you can get started. Similar to Kayak, the application offers a bunch of options on the report results page to refine parameters (e.g. data ranges, metrics, comparisons).&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Travelocity and Omniture make a few assumptions common to analytical applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users can &lt;em&gt;accurately&lt;/em&gt; define their need (i.e. they already know what they are looking for).&lt;/li&gt;
&lt;li&gt;Users can &lt;em&gt;precisely&lt;/em&gt; define their need (i.e. they know all the relevant parameters).&lt;/li&gt;
&lt;li&gt;Users&amp;#8217; workflow will follow a linear sequence of events. Going back to the beginning is a failure of the process or user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More effective analytical applications like Kayak and Google Analytics make different assumptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users have a general question, but do not necessarily know details about what they're looking for.&lt;/li&gt;
&lt;li&gt;Users need to see results before they can ask better, more detailed questions. These feedback loops provide critical learning.&lt;/li&gt;
&lt;li&gt;Users need to get to data as quickly and easily as possible. A screen without data is delayed progress.&lt;/li&gt;
&lt;li&gt;Different views of the data can provide different insights about results.&lt;/li&gt;
&lt;li&gt;Users want the application to keep up with their trains of thought. Speed and responsiveness matter. Here&amp;#8217;s a framework from &lt;a href="http://www.useit.com/papers/responsetime.html"&gt;Jakob Nielsen&amp;#8217;s blog&lt;/a&gt; about response time:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;0.1 second&lt;/strong&gt; is about the limit for having the user feel that the system is reacting instantaneously, meaning that no special feedback is necessary except to display the result.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;1.0 second&lt;/strong&gt; is about the limit for the user&amp;#8217;s flow of thought to stay uninterrupted, even though the user will notice the delay. Normally, no special feedback is necessary during delays of more than 0.1 but less than 1.0 second, but the user does lose the feeling of operating directly on the data.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;10 seconds&lt;/strong&gt; is about the limit for keeping the user&amp;#8217;s attention focused on the dialogue. For longer delays, users will want to perform other tasks while waiting for the computer to finish, so they should be given feedback indicating when the computer expects to be done. Feedback during the delay is especially important if the response time is likely to be highly variable, since users will then not know what to expect.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In my experience, making the right assumptions about user behavior makes all the difference between an application people enjoy and depend on and an application people dread using.&lt;/p&gt;
</summary><category term="analytics" /><category term="reporting" /></entry><entry><title>Microsoft's Executive Dashboard... Magnifying Glass Required</title><link href="http://www.juiceanalytics.com/writing/microsofts-executive-dashboard/" rel="alternate" /><updated>2008-06-26T08:26:37Z</updated><id>http://www.juiceanalytics.com/writing/microsofts-executive-dashboard/</id><summary type="html">&lt;p&gt;Organizations have a personality, and it bleeds into everything from executive reporting to product offerings. A recent Fortune article entitled &lt;a href="http://money.cnn.com/2008/06/20/technology/ballmer_0707.fortune/"&gt;Microsoft without Gates&lt;/a&gt; offers this wonderful tidbit about Steve Ballmer, CEO of Microsoft:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Even though he never was a serious computer programmer, by all accounts Ballmer is just as good at math as Gates is. He lives and breathes data. &amp;#8220;Steve has a computer in his head,&amp;#8221; says Bob Muglia, a 20-year company man who heads the Server and Tools division. Ballmer expects his subordinates to be adept in math as well. He distributes 11-by-17 sheets filled with numbers detailing the progress of various operations. The numerals are so small that executives use transparent magnifier rulers to see them. But there are never any columns showing percentage changes. Ballmer believes people ought to do that in their heads. It saves space on the paper for more numbers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wow. If it is as bad as the author describes, Ballmer has designed the anti-dashboard.&lt;/p&gt;

&lt;p&gt;&lt;p&gt;The Presentation Zen &lt;a href="http://www.presentationzen.com/presentationzen/2005/11/the_zen_estheti.html"&gt;blog&lt;/a&gt; offers another great example of organization culture as displayed in business artifacts:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://presentationzen.blogs.com/presentationzen/images/complicated_bill2.jpg"&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Gates here explaining the Live strategy. A lot of images and a lot of text...Good graphic design guides the viewer and has a clear hierarchy or order so that she knows where to look first, second, and so on. What is the communication priority of this visual? It must be the circle of clip art, but that does not help me much.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src="http://presentationzen.blogs.com/presentationzen/images/zen_master.jpg"&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Does it get more "Zen" than this? "Visual-Zen Master," Steve Jobs, allows the screen to fade completely empty at appropriate, short moments while he tells his story.&lt;/p&gt;
&lt;/blockquote&gt;
</summary><category term="dashboard" /><category term="reporting" /><category term="microsoft" /></entry><entry><title>Clever != Smart Naming: Don't make your customers work</title><link href="http://www.juiceanalytics.com/writing/clever-not-equal-smart-naming/" rel="alternate" /><updated>2008-06-10T08:20:43Z</updated><id>http://www.juiceanalytics.com/writing/clever-not-equal-smart-naming/</id><summary type="html">&lt;p&gt;Straight from the parallel universe where clever and horrible go together like peanut butter and chocolate comes the following press release:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We are excited to announce the launch of our new community website for Sears and Kmart customers. The service you originally registered with, My SHC Community is now called &lt;a href="http://sk-you.com"&gt;sk-YOU&lt;/a&gt;. The new name represents "Sears and Kmart, building a better relationship with you" and that is of course, part of our vision and mission. It is a growing and personalized online community currently comprised of 40,000 consumers who want to be heard. You can share ideas, opinions and thoughts on a wide variety of topics from travel to kitchen appliances and cell phone service. It enables you to provide feedback and guidance on the offers and shopping experiences that are most important to you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I can see how this sounded wildly clever in a meeting.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Mash Sears, Kmart, and "you" all together and look what you get.  It shows our commitment to the customer and it sounds like "sku".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bzzzt, horrible. People don't care about stock keeping units&amp;mdash;and they certainly don't want to be associated with one. They don't care about clever. Unless you're a financier, there's no reason to associate Sears with Kmart.  Branding should help the you understand and remember a product. It's not about how you perceive the customer or about how you perceive an internal initiative. The dash and all caps YOU makes it harder for the customer to remember. But I ramble.&lt;/p&gt;

&lt;p&gt;At Juice, our naming bible is available in PDF form from &lt;a href="http://www.igorinternational.com/"&gt;Igor International&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://www.igorinternational.com/process/naming-guide-product-company-names.php"&gt;http://www.igorinternational.com/process/naming-guide-product-company-names.php&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The central wisdom of this guide&amp;mdash;and it's packed full of gems, naming taxonomies by industry, checklists, taglines, case studies&amp;mdash;is that names fall into the following categories.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Descriptive names&lt;/em&gt; (names that describe what the product or company does)
BMW, IBM, AdWords   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good for a product, easy to remember   &lt;/li&gt;
&lt;li&gt;Rough sledding for a company name, as there will be dozens of companies in the field with similar names (unless you have 100 years of meticulous branding like BMW and IBM)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Invented names with latin roots&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aquilent, Taligent, Acela, Agilent&lt;/li&gt;
&lt;li&gt;"Safe" choices, hard to remember, a blank slate. Generally too clever by half. Hey, did you think it was clever to name a company as a cross between "agile" and "intelligent"? Nobody cares!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Invented names that are fun to say&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Snapple, Oreo, Kodak   &lt;/li&gt;
&lt;li&gt;Fun to say, opens the door for lots of positive associations with strong branding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Experiential names&lt;/em&gt; (names that describe the experience of the company or product)   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigator, Safari, TrailBlazer, Fidelity&lt;/li&gt;
&lt;li&gt;Intuitive but common, doesn't differentiate, a workmanlike approach for a product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Evocative names&lt;/em&gt; (names that evoke feelings about the experience you will have with the company&amp;mdash;those feelings may even be initially negative)   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caterpillar, Apple, Amazon, AirPort, Target, Yahoo, Virgin   &lt;/li&gt;
&lt;li&gt;Connects emotionally with people because they have lots of previous experience with the word. "Scary" choices that are hard to get a committee to agree to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We often are are asked why we're named "Juice"&amp;mdash;Igor is the answer. When we go places, people say "Heeey, Juice guys!"&amp;mdash;if you're a client, be aware you're not the first one to use that line. We benefit from every dollar Nantucket Nectars spends on their "Juice Guys" ads and we love it. Every dollar Tropicana spends helps you remember our name. Even OJ Simpson is on our branding team.&lt;/p&gt;

&lt;p&gt;If you're naming an internal product, steer toward descriptive names or evocative names. If you're creating a reporting portal, don't be afraid to call it "Report Portal". Or call it "Butterfly" or "Moonbeam." Brighten people's lives by delivering fun, or ease their lives by not making them remember some obscure acronym. Most of all, remember to be a servant of your customers and that clever is not equal to smart.&lt;/p&gt;
</summary><category term="branding" /><category term="naming" /><category term="marketing" /></entry><entry><title>Mashing Google Analytics With External Data</title><link href="http://www.juiceanalytics.com/writing/mashing-google-analytics-external-data/" rel="alternate" /><updated>2008-06-09T10:41:00Z</updated><id>http://www.juiceanalytics.com/writing/mashing-google-analytics-external-data/</id><summary type="html">&lt;p&gt;A couple months ago, we put together a &lt;a href="http://www.juiceanalytics.com/writing/keyword-trends-google-analytics-greasemonkey/"&gt;Greasemonkey tool&lt;/a&gt; that sucked data out of Google Analytics, and after mining it for trend information, integrated it back into the GA interface.  This week's tool combines and extends Google Analytics with data from an outside source.&lt;/p&gt;

&lt;p&gt;Here is a quick alpha of our Greasemonkey integration of external data reporting into Google Analytics for &lt;a href="http://www.kampyle.com"&gt;Kampyle&lt;/a&gt;, a "feedback analytics service."  Click on the images to zoom in.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://media.juiceanalytics.com/images/ga_integration1_fp.png" title="Google Analytics Integration" rel="shadowbox[Gallery1]"&gt;&lt;img style="border: 2px solid #3683FF" src="http://media.juiceanalytics.com/images/ga_integration1.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the 'Kampylize' tab queries the Kampyle site in real-time to populate the standard GA data table.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://media.juiceanalytics.com/images/ga_integration2_fp.png" title="Kamplylized Google Analytics Integration" rel="shadowbox[Gallery1]"&gt;&lt;img style="border: 2px solid #3683FF" src="http://media.juiceanalytics.com/images/ga_integration2.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img title="Non-Functional Feedback Button" src="http://media.juiceanalytics.com/images/kampyle_thumb.gif" style="float: right"&gt;
Our friends at &lt;a href="http://www.kampyle.com"&gt;Kampyle&lt;/a&gt; run a service that allows website owners to put a feedback button on individual pages of their website. All information submitted by the user is uploaded to a central Kampyle database that compiles the user feedback with web page url and standard internet statistics such as the name of the browser.  Website owners can access a server-end service that consists of a reporting site complete with summary data tables, graphs, and charts. &lt;/p&gt;

&lt;p&gt;Since both sites are web-based reporting suites segmented in a similar fashion (individual website, date, web browser, etc.), they integrate together naturally. There is a lot of value in placing related data side by side, allowing users to get a more holistic picture of web site performance. If you have other ideas of data sources that would fit neatly with Google Analytics, let us know and we'll consider building the integration.&lt;/p&gt;

&lt;p&gt;If you're interested in technical details, &lt;a href="http://www.juiceanalytics.com/openjuice/how-did-we-mash-data-google-analytics/"&gt;continue to Open Juice to see how this is all accomplished...&lt;/a&gt;&lt;/p&gt;
</summary><category term="googleanalytics" /><category term="reporting" /><category term="google" /></entry><entry><title>10 Minute Reviews: Open Flash Chart</title><link href="http://www.juiceanalytics.com/writing/10-minute-reviews-open-flash-chart/" rel="alternate" /><updated>2008-05-29T20:57:28Z</updated><id>http://www.juiceanalytics.com/writing/10-minute-reviews-open-flash-chart/</id><summary type="html">&lt;p&gt;We frequently get requests to review and write about analytics-related solutions. I&amp;#8217;ve put off most of these requests because it sounded like a lot of work. Then I had an &lt;a href="http://www.fourhourworkweek.com/"&gt;4-hour-work-week-style&lt;/a&gt; epiphany: most new users only give a new product or service a few minutes before they make up their mind. Why can&amp;#8217;t I make the same snap judgement and call it an expert opinion? &lt;/p&gt;

&lt;p&gt;First up is &lt;a href="http://teethgrinder.co.uk/open-flash-chart/"&gt;Open Flash Charts&lt;/a&gt;, pointed out to us by &lt;a href="http://towerofjade.com/"&gt;Matt Bear&lt;/a&gt;. This is an open source project started by John Glazebrook to provide flash charts that can be embedded in web pages. I love John&amp;#8217;s explanation for taking on this project:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;Once upon a time I had to deal with a company who sell flash charting components, their component had a bug that I needed fixing, so I emailed them about it asking when it&amp;#8217;d be fixed. (Remember that I had paid real money for this software.) They were so incompetent, rude and obnoxious that after three or four weeks of emails I thought to myself &amp;#8220;I could learn Flash and Actionscript and write my own charting component, release it as Open Source, host it on sourceforge and build up a community of helpful coders faster than they can fix a single bug.&amp;#8221; And that is what I did. And that is why it is free. I guess the moral of the lesson is: don&amp;#8217;t piss off your customers.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Great lesson. Great attitude. There are a bunch of vendors in this space (&lt;a href="http://www.fusioncharts.com/"&gt;Fusion Charts&lt;/a&gt;, &lt;a href="http://www.anychart.com"&gt;AnyChart&lt;/a&gt;, &lt;a href="http://www.ilog.com/products/jviews/charts/"&gt;ILOG&lt;/a&gt;, &lt;a href="http://www.maani.us/charts/index.php"&gt;PHP/SWF Charts&lt;/a&gt;, &lt;a href="http://www.amcharts.com"&gt;amCharts&lt;/a&gt;, &lt;a href="http://www.corda.com/corda-gallery.php"&gt;Corda&lt;/a&gt;) and the going price seems to start at $500 for a developer's license up to $5,000 for an enterprise license. (Apparently that doesn&amp;#8217;t always come with customer service.)&lt;/p&gt;

&lt;p&gt;Open Flash Charts isn&amp;#8217;t as flashy as any of these products, but that tends to be a good thing for charting components. Here&amp;#8217;s a column chart from Fusion charts (notice how each bar is a separate color, for no good reason)
&lt;img src="http://media.juiceanalytics.com/images/FusionChart.png" alt="Fusion Charts" title=""&gt;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the Open Flash Charts 
&lt;img src="http://media.juiceanalytics.com/images/OpenFlashChart.png" alt="Open Flash Charts" title=""&gt;&lt;/p&gt;

&lt;p&gt;Open Flash Charts does a number of things well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It seems to be easy to implement. Basically, you just copy the Open Flash Chart SWF file into your web server, then start embedding flash charts into your HTML and point to either static or dynamic data on your server.&lt;/li&gt;
&lt;li&gt;You can configure data labels, background, number formats, on-click events, tooltips, etc.&lt;/li&gt;
&lt;li&gt;All the basic chart types are available (bar, line, area, pie, scatter).&lt;/li&gt;
&lt;li&gt;The help forum seem both lively (multiple messages a day) and supportive (a generally polite tone with lots of code posted). &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the negative side, Open Flash Charts doesn&amp;#8217;t totally succeed in terms of data visualization fundamentals. The default charts have some contrast issues, odd color choices, and a little excess chartjunk. And when the charts get some &amp;#8220;pizzazz,&amp;#8221; things get worse:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/PizzazzChart.png" alt="Pizzazz chart" title=""&gt;&lt;/p&gt;

&lt;p&gt;I know&amp;#8230; it is an open source project, so I should step up and fix the things I don&amp;#8217;t like. I would, but I just ran out of my 10 minutes.&lt;/p&gt;
</summary><category term="chart" /><category term="graph" /></entry><entry><title>A Dashboard Alerts Checklist</title><link href="http://www.juiceanalytics.com/writing/dashboard-alerts-checklist/" rel="alternate" /><updated>2008-05-08T21:09:53Z</updated><id>http://www.juiceanalytics.com/writing/dashboard-alerts-checklist/</id><summary type="html">&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/alert_header.png" alt="Alert" title=""&gt;&lt;/p&gt;

&lt;p&gt;There is a tendency with reporting, and dashboards in particular, to cram as much information on the page as possible. It is a problem that Avinash describes with &lt;a href="http://www.kaushik.net/avinash/2008/04/the-action-dashboard-an-alternative-to-crappy-dashboards.html"&gt;typical candor&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;This one of the core reasons why most dashboards are 'crappy', i.e. they are data pukes that provide little in terms of context and even less in terms of actionable value.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the past, we have offered tools to make data presentation as clear as possible (&lt;a href="http://www.juiceanalytics.com/chartchooser/"&gt;chart chooser&lt;/a&gt;, &lt;a href="http://www.juiceanalytics.com/writing/fixing-excel-charts/"&gt;Excel chart cleaner&lt;/a&gt;). Sometimes clean isn&amp;#8217;t enough; a more dramatic approach is needed.&lt;/p&gt;

&lt;p&gt;One alternative is to shift the focus from the full data to changes in the most critical data points. By pulling out the important exceptions, you can make it easier for your audience to digest what matters and take action. &lt;/p&gt;

&lt;p&gt;Stephen Few says in his book &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.amazon.com%2FInformation-Dashboard-Design-Effective-Communication%2Fdp%2F0596100167&amp;amp;ei=ayYXSLu5KJ3uzAT378SXAg&amp;amp;usg=AFQjCNGke5EXrFP5ws3UIjCyNHhUqjXEdQ&amp;amp;sig2=ezRCMLz3Pu1Ur7mIhRjBPQ"&gt;Information Dashboard Design&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;The best way to condense a broad spectrum of information to fit onto a dashboard is in the form of summaries and exceptions&amp;#8230;given the purpose of a dashboard to help people monitor what&amp;#8217;s going on, much of the information it presents is necessary only when something unusual is happening; something that falls outside the realm of normality, into the realm of problems and opportunities. Why make someone wade through hundreds of values when only one or two require attention? We call these critical values exceptions.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Alerts are one mechanism to turn the focus to the exceptions, outliers and data highlights. Whether embedded in the dashboard or presented separately, alerts can be the extra layer of abstraction that make a dashboard useful. Unfortunately, they are hard to get right. I&amp;#8217;ve arrived at four C&amp;#8217;s for effective alerts&amp;#8212;&lt;strong&gt;context, cogency, communication, control&lt;/strong&gt;. Here&amp;#8217;s a checklist to consider as you build alerts into a dashboard or report:&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Context: Users need to understand how an alert is defined and how it fits into the larger picture.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Are the parameters well defined?&lt;/em&gt; An alert is commonly defined by the following factors: &lt;em&gt;metric&lt;/em&gt; (e.g. revenue), &lt;em&gt;dimension&lt;/em&gt; (e.g. time), &lt;em&gt;delta&lt;/em&gt; (e.g month over month change), &lt;em&gt;scope&lt;/em&gt; (e.g. Northeast region, Peanut-product line), &lt;em&gt;threshold&lt;/em&gt; (e.g. increase or decrease of 10%).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Is the timing of the alerts actionable?&lt;/em&gt; One client explained to us that fluctuations in many of their metrics make monthly alerts too frequent&amp;#8212;it would unnecessarily alarm people when, from their perspective, no significant trend had been established.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Is the change &lt;a href="http://en.wikipedia.org/wiki/Statistical_significance"&gt;statistically significant&lt;/a&gt;?&lt;/em&gt; This is of particular importance when you are measuring deltas. A &lt;a href="http://www.juiceanalytics.com/writing/enhancing-google-analytics-using-greasemonkey/"&gt;doubling of traffic&lt;/a&gt; from a referring site doesn&amp;#8217;t mean much when it is moving from one to two visitors. &lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Cogency: An alerting system needs to avoid causing unnecessary alarm while delivering easy-to-understand information that can be acted upon.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C&lt;em&gt;an the alerts be described in simple terms that even an executive can understand?&lt;/em&gt; Alerts should have a real-world meaning that users are familiar with. If an alert is based on a &lt;a href="http://www.juiceanalytics.com/writing/franken-measuresor-how-construct-useful-composite-/"&gt;complex metric&lt;/a&gt;, for example, users will be confused as to the implications.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Is the alert actionable?&lt;/em&gt; In the best cases, alerts should point users to both the drivers of the alert and the actions that can address the situation. This system does neither:
![terror warning system]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Are the alerts so granular and/or frequently triggered that users will get alert fatigue?&lt;/em&gt; Excessive use of alerts will undermining their credibility. We saw this happen at one client where an IT-designed system threw off alerts like they were going out of style. The application went out of style the next year when users decided it was more distracting than useful. Here&amp;#8217;s another &lt;a href="http://www.dashboardinsight.com/dashboards/live-dashboards/brand-scorecard.aspx"&gt;example&lt;/a&gt; of a system that seems designed to raise blood pressure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/lit_up_dashboard.png" alt="Lit up dashboard" title=""&gt;
(It appears that a 5% increase in brand attribute performance isn&amp;#8217;t good enough to get you out of the yellow.)&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Communication: Alerts must be designed to effectively capture attention and inform.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Is the alert placed in context?&lt;/em&gt; &lt;a href="http://finance.google.com/finance?q=yhoo&amp;amp;hl=en"&gt;Google Finance&lt;/a&gt; does a nice job of putting news alerts within the stock chart.
&lt;img src="http://media.juiceanalytics.com/images/google_finance.png" alt="Google Finance" title=""&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Is it clear what the user should do next?&lt;/em&gt; Give the user a clear path to more information so they can understand the full context of the alert.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Does the sophistication of your alerts match the sophistication of your audience?&lt;/em&gt; I&amp;#8217;ve found that it is better to start with some simple alerts so your audience can begin to learn what they mean and how to react. Over time, these alerts can become more refined and focused to capture complex situations.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Does the alert draw the eye without being visually overwhelming or annoying?&lt;/em&gt; Here&amp;#8217;s a &lt;a href="http://www.enterprise-dashboard.com/2008/03/13/when-a-dashboard-goes-red/"&gt;article&lt;/a&gt; about how to &amp;#8220;reduce visual noise&amp;#8221; in dashboards.  &lt;/li&gt;
&lt;li&gt;&lt;em&gt;Is color used appropriately?&lt;/em&gt; Red means bad. Yellow is sorta bad. Green means good (but &amp;#8220;good&amp;#8221; things don&amp;#8217;t need to be alerts). It isn&amp;#8217;t particularly fair for color blind folks, but these conventions are deeply rooted.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Have you found the best mechanism for presenting alerts?&lt;/em&gt; Alerts can be sent through e-mail, as SMS message, blasted over the office intercom system, or posted to the wall in the bathroom. What is the most convenient and appropriate medium?&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Control: Advanced alert system should give users the ability to customize and manage alerts.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Can the user identify the important alerts for them, and avoid the others?&lt;/em&gt; As hard as you may try in designing the dashboard or report, you aren&amp;#8217;t in the shoes of the users. They will learn what they want to pay attention to and what information is extraneous.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Can the user adjust the parameters?&lt;/em&gt; With more sophisticated dashboards, you want to give users the ability to adjust parameters to hone in on the exceptions that really require action.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Can the user analyze alert frequency and trends?&lt;/em&gt; I&amp;#8217;ve never seen a system that does this, but having the ability to view and analyze alert history seems critically important to getting a holistic view of performance.&lt;/li&gt;
&lt;/ul&gt;
</summary><category term="dashboard" /><category term="alert" /><category term="design" /><category term="reporting" /></entry><entry><title>Tufte-Style Comparison Chart Generator</title><link href="http://www.juiceanalytics.com/writing/tufte-style-comparison-chart-generator/" rel="alternate" /><updated>2008-05-06T16:05:26Z</updated><id>http://www.juiceanalytics.com/writing/tufte-style-comparison-chart-generator/</id><summary type="html">&lt;p&gt;Last week, we &lt;a href="http://www.juiceanalytics.com/writing/real-world-tufte-graphics/"&gt;shared&lt;/a&gt; a rendition of a Tufte graphic using just a few lines of Nodebox code.  As our commenters pointed out, Python is great, but it may not be every business analyst's carnal desire to learn a programming language just to generate some nifty graphs.  I spent some time to push Chris's Nodebox rendition into a PIL-based Windows tool that can generate the same sort of comparison graph from an Excel file on the fly.&lt;/p&gt;

&lt;p&gt;The result is &lt;a href="http://media.juiceanalytics.com/downloads/compchartgenerator.zip"&gt;The Comparison Chart Generator 1.0&lt;/a&gt;.  The installation instructions are relatively simple.  Unzip the zip file, and run comparisionchartgenerator.exe.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Alternatively, we have a new excel chart that creates the same effect using only excel functionality.  Download the Excel Tufte Line Chart &lt;a href="http://media.juiceanalytics.com/downloads/QuantativeNationschart.xls"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you are using the Chart Generator, start with some data in an Excel (xls) or Comma Delimited (csv) format.  The data for this graph has to be contained within the first sheet starting with cell A1, as in the following picture.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/ccgexcel.png" alt="Excel Dialog" /&gt;&lt;/p&gt;

&lt;p&gt;Select an input file.  There are a couple example files bundled with the download.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/ccgopenfile.png" alt="Open File Dialog" /&gt;&lt;/p&gt;

&lt;p&gt;After selecting a file, you'll be prompted to modify a few of the basic options available for the chart.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/ccgoptions.png" alt="Options Dialog" /&gt;&lt;/p&gt;

&lt;p&gt;Finally, save the result as a jpeg.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/ccgsavefile.png" alt="Save File Dialog" /&gt;&lt;/p&gt;

&lt;p&gt;Here is the same image found in Tufte's textbook processed using the Comparison Chart Generator.  It is generated using the csv example file bundled with the download.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/QuantativeNations.jpg" alt="Tufte-esque Chart by Comparison Chart Generator" /&gt;&lt;/p&gt;

&lt;p&gt;Those of us who have undergone lasik eye-improvement surgery may still prefer the sharp crisp Nodebox results, but for the rest of us, this image looks pretty good.  Let us know if this tool is useful.  If there is enough of a positive response, we may consider expanding functionality for other fancy Tufte-esque charts.&lt;/p&gt;

&lt;p&gt;If you do prefer Nodebox, I have an updated script &lt;a href="http://media.juiceanalytics.com/downloads/tufte_nodebox_forcepush.py"&gt;here&lt;/a&gt;.  This pushes the script up to 20 lines of code or so, but the extra 9 lines allow the labels to push themselves apart on their own.  If you want to look at the source code for the Windows program, you can get it &lt;a href="http://media.juiceanalytics.com/downloads/comparisonchartgenerator.py"&gt;here&lt;/a&gt;. I used py2exe to compile it into an executable.  The code, however, has not been thoroughly commented or cleaned as of yet, so edit it at your own risk.&lt;/p&gt;
</summary><category term="tufte" /><category term="pil" /><category term="comparison" /><category term="chart" /><category term="generator" /></entry><entry><title>Real-World Tufte Graphics in 11 Lines of Code</title><link href="http://www.juiceanalytics.com/writing/real-world-tufte-graphics/" rel="alternate" /><updated>2008-05-02T16:45:05Z</updated><id>http://www.juiceanalytics.com/writing/real-world-tufte-graphics/</id><summary type="html">&lt;p style="color:#f00"&gt;&lt;em&gt;&lt;a href="http://www.juiceanalytics.com/writing/tufte-style-comparison-chart-generator/"&gt;Check out our followup post that describes how we created a downloadable Windows application or an excel spreadsheet you can use to create these graphics.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One of the troubles with Tufte is the frustrating infeasability of his approach to design for real people in business. One of his &lt;a href="http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0000Jr"&gt;recommendations&lt;/a&gt; is to use &lt;a href="http://www.adobe.com/products/illustrator/"&gt;Adobe Illustrator&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Adobe Illustrator is a big serious program that can do almost anything on the visual field (other than Photoshop an image). Most of my sparkline work was done in Illustrator. Fortunately all graphic designers and graphic design students have the program and know how to use it, so find a colleague who knows about graphic design.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Raise your hand if you have a graphic design assistant at your beck and call. I thought not. &lt;/p&gt;

&lt;p&gt;One of the tools we use for rapid prototyping at Juice is &lt;a href="http://nodebox.net/code/index.php/Home" title="NodeBox"&gt;NodeBox&lt;/a&gt;. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;NodeBox is a Mac OS X application that lets you create 2D visuals (static, animated or interactive) using Python programming code and export them as a PDF or a QuickTime movie. NodeBox is free and well-documented.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All true. But it's more helpful to think of NodeBox as a free Adobe Illustrator that you can program in the world's &lt;a href="http://msdn.microsoft.com/en-us/vbasic/default.aspx"&gt;easiest programming language&lt;/a&gt;. Oops, here's the right &lt;a href="http://www.python.org"&gt;link&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;I wanted to see if we could reproduce the following graph from &lt;em&gt;The Visual Display of Quantitative Information&lt;/em&gt;, p 158.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/tufte_current_receipts.gif" alt="Tufte Current Receipts Graphic " /&gt;&lt;/p&gt;

&lt;p&gt;Here's the code. It's 11 lines of code if you exclude entering the data and setting things like fonts and colors.&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Palatino&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="n"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# a medium grey for lines&lt;/span&gt;
&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c"&gt;# a slightly darker grey for text  &lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fudge&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;factor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Sweden&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;46.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;57.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Netherlands&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;44.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;55.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Norway&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;43.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;52.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Britain&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;40.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;39.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;France&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;39.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;43.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Germany&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;37.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;42.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Belgium&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;35.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;43.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Canada&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;35.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;35.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Finland&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;34.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;38.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Italy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;30.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;35.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;United States&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;30.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;32.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Greece&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;26.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;30.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Switzerland&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;26.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;33.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Spain&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;22.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;27.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Japan&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;20.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;26.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Current Receipts of Goverment as a Percentage of &amp;quot;&lt;/span&gt;
      &lt;span class="s"&gt;&amp;quot;Gross Domestic Product, 1970 and 1979&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;215&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1970&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HEIGHT&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1979&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="mi"&gt;68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HEIGHT&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ypos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c"&gt;# calculate a vertical position by scaling between 10% and 90% &lt;/span&gt;
    &lt;span class="c"&gt;# of the height of the image&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;HEIGHT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;minval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxval&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;minval&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;minimum&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;alldata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;minval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alldata&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alldata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;startfudge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endfudge&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RIGHT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ypos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;startfudge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%0.1f&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ypos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;startfudge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.07&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ypos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;endfudge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%0.1f&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.68&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ypos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;endfudge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.07&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ypos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ypos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here's what the result looks like. &lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.juiceanalytics.com/images/tufte_current_receipts_nodebox.gif" alt="Tufte Current Receipts Graphic with NodeBox" /&gt;&lt;/p&gt;

&lt;p&gt;We have some great followups to this planned for next week. We'll reimplement this code with the &lt;a href="http://www.pythonware.com/products/pil/"&gt;Python Imaging Library&lt;/a&gt;, which will open things up for Windows users. We have some great plans for mashing these graphics up with our just released &lt;a href="http://www.juiceanalytics.com/openjuice/juiced-google-analytics-api/"&gt;Google Analytics API&lt;/a&gt;. &lt;/p&gt;

&lt;p style="color:#f00"&gt;&lt;em&gt;&lt;a href="http://www.juiceanalytics.com/writing/tufte-style-comparison-chart-generator/"&gt;Check out our followup post that describes how we created a downloadable Windows application you can use to create these graphics.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</summary><category term="tufte" /><category term="graphics" /><category term="design" /><category term="nodebox" /><category term="python" /></entry><entry><title>Keyword Trends in Google Analytics With Greasemonkey</title><link href="http://www.juiceanalytics.com/writing/keyword-trends-google-analytics-greasemonkey/" rel="alternate" /><updated>2008-04-23T15:00:01Z</updated><id>http://www.juiceanalytics.com/writing/keyword-trends-google-analytics-greasemonkey/</id><summary type="html">&lt;p&gt;&lt;em&gt;Note: We've updated the script to work on Firefox 3 as well as Firefox 2.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After the warm reception for the first version of our &lt;a href="http://www.juiceanalytics.com/writing/2008/04/enhancing-google-analytics-using-greasemonkey/"&gt;Enhanced Google Analytics&lt;/a&gt;, we decided to add some new functionality. (Nothing like a few kinds words to keep us in the giving mood.) The first script created a couple new tables in the Google Analytics interface that highlight recent changes in referral visits. It uses Greasemonkey, an add-on for Firefox that allows a user to insert javascript directly into a webpage.&lt;/p&gt;

&lt;p&gt;Our update gives you even more ability to understand the data in Google Analytics:&lt;/p&gt;  

&lt;ul&gt;
&lt;li&gt;At the suggestion of &lt;a href="http://www.kaushik.net/avinash/2008/04/make-web-analytics-actionable-focus-on-whats-changed.html"&gt;Avinash Kaushik&lt;/a&gt;, the new script works for keyword data, helping you see how organic search traffic is changing. An increase in a keyword may indicate a general change in user interests and/or improved performance on search results.&lt;/li&gt;
&lt;li&gt;My coworker &lt;a href="http://www.datawrangling.com"&gt;Pete Skomoroch&lt;/a&gt; also suggested that I add the ability to see declines in referrals and new keyword searches.&lt;/li&gt;
&lt;li&gt;With the help of &lt;a href="http://paulirish.com/"&gt;Paul Irish&lt;/a&gt;, the script is now better able to interface with the date widget on the Google Analytics site.&lt;/li&gt;
&lt;/ul&gt;

&lt;script type="text/javascript" charset="utf-8"&gt;
$(document).ready(function(){
$('#qxlfd1').hide();
$('#qxlfd2').hide();
$('#qxlfd0').click(function() {
if ( $('#qxlfd1').is(':hidden') ) {
$('#qxlfd1').slideDown("slow"); 
$('#qxlfd2').slideDown("slow");
}
else
{
$('#qxlfd1').slideUp("slow"); 
$('#qxlfd2').slideUp("slow");
}
});
});
&lt;/script&gt;

&lt;p&gt;&lt;button id="qxlfd0" align="center"&gt;Who sent me unusual traffic?&lt;/button&gt;&lt;/p&gt;

&lt;p&gt;(Click the above button for a simulation.)&lt;/p&gt;

&lt;p&gt;&lt;img id="qxlfd1" align="center" src="http://media.juiceanalytics.com/images/keywords_growth.png" alt="Keyword Growth" title=""&gt;
&lt;img id="qxlfd2" align="center" src="http://media.juiceanalytics.com/images/keywords_decline.png" alt="Keyword Decline" title=""&gt;&lt;/p&gt;

&lt;p&gt;When you click the button, your browser will download some historical data behind the scenes, and display a nice summary of the best and worst performing keywords/referring domains. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Installation Instructions:&lt;/b&gt;&lt;br&gt;
&lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox 2.0+&lt;/a&gt;&lt;br&gt;
&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt;&lt;br&gt;
&lt;a href="http://userscripts.org/scripts/show/24729"&gt;googleanalyticsdownloade.user.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't already have Firefox, install it.  Install Greasemonkey, and do the required Firefox restart.  You should see a handsome monkey peeking at you from the bottom right hand corner of your browser.  Open the script file in your firefox browser, and Greasemonkey should give you an option to install the script.&lt;/p&gt;

&lt;p&gt;Afterwards, log into Google Analytics, and navigate to your Referring Sources or Keywords Tab.  Click the button.&lt;/p&gt;    

&lt;p&gt;&lt;b&gt;Configuring the script:&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We spent some time trying to find convenient default settings here at Juice Analytics, so the script should work straight out of the box.  Some users, however, may find it convenient to alter some of these configurations.  To do so, in Firefox, go to &lt;b&gt;Tools&lt;/b&gt;=&gt;&lt;b&gt;Greasemonkey&lt;/b&gt;=&gt;&lt;b&gt;Manage User Scripts...&lt;/b&gt;, select &lt;b&gt;Google Analytics Downloader&lt;/b&gt;, and then click Edit in the lower left corner of the window.  This should open up the script file in a text editor.  If your computer does not have a default text editor configured, you may have to choose one.  'c:\windows\notepad' is a good bet for Windows machines.&lt;/p&gt;  

&lt;p&gt;This is what you should see:&lt;/p&gt;

&lt;p&gt;&lt;img align="center" src="http://media.juiceanalytics.com/images/grease_code_blurb.png" alt="Code Blurb" title=""&gt;&lt;/p&gt;

&lt;p&gt;The bracket labeled 'keywords?' controls defaults for the Keywords page, and correspondingly, 'referring_sources?' controls the Referring Sources page.&lt;/p&gt;  

&lt;p&gt;To change the settings, simply change the corresponding variable to your preferred default.  Make sure to refresh your Google Analytics webpage, if you have it open, so the new settings are loaded.&lt;/p&gt;  

&lt;p&gt;Now for the nitty gritty configuration details: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i&gt;display_limit&lt;/i&gt;: This controls the maximum entries that each table will contain.  This may be useful for large, sprawling sites. &lt;/li&gt;
&lt;li&gt;&lt;i&gt;growth_tolerance&lt;/i&gt;: This is the percentage growth parameter.  Changing it to .10, for example, will catch everything that has grown by 10%, as opposed to the default 50% and 20%, respectively.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;minimum_number_elements&lt;/i&gt;: This is a significance benchmark that can be used to limit what is displayed upon the screen.  By default, only keywords with at least 10 elements are displayed upon the screen.  Referring Sites does not have a minimum by default, but one can be set if desired.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;limit&lt;/i&gt;: Limit is more of an internal parameter that determines how many entries should be downloaded from Google in order to get the results that are visible here on the page.  Lower the limit to increase speed.  If the limit is set to a very high number, you will get the largest result set, but you will have to sit around for a while for the results to load.  Since the results are downloaded ordered by volume, raising the limit from the default numbers will not actually give more significant results.  You will simply get &lt;i&gt;more&lt;/i&gt; of the smaller results, such as keywords with only 1 hit.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;look_back&lt;/i&gt;: This is a very important parameter.  The script uses the date displayed upon your Google Analytics page to determine the full range that you want to consider in your results, but 'look_back' determines how many of those days are used for the significance test.  So, say the range you have displayed in Google is March 23 - April 22 and your look_back is 7 days.  The script will compare the average referrals for a given keyword from April 16-22 to the average from March 23-April 15, and will return the keyword only if the recent average is 20% higher than the rest of the time period.  Thus, if you want to increase the total range of the data, change the dates on the actual webpage.  Change 'look_back' only if you want to change the period of significance. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy analyzing!&lt;/p&gt;
</summary><category term="webanalytics" /><category term="google" /><category term="analytics" /><category term="hack" /><category term="greasemonkey" /></entry></feed>
