<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Layered Grammar of Graphics in R</description><title>ggplot2</title><generator>Tumblr (3.0; @ggplot2)</generator><link>http://blog.ggplot2.org/</link><item><title>How to use your favorite fonts in R charts</title><description>&lt;a href="http://blog.revolutionanalytics.com/2012/09/how-to-use-your-favorite-fonts-in-r-charts.html"&gt;How to use your favorite fonts in R charts&lt;/a&gt;: &lt;p&gt;Winston Chang has a guest post on the Revolution Analytics blog about embedding fonts into PDFs using the extrafont package which, not surprisingly, works very well with ggplot2.&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/32217543389</link><guid>http://blog.ggplot2.org/post/32217543389</guid><pubDate>Mon, 24 Sep 2012 17:23:11 -0400</pubDate><dc:creator>brian-diggs</dc:creator></item><item><title>ggbio</title><description>&lt;p&gt;ggbio (&lt;a href="http://www.bioconductor.org/packages/2.10/bioc/html/ggbio.html"&gt;package&lt;/a&gt;, &lt;a href="http://genomebiology.com/2012/13/8/R77/abstract"&gt;publication&lt;/a&gt;) is an extension and specialization of ggplot designed for visualizing genomics annotations and high-throughput data&lt;br/&gt;&lt;img src="http://media.tumblr.com/tumblr_m9qe8apUjw1rq6b2e.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;A frequent requirement for plots of genomic data is indicating the relationship of measurements on different scales. For example, the x-axis of the lower plots in this image is the linear chromosome position, but the upper plot shows the expression levels of each exon (which are indicated in the lower image by vertical lines). In the past I&amp;#8217;ve written code to generate the diagonal lines between the images that show the relationship of the two scales, and I&amp;#8217;ll be happy if ggbio makes that unnecessary.&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/30732477076</link><guid>http://blog.ggplot2.org/post/30732477076</guid><pubDate>Sun, 02 Sep 2012 12:40:16 -0400</pubDate><dc:creator>hollybeale</dc:creator></item><item><title>Defining a new transformation for ggplot2/scales - Part II</title><description>&lt;p&gt;In my &lt;a href="http://blog.ggplot2.org/post/25938265813/defining-a-new-transformation-for-ggplot2-scales"&gt;previous blog post&lt;/a&gt;, I explored what was needed to create a new transformation for the scales package and gave an example of a mathematical transformation. In this post, I want to show an additional example related to the other mentioned use case (mapping a continuous like variable with specific structure and formatting) and extend the example into creating new scales functions which integrate into ggplot even more directly.&lt;/p&gt;

&lt;h1&gt;Time&lt;/h1&gt;

&lt;p&gt;Dates and times are tricky to work with because they have detailed external constraints and conventions. Within the R ecosystem, several packages exist solely to deal with dates and times (&lt;a href="http://cran.r-project.org/web/packages/chron/index.html"&gt;chron&lt;/a&gt;, &lt;a href="http://cran.r-project.org/web/packages/lubridate/index.html"&gt;lubridate&lt;/a&gt;, &lt;a href="http://cran.r-project.org/web/packages/date/index.html"&gt;date&lt;/a&gt;, &lt;a href="http://cran.r-project.org/web/packages/mondate/index.html"&gt;mondate&lt;/a&gt;, &lt;a href="http://cran.r-project.org/web/packages/timeDate/index.html"&gt;timeDate&lt;/a&gt;, &lt;a href="http://cran.r-project.org/web/packages/TimeWarp/index.html"&gt;TimeWarp&lt;/a&gt;, etc.), and an article has appeared in R News on the topic (&lt;a href="http://cran.r-project.org/doc/Rnews/Rnews_2001-2.pdf"&gt;Brian D. Ripley and Kurt Hornik. Date-time classes. R News, 1(2):8-11, June 2001.&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;There is already support for dates (using the &lt;code&gt;Date&lt;/code&gt; class, via &lt;code&gt;date_trans&lt;/code&gt; in &lt;code&gt;scales&lt;/code&gt; and &lt;code&gt;scale_*_date&lt;/code&gt; in &lt;code&gt;ggplot2&lt;/code&gt;) and datetimes (using the &lt;code&gt;POSIXt&lt;/code&gt; class, via &lt;code&gt;time_trans&lt;/code&gt; in &lt;code&gt;scales&lt;/code&gt; and &lt;code&gt;scale_*_datetime&lt;/code&gt; in &lt;code&gt;ggplot2&lt;/code&gt;). The piece that is missing is for time, separate from any date; &amp;#8220;clock time&amp;#8221;, if you will.&lt;/p&gt;

&lt;h1&gt;Existing solutions&lt;/h1&gt;

&lt;p&gt;Exercising the first of the &lt;a href="http://threevirtues.com/"&gt;three great virtues of a programmer&lt;/a&gt;, laziness, it is worth seeing what has already been done (classes and functions) to deal with clock time.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;chron&lt;/code&gt; package has a class &lt;code&gt;times&lt;/code&gt; which can specify times of day, independent of a date. Additionally, there are many supporting functions for this class:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; methods(class="times")
 [1] [.times*             [[.times*            [&amp;lt;-.times*          
 [4] as.character.times*  as.data.frame.times* axis.times*         
 [7] Axis.times*          c.times*             diff.times*         
[10] format.times*        hist.times*          identify.times*     
[13] is.na.times*         lines.times*         Math.times*         
[16] mean.times*          Ops.times*           plot.times*         
[19] points.times*        pretty.times*        print.times*        
[22] quantile.times*      summary.times*       Summary.times*      
[25] trunc.times*         unique.times*        xtfrm.times*        

   Non-visible functions are asterisked
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Following the pattern of the previous post, each of the parts of the transformation can be determined.&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;inverse&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;When dealing with variable that is a class, &lt;code&gt;transform&lt;/code&gt; must take the specific representation and convert it to a simple numeric representation (map to [part of] the real line in mathematical terms); &lt;code&gt;inverse&lt;/code&gt; does the opposite functional mapping. Generally, this requires delving into the structure of the class to see how it is really put together.  To do that, let&amp;#8217;s create some data. The &lt;code&gt;times&lt;/code&gt; documentation says it can convert a character vector (by default in 24-hour, minute, second format, separated by colons) to times.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time &amp;lt;- times(c("18:37:11", "16:51:34", "15:05:57", "13:20:20",
                "11:34:43", "09:49:06", "08:03:29", "06:17:52",
                "04:32:15", "02:46:38", "01:01:01"))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which if printed gives&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; Time
 [1] 18:37:11 16:51:34 15:05:57 13:20:20 11:34:43 09:49:06
 [7] 08:03:29 06:17:52 04:32:15 02:46:38 01:01:01
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So far, so good. But what does this object/class really look like?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; str(Time)
Class 'times'  atomic [1:11] 0.776 0.702 0.629 0.556 0.482 ...
  ..- attr(*, "format")= chr "h:m:s"
&amp;gt; dput(Time)
structure(c(0.775821759259259, 0.702476851851852, 0.629131944444444, 
0.555787037037037, 0.48244212962963, 0.409097222222222, 0.335752314814815, 
0.262407407407407, 0.1890625, 0.115717592592593, 0.0423726851851852
), format = "h:m:s", class = "times")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;times&lt;/code&gt; are just vectors with an attribute and a class. A little more digging and testing can show that the numeric part is just the fraction of a day that that time represents.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; str(times(c("00:00:00","6:00:00","12:00:00","23:59:59")))
Class 'times'  atomic [1:4] 0 0.25 0.5 1
  ..- attr(*, "format")= chr "h:m:s"
&amp;gt; dput(times(c("00:00:00","6:00:00","12:00:00","23:59:59")))
structure(c(0, 0.25, 0.5, 0.999988425925926), format = "h:m:s", class = "times")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Most of the work of creating a mapping to numeric values is already done; all that is needed is to strip off the class and attributes. &lt;code&gt;as.numeric()&lt;/code&gt; does that nicely.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; as.numeric(Time)
 [1] 0.77582176 0.70247685 0.62913194 0.55578704 0.48244213
 [6] 0.40909722 0.33575231 0.26240741 0.18906250 0.11571759
[11] 0.04237269
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That is only half the mapping. We also need to go from this representation to a &lt;code&gt;times&lt;/code&gt; object.  Looking at the constructor for &lt;code&gt;times&lt;/code&gt;, it can take a numeric vector representing &amp;#8220;number of days since an origin.&amp;#8221; It&amp;#8217;s not stated, but maybe times are then just fractions of a day?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; times(as.numeric(Time))
 [1] 18:37:11 16:51:34 15:05:57 13:20:20 11:34:43 09:49:06
 [7] 08:03:29 06:17:52 04:32:15 02:46:38 01:01:01
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sure looks like it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; identical(Time, times(as.numeric(Time)))
[1] TRUE
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So &lt;code&gt;transform&lt;/code&gt; is just the &lt;code&gt;as.numeric&lt;/code&gt; function and &lt;code&gt;inverse&lt;/code&gt; is the &lt;code&gt;times&lt;/code&gt; function.&lt;/p&gt;

&lt;h2&gt;breaks&lt;/h2&gt;

&lt;p&gt;Getting breaks on time right is important; an axis where the ticks are every 7 seconds is going to look odd (unless there is a really compelling reason), as would 25 seconds. In base graphics, the generic function &lt;code&gt;pretty&lt;/code&gt; has the responsibility to find &amp;#8220;nice&amp;#8221; breaks. Looking at the methods for &lt;code&gt;times&lt;/code&gt;, there is a &lt;code&gt;pretty.times&lt;/code&gt;. Does it work (well enough)?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; pretty(Time)
[1] 03:00:00 06:00:00 09:00:00 12:00:00 15:00:00 18:00:00
attr(,"labels")
[1] 03:00 06:00 09:00 12:00 15:00 18:00
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;#8217;s pretty reasonable. Checking under the hood to see what is going on, &lt;code&gt;chron::pretty.times&lt;/code&gt; calls &lt;code&gt;chron::pretty.chron&lt;/code&gt; which calls &lt;code&gt;grDevices::pretty.POSIXt&lt;/code&gt; which calls &lt;code&gt;grDevices::prettyDate&lt;/code&gt;. Looking at the code for &lt;code&gt;prettyDate&lt;/code&gt;, the allowed (sub-day) breaks are 1 second, 2 seconds, 5 seconds, 10 seconds, 15 seconds, 30 seconds, 1 minute, 2 minutes, 5 minutes, 10 minutes, 15 minutes, 30 minutes, 1 hour, 3 hours, 6 hours, and 12 hours. I might have added a 2 hour option, but it is not worth throwing away others&amp;#8217; work because of. &lt;code&gt;pretty_breaks&lt;/code&gt; already wraps &lt;code&gt;pretty&lt;/code&gt; in the format expected by scales, so we can just use &lt;code&gt;pretty_breaks()&lt;/code&gt; as the &lt;code&gt;breaks&lt;/code&gt; function.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; pretty_breaks()(range(Time))
   03:00    06:00    09:00    12:00    15:00    18:00 
03:00:00 06:00:00 09:00:00 12:00:00 15:00:00 18:00:00 
attr(,"labels")
[1] 03:00 06:00 09:00 12:00 15:00 18:00
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;format&lt;/h2&gt;

&lt;p&gt;Here, we almost catch another break. When &lt;code&gt;format&lt;/code&gt; is not defined, the names that are associated with what &lt;code&gt;breaks&lt;/code&gt; returns in principle are used. Unfortunately, in practice, this is not the case because inside ggplot code, the breaks get transformed back and forth between data spaces and lose their attributes (names). If we want the default formatting (full hour minute and second), then this can simply be &lt;code&gt;format&lt;/code&gt;. If we only want seconds to appear when they are not all 0 (when the increment is less than 1 minute), then we have to write our own function that passes the appropriate flag (&lt;code&gt;simplify&lt;/code&gt;) as to whether the seconds should be suppressed.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fmt &amp;lt;- function(x) {
    format(x, simplify = !any(diff(x) &amp;lt; 1/(24*60)))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;domain&lt;/h2&gt;

&lt;p&gt;Since &lt;code&gt;times&lt;/code&gt; is defined in terms of a fraction of a day, it is only meaningful in the range 0 to 1 (inclusive on the left, exclusive on the right). &lt;code&gt;domain&lt;/code&gt; does not have a way of defining inclusivity or exclusivity of the endpoints, so the domain is just &lt;code&gt;c(0,1)&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;name&lt;/h2&gt;

&lt;p&gt;The transform object for datetime (&lt;code&gt;POSIXt&lt;/code&gt;) objects already use the name &amp;#8220;time&amp;#8221;, so the obvious name &amp;#8220;times&amp;#8221; would be confusing. I&amp;#8217;ve chosen &amp;#8220;chrontimes&amp;#8221; as a name, to indicate that it is the &lt;code&gt;times&lt;/code&gt; object from the &lt;code&gt;chron&lt;/code&gt; package.&lt;/p&gt;

&lt;h2&gt;Putting it all together&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;times_trans &amp;lt;- function() {
    fmt &amp;lt;- function(x) {
        format(x, simplify = !any(diff(x) &amp;lt; 1/(24*60)))
    }
    trans_new("chrontimes",
              transform = as.numeric,
              inverse = times,
              breaks = pretty_breaks(),
              format = fmt,
              domain=c(0,1))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Using the transformation in ggplot&lt;/h1&gt;

&lt;p&gt;Using the &lt;code&gt;Time&lt;/code&gt; values previously created, and some other random data, make a data frame to plot.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dat &amp;lt;- data.frame(time = Time,
                  value = c(7L, 6L, 9L, 11L, 10L, 1L,
                            4L, 2L, 3L, 5L, 8L))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A default plot of this gives&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ggplot(dat, aes(time, value)) + geom_point()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m8rlc7vms01rreyq6.png" alt=""/&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ggplot(dat, aes(time, value)) + geom_point() +
  scale_x_continuous(trans=times_trans())
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m8rlcmuhfa1rreyq6.png" alt=""/&gt;&lt;/p&gt;

&lt;h1&gt;Integrating as a ggplot scale&lt;/h1&gt;

&lt;p&gt;If you want to go the next step and create &lt;code&gt;scale_*_times&lt;/code&gt; functions for using directly in ggplot, you can. In doing so, you may realize that, when done along a y-axis, you would expect time to run from top to bottom, not bottom to top as the y axis typically runs. Using the ideas of the reversed scale described in the previous post, a reversed times transformation can also be made.  Then making the &lt;code&gt;scale_x_times&lt;/code&gt; and &lt;code&gt;scale_y_times&lt;/code&gt; is just a matter of passing the right transformation to &lt;code&gt;scale_x_continuous&lt;/code&gt; and &lt;code&gt;scale_y_continuous&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;timesreverse_trans &amp;lt;- function() {
    trans &amp;lt;- function(x) {-as.numeric(x)}
    inv &amp;lt;- function(x) {times(-x)}
    fmt &amp;lt;- function(x) {format(x, simplify = !any(diff(x) &amp;lt; 1/(24*60)))}
    trans_new("chrontimes-reverse",
              transform = trans,
              inverse = inv,
              breaks = pretty_breaks(),
              format = fmt,
              domain=c(0,1))
}


scale_x_times &amp;lt;- function(..., trans=NULL) {
    scale_x_continuous(trans=times_trans(), ...)
}

scale_y_times &amp;lt;- function(..., trans=NULL) {
    scale_y_continuous(trans=timesreverse_trans(), ...)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Examples of plots with times on each axis in full ggplot syntax&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ggplot(dat, aes(time, value)) + geom_point() +
  scale_x_times()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m8rlpwEigF1rreyq6.png" alt=""/&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ggplot(dat, aes(value, time)) + geom_point() +
  scale_y_times()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m8rlq2cByc1rreyq6.png" alt=""/&gt;&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/29433173749</link><guid>http://blog.ggplot2.org/post/29433173749</guid><pubDate>Tue, 14 Aug 2012 17:48:46 -0400</pubDate><dc:creator>brian-diggs</dc:creator></item><item><title>Mapping Quantitative Values to Color</title><description>&lt;p&gt;Nils Gehlenborg &amp;amp; Bang Wong discuss &amp;#8220;&lt;a href="http://www.nature.com/nmeth/journal/v9/n8/full/nmeth.2134.html"&gt;Mapping Quantitative Values to Color&lt;/a&gt;&amp;#8221; in this month&amp;#8217;s issue of Nature Methods. The article is paywalled, but I was able to access the &lt;a href="http://www.nature.com/nmeth/journal/v9/n8/fig_tab/nmeth.2134_F1.html"&gt;figure&lt;/a&gt; without a subscription. They map out a systematic approach to color choice, starting with considering the salient regions of your data range and any values with special meaning (i.e. zero, 32 degrees Fahrenheit or sea level). They make explicit two options for mapping gradients to values:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8230;we can translate the ends of the color gradient to (i) zero and the theoretical maximum value or (ii) the observed minimum and maximum. The former approach allows us to interpret the data in the context of the theoretical data range (Fig. 1a). However, if higher contrast is needed from the graphical representation and zero is irrelevant as a reference point, then it is reasonable to map the lowest observed value to the lightest color and the highest observed value to the darkest color (Fig. 1b).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div align="center"&gt;&lt;img src="http://media.tumblr.com/tumblr_m8b0z5LpgQ1rq6b2e.png"/&gt;&lt;/div&gt;
&lt;p&gt;Check out Baptiste&amp;#8217;s posts about choosing color palettes for more ideas and implementation: &lt;a href="http://blog.ggplot2.org/post/23995319650/choosing-colour-palettes-part-i-introduction"&gt;Introduction&lt;/a&gt; and &lt;a href="http://blog.ggplot2.org/post/24607351280/choosing-colour-palettes-part-ii-educated-choices"&gt;Educated Choices&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/28794502727</link><guid>http://blog.ggplot2.org/post/28794502727</guid><pubDate>Sun, 05 Aug 2012 19:03:00 -0400</pubDate><dc:creator>hollybeale</dc:creator></item><item><title>Computing your heart rate with a webcam, ruby, R and ggplot2</title><description>&lt;a href="http://blog.airbrake.io/guest-post/exploring-everything/"&gt;Computing your heart rate with a webcam, ruby, R and ggplot2&lt;/a&gt;</description><link>http://blog.ggplot2.org/post/28640845306</link><guid>http://blog.ggplot2.org/post/28640845306</guid><pubDate>Fri, 03 Aug 2012 14:31:34 -0400</pubDate><dc:creator>hadley</dc:creator></item><item><title>Using ggplot2 to examine the digital divide between those with and without internet access</title><description>&lt;a href="http://messymatters.com/the-new-digital-divide/"&gt;Using ggplot2 to examine the digital divide between those with and without internet access&lt;/a&gt;</description><link>http://blog.ggplot2.org/post/28554586826</link><guid>http://blog.ggplot2.org/post/28554586826</guid><pubDate>Thu, 02 Aug 2012 09:25:48 -0400</pubDate><dc:creator>joranelias</dc:creator></item><item><title>Physics animation using R, packages planar, dielectric, ggplot2,...</title><description>&lt;iframe src="http://player.vimeo.com/video/46460346" width="400" height="135" frameborder="0"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Physics animation using R, packages planar, dielectric, ggplot2, animation, gridExtra.&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/28088531212</link><guid>http://blog.ggplot2.org/post/28088531212</guid><pubDate>Thu, 26 Jul 2012 19:59:00 -0400</pubDate><dc:creator>baptiste-auguie</dc:creator></item><item><title>Violence In America Visualized via ggplot2</title><description>&lt;a href="http://crookedtimber.org/2012/07/20/america-is-a-violent-country/"&gt;Violence In America Visualized via ggplot2&lt;/a&gt;</description><link>http://blog.ggplot2.org/post/27695061403</link><guid>http://blog.ggplot2.org/post/27695061403</guid><pubDate>Sat, 21 Jul 2012 09:26:26 -0400</pubDate><dc:creator>joranelias</dc:creator></item><item><title>ggplot syntax reminders</title><description>&lt;p&gt;There are ggplot features that I use often enough to know they exist but not often enough to remember in detail. Lately I&amp;#8217;ve started moving examples of these features to the menu bar. I use the Mac utility called &lt;a href="http://www.clipmenu.com/"&gt;ClipMenu&lt;/a&gt;, which I first started using as a clipboard manager, but now I&amp;#8217;m using the snippets feature for this.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;img src="http://media.tumblr.com/tumblr_m7flfgQsZx1rq6b2e.png"/&gt;&lt;/p&gt;
&lt;p&gt;This screen shot shows two ggplot snippets. The first one contains the code &amp;#8220;+ opts(axis.text.x=theme_text(angle=90, hjust=0)).&amp;#8221; To insert it in an R document, I click the clipmenu icon on the menu bar, highlight &amp;#8220;ggplot&amp;#8221; and click on &amp;#8220;rotate axis text.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;I&amp;#8217;m sure there are numerous other ways this type of strategy could be implemented; &lt;a href="http://qsapp.com/wiki/Shelf_Module"&gt;Quicksilver&amp;#8217;s Shelf feature&lt;/a&gt; comes to mind. A web search suggests &lt;a href="http://smilesoftware.com/TextExpander/"&gt;TextExpander&lt;/a&gt; might suffice in Windows; &lt;a href="http://www.onextrapixel.com/2009/09/29/15-useful-code-snippet-tools-that-will-help-you-store-and-manage-your-code-library/"&gt;this page&lt;/a&gt; lists some more options.&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/27588749311</link><guid>http://blog.ggplot2.org/post/27588749311</guid><pubDate>Thu, 19 Jul 2012 19:55:24 -0400</pubDate><dc:creator>hollybeale</dc:creator></item><item><title>Exploring Oracle's revenue with ggplot2</title><description>&lt;a href="http://redmonk.com/sogrady/2012/07/05/oracle-software/"&gt;Exploring Oracle's revenue with ggplot2&lt;/a&gt;</description><link>http://blog.ggplot2.org/post/27552415301</link><guid>http://blog.ggplot2.org/post/27552415301</guid><pubDate>Thu, 19 Jul 2012 09:27:02 -0400</pubDate><dc:creator>hadley</dc:creator></item><item><title>Exploring the Tour de France with R and ggplot2</title><description>&lt;a href="http://www.statisticalskier.com/tag/tour-de-france/"&gt;Exploring the Tour de France with R and ggplot2&lt;/a&gt;</description><link>http://blog.ggplot2.org/post/27070095652</link><guid>http://blog.ggplot2.org/post/27070095652</guid><pubDate>Thu, 12 Jul 2012 16:12:01 -0400</pubDate><dc:creator>hadley</dc:creator></item><item><title>Soda vs. Pop with Twitter</title><description>&lt;a href="http://blog.echen.me/2012/07/06/soda-vs-pop-with-twitter/"&gt;Soda vs. Pop with Twitter&lt;/a&gt;</description><link>http://blog.ggplot2.org/post/26849208180</link><guid>http://blog.ggplot2.org/post/26849208180</guid><pubDate>Mon, 09 Jul 2012 15:44:32 -0400</pubDate><dc:creator>baptiste-auguie</dc:creator></item><item><title>Defining a new transformation for ggplot2/scales</title><description>&lt;p&gt;Inspired by writing an answer to &lt;a href="http://stackoverflow.com/q/11053899/892313"&gt;this question on StackOverflow&lt;/a&gt;, I decided to write up a more detailed description of creating a new transformation using the &lt;code&gt;scales&lt;/code&gt; package (and also to make sure that I understood all the details about how to really do it).&lt;/p&gt;

&lt;h1&gt;Background&lt;/h1&gt;

&lt;p&gt;To start with, it helps to understand the philosophy behind the &lt;code&gt;scales&lt;/code&gt; package. From the description of the &lt;code&gt;scales&lt;/code&gt; package:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Scales map data to aesthetics, and provide methods for automatically determining breaks and labels for axes and legends.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Within the realm of &lt;code&gt;scales&lt;/code&gt;, a transformation allows for a maniuplation of the data space prior to its mapping to an aesthetic. In particular, it is responsible for&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;The mapping, in both directions, between the data space and an intermediate representation space&lt;/li&gt;
&lt;li&gt;Providing a mechanism for determining &amp;#8220;nice&amp;#8221; breaks in the data space&lt;/li&gt;
&lt;li&gt;Providing a mechanism for formatting the labels in the data space&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There are two main use cases for a transformation:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Taking an existing continuous scale and performing a functional transformation of it prior to mapping. For example, taking the logarithm, exponential, square root, recriprocal, inverse, etc. of a variable.&lt;/li&gt;
&lt;li&gt;Providing a way of handling a variable of a type which represents a continuous quantity, but has specific structure and/or formatting conventions, typically represented with a class. Prototypical examples of this are dates and datetimes.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;These variable transformations take place before any &lt;code&gt;stat&lt;/code&gt;s are performed on the data. In fact, they are equivalent, in terms of effects on data, as putting a transform in as the variable itself (though the axes breaks and labels are different).  Quoting from &lt;em&gt;ggplot2: Elegent Graphics for Data Analysis&lt;/em&gt; (page 100):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Of course, you can also perform the transformation yourself. For example, instead of using &lt;code&gt;scale_x_log()&lt;/code&gt;, you could plot &lt;code&gt;log10(x)&lt;/code&gt;. That produces an identical result inside the plotting region, but the axis and tick labels won&amp;#8217;t be the same. If you use a transformed scale, the axes will be labelled in the original data space. In both cases, the transformaiton occurs before the statistical summary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I reproduce Figure 6.4 using the current version of the code because it is different than what was published.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;qplot(log10(carat), log10(price), data=diamonds)
qplot(carat, price, data=diamonds) + 
  scale_x_log10() + scale_y_log10()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m5zna3Vse01rreyq6.png" alt=""/&gt;&lt;/p&gt;

&lt;h1&gt;Building blocks&lt;/h1&gt;

&lt;p&gt;The pieces that are needed to create a transformation are described on the help page for &lt;code&gt;trans_new&lt;/code&gt;, but I&amp;#8217;ll go through them in more detail.&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;inverse&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;These are the workhorses of the transformation and define the functions that map from the original data space to the intermediate data space (&lt;code&gt;transform&lt;/code&gt;) and back again (&lt;code&gt;inverse&lt;/code&gt;). These can be specified as a function (an anonymous function or a function object) or as a character string which will cause a function of that name to be used (as determined by &lt;code&gt;match.fun&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Each of these functions should take a vector of values and return a vector of values of the same length.  Callilng &lt;code&gt;inverse&lt;/code&gt; on the results of &lt;code&gt;transform&lt;/code&gt; should result in the original vector (to within any error introduced by floating point arithmetic).  That is &lt;code&gt;all.equal(inverse(tranform(x)), x)&lt;/code&gt; should be &lt;code&gt;TRUE&lt;/code&gt; for any &lt;code&gt;x&lt;/code&gt; (for which &lt;code&gt;transform&lt;/code&gt; is defined; see &lt;code&gt;domain&lt;/code&gt; below).&lt;/p&gt;

&lt;p&gt;Both of these functions are required.&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;breaks&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;breaks&lt;/code&gt; is a function which takes a vector of length 2 which represents the range of the data, expressed in the original data space, that is to be represented. This will include any requested expansion, in addition to the actual data values. &lt;code&gt;breaks&lt;/code&gt; should return a vector of whatever length it deems appropriate such that each break is represented by one element of the vector. Optionally, the vector can be a named vector. If it is, the default formatter will use the names as the displayed version of the values.&lt;/p&gt;

&lt;p&gt;In general, this is a hard problem, primarily because breaks should look &amp;#8220;nice&amp;#8221; which is difficult for an algorithm to determine. Luckily, others have spent time working on the problem and often much of what they have learned and implemented can be used without having to do much yourself. In partciular, there are existing break determination algorithms in &lt;code&gt;scales&lt;/code&gt; such as &lt;code&gt;pretty_breaks&lt;/code&gt; (which is based on &lt;code&gt;base::pretty&lt;/code&gt;) which find breaks for a simple numeric scale, &lt;code&gt;extended_breaks&lt;/code&gt; which is based on extensions of work by Wilkinson which covers the same terrirory, &lt;code&gt;log_breaks&lt;/code&gt; which give integer breaks on a log-transformed scale, and &lt;code&gt;date_breaks&lt;/code&gt; which works with date data.&lt;/p&gt;

&lt;p&gt;All these functions are generators, meaning that they are functions which return functions which do the actual work of finding the breaks. These function can take parameters which define the properties of the breaking algorithm, such as the number of breaks, the base of the logarithm, or the spacing in time between dates.&lt;/p&gt;

&lt;p&gt;This argument is optional, and if not supplied a default algorithm is used which will evenly space the ticks in the original data space.&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;format&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;format&lt;/code&gt; is a function which takes a vector of values in the original data space (those returned by the &lt;code&gt;breaks&lt;/code&gt; function) and returns either a character vector of the same length or a list of expressions of the same length. The latter is useful for making expressions that can be handled by plotmath.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scales&lt;/code&gt; includes many formatting functions including &lt;code&gt;comma_format&lt;/code&gt; which puts commas between thousands, millions, billions, etc.; &lt;code&gt;dollar_format&lt;/code&gt; which rounds to either cents or dollars (threshold definable in generator) and adds a &amp;#8220;$&amp;#8221; in front and commas; &lt;code&gt;percent_format&lt;/code&gt; which multiples by 100 and add a percent sign (&amp;#8220;%&amp;#8221;); and &lt;code&gt;parse_format&lt;/code&gt; and &lt;code&gt;math_format&lt;/code&gt; which aid in making plotmath expressions for lables.&lt;/p&gt;

&lt;p&gt;As with &lt;code&gt;breaks&lt;/code&gt;, all the functions are generators which means that they are functions which return functions. The returned function is the one that takes a single vector, and is what is assigned to the &lt;code&gt;format&lt;/code&gt; argument.&lt;/p&gt;

&lt;p&gt;This argument is optional and if not supplied, the default algorithm will use any names returned with the breaks. If there are no names, then &lt;code&gt;format&lt;/code&gt; is called on the passed values.&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;domain&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;domain&lt;/code&gt; is the values over which the &lt;code&gt;transform&lt;/code&gt; function is defined. For example, square root and logarithm are only defined for positive values (ggplot does not deal with complex values); and arcsine transformation would only be defined between -1 and 1. This is represented by a length 2 vector of the endpoints (inclusive) of the defined range.&lt;/p&gt;

&lt;p&gt;This argument is optional, and if missing it is assumed that the transformation if valid over all numeric values.&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;name&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;A character string to identify the transformation. It is used in summary output, but has no computational value.&lt;/p&gt;

&lt;h1&gt;Example: reverse logarithm&lt;/h1&gt;

&lt;p&gt;There are built in transformations for logarithms and for reversing a scale, but there is not one to do both at once (largest to smallest, left to right).  The code for each of these, taken from the &lt;code&gt;scales&lt;/code&gt; package, is&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;log_trans &amp;lt;- function(base = exp(1)) {
  trans &amp;lt;- function(x) log(x, base)
  inv &amp;lt;- function(x) base ^ x
  trans_new(str_c("log-", format(base)), trans, inv,
    log_breaks(base = base), domain = c(1e-100, Inf))
}

reverse_trans &amp;lt;- function() {
  trans_new("reverse", function(x) -x, function(x) -x)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To make a reversed log scale, the &lt;code&gt;breaks&lt;/code&gt; are the same as for a regular log scale, so that part does not need to be recreated. In fact, much of &lt;code&gt;log_trans&lt;/code&gt; can be reused with changes being made to just the transformation and inverse functions.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;reverselog_trans &amp;lt;- function(base = exp(1)) {
    trans &amp;lt;- function(x) -log(x, base)
    inv &amp;lt;- function(x) base^(-x)
    trans_new(paste0("reverselog-", format(base)), trans, inv,
              log_breaks(base = base), domain = c(1e-100, Inf))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I have opted here to follow the general pattern of the other trans functions making this a generator of the transformation, parameterizable by the base of the logarithm. Since I&amp;#8217;ve used the &lt;code&gt;_trans&lt;/code&gt; naming convention, I can also just call it (with the default parameters) as a string in the &lt;code&gt;trans&lt;/code&gt; argument of &lt;code&gt;scale_x_continuous&lt;/code&gt;. Some examples of it at work:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dat &amp;lt;- data.frame(x=1:20, y=1:20)

ggplot(dat, aes(x,y)) + geom_point() +
    scale_x_continuous(trans="reverselog")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m68hbz0oKC1rreyq6.png" alt=""/&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ggplot(dat, aes(x,y)) + geom_point() +
    scale_x_continuous(trans=reverselog_trans(base=2))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m68hc7A6lJ1rreyq6.png" alt=""/&gt;&lt;/p&gt;

&lt;h1&gt;Reproducibility details&lt;/h1&gt;

&lt;p&gt;R-2.15.1, ggplot2-0.9.1, scales-0.2.1&lt;/p&gt;

&lt;p&gt;code available at &lt;a href="https://github.com/BrianDiggs/trans"&gt;https://github.com/BrianDiggs/trans&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/25938265813</link><guid>http://blog.ggplot2.org/post/25938265813</guid><pubDate>Tue, 26 Jun 2012 14:01:35 -0400</pubDate><category>ggplot2</category><category>scales</category><dc:creator>brian-diggs</dc:creator></item><item><title>Dot density measurements</title><description>&lt;p&gt;Jim Perkins is a scientific illustrator who recently contributed a guest &lt;a href="http://blogs.scientificamerican.com/symbiartic/2012/05/14/dots-spots-and-pixels-whats-in-a-name/"&gt;post&lt;/a&gt; about the various meanings of DPI (dots-per-inch) at Symbiartic, a Scientific American blog about &amp;#8220;The art of science and the science of art.&amp;#8221; He also has &lt;a href="http://blogs.scientificamerican.com/symbiartic/2012/01/09/professional-color-calibration-for-computer-screens/"&gt;a&lt;/a&gt; &lt;a href="http://blogs.scientificamerican.com/symbiartic/2012/01/17/how-to-calibrate-your-monitor/"&gt;couple&lt;/a&gt; previous posts about calibrating monitors. &lt;/p&gt;</description><link>http://blog.ggplot2.org/post/25925995368</link><guid>http://blog.ggplot2.org/post/25925995368</guid><pubDate>Tue, 26 Jun 2012 10:01:55 -0400</pubDate><dc:creator>hollybeale</dc:creator></item><item><title>Annotating histograms to indicate the location of specific observations</title><description>&lt;a href="http://stackoverflow.com/q/11122002/324364"&gt;Annotating histograms to indicate the location of specific observations&lt;/a&gt;</description><link>http://blog.ggplot2.org/post/25644004987</link><guid>http://blog.ggplot2.org/post/25644004987</guid><pubDate>Fri, 22 Jun 2012 09:23:00 -0400</pubDate><dc:creator>joranelias</dc:creator></item><item><title>Simulating conditions of legislative violence</title><description>&lt;p&gt;&lt;span&gt;&lt;img src="http://media.tumblr.com/tumblr_m5pvc2NLle1rq6b2e.jpg"/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="http://christophergandrud.blogspot.com/"&gt;Christopher Gandrud&lt;/a&gt; uses ggplot to illustrate his analysis of violence in national legislative chambers (e.g. &lt;a href="http://news.nationalpost.com/2012/03/30/photos-when-lawmakers-disagree-fists-fly-and-sometimes-smoke-bombs-too/"&gt;Turkey, above&lt;/a&gt;). After gathering a data set of incidents of legislative violence, he applied logistic regression for rare events to identify the most important variables and the extent of their importance. He then predicted the probability of violence in a range of conditions with a round of simulations, depicted below.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2044278"&gt;&lt;span&gt;&lt;img src="http://media.tumblr.com/tumblr_m5ptuw4Jb11rq6b2e.jpg"/&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Christopher discusses his approach to this plot in detail &lt;a href="http://christophergandrud.blogspot.com/2012_04_01_archive.html"&gt;here&lt;/a&gt;. &lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The take home on &lt;/span&gt;&lt;span&gt;legislative violence&lt;/span&gt;&lt;span&gt;: new democracies with poor concordance between votes from the electorate, &lt;/span&gt;seats in the legislature, and&lt;span&gt; proportion of governmental power are more likely to see legislative violence. &lt;/span&gt;&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/25433081803</link><guid>http://blog.ggplot2.org/post/25433081803</guid><pubDate>Tue, 19 Jun 2012 09:57:00 -0400</pubDate><dc:creator>hollybeale</dc:creator></item><item><title>Assessing the Price of Solid State Harddrives</title><description>&lt;p&gt;Over a staff meeting at work, the topic of price of solid state hard
drives came up (what are they, is it non linear with size, etc.).  I
decided to sample 120 solid state hard drives from newegg.com and
recorded their size (in GB) and price (in USD) as well as their class
(SATA II or SATA III).  Note that the sampling was semi-random, in
that I had no particular agenda, but did not go to great lengths to
sample randomly.  To look at this, I used ggplot2.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ssd &amp;lt;- read.csv("http://joshuawiley.com/files/ssd.csv")
 ssd$class &amp;lt;- factor(ssd$class)

 require(ggplot2)
 ## first pass
 p &amp;lt;- ggplot(ssd, aes(x = price, y = size, colour = class)) +
     geom_point()
 print(p)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://joshuawiley.com/images/SSDPlot001.png" width="600" height="600" alt="Scatter plot of Size and Price of SSDs"/&gt;&lt;/p&gt;

&lt;p&gt;Not too bad, but the data is sparser at higher sizes and prices, so we
can use a log-log scale to make it a little easier to see, and add
locally weighted regression (loess) lines to assess linearity (or lack
there of).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ## add smooths and log to make clearer
 p &amp;lt;- p +
  stat_smooth(se=FALSE) +
  scale_x_log10(breaks = seq(0, 1000, 100)) +
  scale_y_log10(breaks = seq(0, 600, 100))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://joshuawiley.com/images/SSDPlot002.png" width="600" height="600" alt="Scatter plot of Size and Price of SSDs in log 10
scale with loess smooth lines"&gt;&lt;/p&gt;

&lt;p&gt;Okay, that is nice.  Lastly, let&amp;#8217;s add better labels, make the x-axis
text not overlap, and include the intercept and slope parameters for
the linear lines of best fit for each class of hard drive.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ## fit separate intercept and slope model
 m &amp;lt;- lm(size ~ 0 + class*price, data = ssd)
 est &amp;lt;- round(coef(m), 2)

 size2 &amp;lt;- paste0("II Size = ", est[1], " + ", est[3], "price")
 size3 &amp;lt;- paste0("III Size = ", est[2], " + ", est[4], "price")

 ## finalize
 p &amp;lt;- p +
  annotate("text", x = 100, y = 600, label = size2) +
  annotate("text", x = 100, y = 500, label = size3) +
  labs(x = "Price in USD", y = "Size in GB") +
  opts(title = "Log-Log Plot of SSD Size and Price",
       axis.text.x = theme_text(angle = 45, hjust = 1, vjust = 1))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://joshuawiley.com/images/SSDPlot003.png" width="600" height="600" alt="Fancy Scatter plot of Size and Price of SSDs in log
10 with loess smooth lines"&gt;&lt;/p&gt;

&lt;p&gt;(guest post by Joshua Wiley)&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/25356897293</link><guid>http://blog.ggplot2.org/post/25356897293</guid><pubDate>Mon, 18 Jun 2012 06:53:00 -0400</pubDate><dc:creator>baptiste-auguie</dc:creator></item><item><title>Data Visualization in the Neurosciences: Overcoming the Curse of Dimensionality</title><description>&lt;a href="http://www.cell.com/neuron/fulltext/S0896-6273(12)00428-X"&gt;Data Visualization in the Neurosciences: Overcoming the Curse of Dimensionality&lt;/a&gt;: &lt;p&gt;&lt;em&gt;Summary:&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In publications, presentations, and popular media, scientific results are predominantly communicated through graphs. But are these figures clear and honest or misleading? We examine current practices in data visualization and discuss improvements, advocating design choices which reveal data rather than hide it.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.ggplot2.org/post/25290123615</link><guid>http://blog.ggplot2.org/post/25290123615</guid><pubDate>Sun, 17 Jun 2012 09:26:56 -0400</pubDate><dc:creator>baptiste-auguie</dc:creator></item><item><title>A 14 page cheatsheet for ggplot2</title><description>&lt;a href="http://www.ceb-institute.org/bbs/wp-content/uploads/2011/09/handout_ggplot2.pdf"&gt;A 14 page cheatsheet for ggplot2&lt;/a&gt;: &lt;p&gt;Written by Ramon Saccilotto, shared by &lt;a href="http://twitter.com/m4xl1n"&gt;@m4xl1n&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/25223466416</link><guid>http://blog.ggplot2.org/post/25223466416</guid><pubDate>Sat, 16 Jun 2012 09:23:02 -0400</pubDate><dc:creator>hadley</dc:creator></item><item><title>Name popularity</title><description>&lt;p&gt;This dynamic representation of the popularity of &lt;a href="http://www.babynamewizard.com/voyager#"&gt;names over the years&lt;/a&gt; is a favorite. It&amp;#8217;s not new, but I still find new things to appreciate, like names that used to apply to both sexes and now only one (&lt;a href="http://www.babynamewizard.com/voyager#prefix=ellie&amp;amp;ms=false&amp;amp;exact=false"&gt;Ellie&lt;/a&gt;), or vice versa (&lt;a href="http://www.babynamewizard.com/voyager#prefix=harley&amp;amp;ms=false&amp;amp;exact=true"&gt;Harley&lt;/a&gt;). It seems like there are more very popular male names than very popular female names; I can hardly guess what underlies that.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m5owdeRb641rq6b2e.png"/&gt;&lt;/p&gt;</description><link>http://blog.ggplot2.org/post/25201174009</link><guid>http://blog.ggplot2.org/post/25201174009</guid><pubDate>Fri, 15 Jun 2012 22:54:00 -0400</pubDate><dc:creator>hollybeale</dc:creator></item></channel></rss>
