[R] png() resolution problem {was "Silhouette ..."}

Martin Maechler maechler at stat.math.ethz.ch
Sat Jun 20 19:10:38 CEST 2009


Hallo Sebastian,

>>>>> "SP" == Sebastian Pölsterl <sebp at k-d-w.org>
>>>>>     on Sun, 14 Jun 2009 14:04:52 +0200 writes:

    SP> Hello Martin,
    SP> I plotting the silhouette of a clustering and storing it as png. When I 
    SP> try to store the image as png the bars are missing. The bars are plotted 
    SP> when I use x11 or postscript as device. In addition, it seems to work 
    SP> when I use a smaller matrix (e.g. ruspini).

    SP> Would be great if you have look at this issue.

Hmm, I've been at a conference in Italy...
The silhouette plot only uses standard R plotting functions,
so any problem with it exposes problems in standard R
graphics.

--> Such a message should really go to R-help.
to which I CC now.

----------

     library(cluster)
     nmat <- matrix(rnorm(2500*300), ncol=300, nrow=2500)
     rmat <- matrix(rchisq(1000, 300, 50), ncol=300, nrow=1000)
     mat <- rbind(nmat, rmat)
     pr <- pam(mat, 2)
     sil <- silhouette(pr)
     png("sil.png")
     #postscript("sil.ps")
     plot(sil)
     dev.off()

----------

Anyway, I can confirm the "problem",
but of course, it has not much to do with the silhouette
function, but rather with the png() device which produces a
bitmap, and the lines you draw are too fine (in the bitmap
resolution) and so are "rounded to invisible".

You can reproduce the problem much more simply:

set.seed(1); x <- rlnorm(5000)

png("bar.png");barplot(x,col="gray",border=0,horiz=TRUE);dev.off()
system("eog bar.png  &")

## which is also empty, and the completely analogue, replacing 
## png [bitmap] with  pdf [vector graphic]

pdf("bar.pdf");barplot(x,col="gray",border=0,horiz=TRUE);dev.off()
system("evince bar.pdf &")

## gives a very nice plot, into which you can zoom and see all details.

----------------

Now in principle you should be able to use  png() with a much
higher resolution than the default one,
but replacing the above
    png("bar.bng")
with
    png("bar.bng", res = 1200)

did not help, as we now get the infamous
    Error in plot.new() : figure margins too large

Other R-help readers will be able to make the png() example work
for such cases, where you need so many lines.
{but let's stick with barplot(*, border=0, *)}

Regards,
Martin Maechler, ETH Zurich




More information about the R-help mailing list