Re: [R] barplot and missing values?

From: Dan Bolser <dmb_at_mrc-dunn.cam.ac.uk>
Date: Sun 05 Jun 2005 - 00:53:57 EST


On Sat, 4 Jun 2005, Marc Schwartz wrote:

>On Sat, 2005-06-04 at 14:50 +0100, Dan Bolser wrote:
>
><snip>
>
>> This must be because of the "log='y'" option that I am using here.
>>
>> y <- c(2,4,6,8,NA,NA,NA,NA,18)
>>
>> barplot2(y,log='y')
>>
>> Above fails.
>>
>>
>> I appreciate that what I am trying to do is somewhat artificial (handle
>> zero values on a log scale), but it does reflect the data I have.
>>
>> I tried plot(..., type='h'), but that dosn't do the "beside=T" stuff that
>> I want to do.
>>
>> I am now trying things like...
>>
>> barplot2(
>> dat.y.plot + 0.11, # Dirty hack
>> offset=-0.1, #
>> xpd=F, #
>> log='y',
>> beside=T
>> )
>>
>> Which looks messy.
>>
>> Any way to cleanly handle NA values with barplot2 on a log scale
>> (log='y')?
>
><snip>
>
>Dan,
>
>You are actually close in the above example, using the 'offset'
>argument.
>
>In this case, you still cannot use "NA"s, since their value is unknown
>and so must set these elements to zero. Then using a small offset value,
>you can adjust the base value of the y axis so that it is "just above"
>zero. This should result in a minimal shift of the bar values above
>their actual values and should not materially affect the plot's
>representation of the data.
>
>Something like the following "should" work:
>
> > y <- c(2, 4, 6, 8, NA, NA, NA, NA, 18)
> > y
> [1] 2 4 6 8 NA NA NA NA 18
>
> > y[is.na(y)] <- 0
> > y
> [1] 2 4 6 8 0 0 0 0 18
>
>
> barplot2(y, log = "y", offset = 0.01, las = 2)
>
>Note also that if you follow the above with:
>
> box()
>
>The residual bars from the (0 + 0.01) values are covered with the plot
>region box, if that is an issue for you.

Actually it looks a bit strange (I guess you didn't check it?) - I see what is happening. It isn't much different from...

barplot2(y+0.01, log = "y",las = 1)

Which is the essence of the fix, but all that bar (on a log scale) between 1 and 0.1 and 0.01 is as big as 1 to 10, which is a bit artificial.

My previous fix looks best now I check it with the example ...

y
> y

[1] 2 4 6 8 0 0 0 0 18

barplot2(
  y + 0.11,
  ylim=c(1,max(y)),
  offset = -0.10,
  log='y',
  xpd=F
)
box()

Looks like the above is what I need :)

Thanks for teh help - its reasuring to see similar fixes :)

>
>This is still something of a "hack", but it is a little cleaner. The key
>of course is to avoid the use of a bar value of log(x), where x <= 0.
>Selecting the proper offset value based upon your actual data is
>important so as to minimally affect the values visually.
>
>HTH,
>
>Marc Schwartz
>
>



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Sun Jun 05 00:58:51 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:32:22 EST