Skip to content

draw stripes in a circle in R

13 messages · jean-philippe, Jeff Newmiller, David Winsemius +1 more

#
dear R users,

I would like to fill a circle with yellow stripes instead of a uniform 
yellow color. To draw the circle I used the following command after 
having loaded the (very nice !) plotrix library :

library(plotrix)
pdf("MWE.pdf",width=8, height=8)
plot(seq(-12.5,-8.7,length.out=100),seq(-11.3,-8.3,length.out=100),type="l",col="red",xlim=c(-12.5,-8.7),ylim=c(-11.5,-8.5))
par(new=T)
plot(seq(-12.5,-8.7,length.out=100),seq(-11.7,-8.7,length.out=100),type="l",col="red",xlim=c(-12.5,-8.7),ylim=c(-11.5,-8.5))
par(new=T)
polygon(c(seq(-12.5,-8.7,length.out=100), 
rev(seq(-12.5,-8.7,length.out=100))), c(seq(-11.3,-8.3,length.out=100), 
rev(seq(-11.7,-8.7,length.out=100))),
         col = alpha("red",0.4), border = NA)
par(new=T)
draw.circle(-12.85,-10.9,0.85,nv=1000,border=NULL,col="yellow",lty=1,lwd=1)
dev.off()

It looks a bit ugly since they are not real data, but it is the simplest 
MWE example that I found.


Thanks, best


Jean-Philippe
#
I don't see a question. If your question is whether R supports pattern fills, AFAIK it does not. If that is not your question, ask one.
#
Agree that the coding question remains unclear, so not using the offered example but responding to the natural language query. The `polygon` function has 'density' and 'angle' argument that with 'col' and 'lwd' can make slanted fill lines. This is a modification of hte first example on `?polygon`?

x <- c(1:9, 8:1)
y <- c(1, 2*(5:3), 2, -1, 17, 9, 8, 2:9)
op <- par(mfcol = c(3, 1))
for(xpd in c(FALSE, TRUE, NA)) {
    plot(1:10, main = paste("xpd =", xpd))
    box("figure", col = "pink", lwd = 3)
    polygon(x, y, xpd = xpd, col = "orange", density=3, angle=45,  lwd = 5, border = "red")
}

The polygon function is _not_ in pkg::plotrix.
David Winsemius
Alameda, CA, USA
#
I finally understood the question and it needs a hack to the draw.circle function in plotrix since the angle and density arguments don't get passed in:

First get code for draw.circle:

------

draw.circle   # then copy to console and edit

draw.circle2  <- function (x, y, radius, nv = 100, border = NULL, col = NA, lty = 1, 
                           density=NA, angle=45,  lwd = 1 ) 
{
    xylim <- par("usr")
    plotdim <- par("pin")
    ymult <- getYmult()
    angle.inc <- 2 * pi/nv
    angles <- seq(0, 2 * pi - angle.inc, by = angle.inc)
    if (length(col) < length(radius)) 
        col <- rep(col, length.out = length(radius))
    for (circle in 1:length(radius)) {
        xv <- cos(angles) * radius[circle] + x
        yv <- sin(angles) * radius[circle] * ymult + y
        polygon(xv, yv, border = border, col = col, lty = lty, density=density, angle=angle,
                lwd = lwd)
    }
    invisible(list(x = xv, y = yv))
}

Now run your call to pdf with draw.circle2 instead of draw.circle

Best;
David.
David Winsemius
Alameda, CA, USA
#
On 15/06/17 05:29, David Winsemius wrote:
This is just idle curiosity, since I'm not really able to contribute 
anything useful, but I can't resist asking:  When I try to run the OP's 
code I get an error:
Why does this (apparently) not happen to anyone else?  Why does the 
universe pick on *me*?  What is the function "alpha()"?  Where is it to 
be found?

Searching on "alpha" is of course completely unproductive; there are far 
too many (totally irrelevant) instances.

cheers,

Rolf
#
I discovered some time ago that I no longer needed to load the ggplot2 package. I wasn't entirely happy to make this discovery since I stilll cling to the old lattice style. Eventually I figgured out that it was because one of packages that I load in my .Rprofile-file had changed its imports. The `alpha` function I see is from ggplot2. Resistance is futile. I've now been partially assimilated.
David Winsemius
Alameda, CA, USA
#
Package 'scales' has the alpha function... associated with ggplot2. A bit out of place here if that is the origin. Yes, we are squarely in non-reproducible example territory, also known as the Twilight Zone.
#
On 15/06/17 10:27, David Winsemius wrote:
<SNIP>
<SNIP>

N'ya-hah!  The light dawns!  Thank you.

cheers,

Rolf
#
Sigh. I never load packages in .Rprofile to avoid the irreproducibility trap. Might seem drastic to some, but I don't feel much pain because I almost always edit my code in a file rather than on the fly at the console, and re-run it frequently from a fresh R process to check my progress.
#
Yes, <sigh>. But I am a long-time user of the rms/Hmisc combo, as well as the survival package, so near the top of my .Rprofile is:

require(lattice)
require(sos)
require(rms)

Should I be ashamed of that?

I suppose I should, and I _am_ ashamed of some of the other stuff in there  ....<delete>, <delete> ... and I've been meaning to address my manifold deficiencies w.r.t. irreproducibility by moving to RStudio, but I keep putting it off.
#
On 15/06/17 13:51, David Winsemius wrote:
This is getting *way* off topic ... but why does using RStudio help with 
the irreproducibility problem?  I thought that RStudio just made it 
easier to point-and-click.  For those who like doing that sort of thing.
(I tend to believe the dictum that a GUI makes it easy to do easy things 
and impossible to do hard things.)

cheers,

Rolf
#
hi david

Thank you very much for the hack of draw.circle that you proposed me.
I don't understand some part of the code, why do you pass radius as a 
vector in the function (if I understand well the purpose of the for 
loop) ? Also what is ymult?

If I set the radius to the value 0.85 as I wanted (so as a scalar), I 
don't see any difference in the result when I call this function 
draw.circle2, the stripes are not drawn inside the circle. I don't know 
if it is normal.


Thanks, best


Jean-Philippe
On 14/06/2017 19:29, David Winsemius wrote:

  
    
#
It certainly wasn't intended. I expected the radius argument to get used repeatedly just as it is in the original function, but remain a scalar. Did you just copy-paste my code or do your own alterations? And did you add the arguments to the new call?

When I use:

Your set-up surrounds this:

 draw.circle2(-12.85,-10.9,0.85,nv=1000,border=NULL,col="yellow",lty=1,lwd=5, density=2, angle=45)

I get the attached pdf:

-------------- next part --------------
A non-text attachment was scrubbed...
Name: MWE.pdf
Type: application/pdf
Size: 9753 bytes
Desc: not available
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20170615/2387defb/attachment.pdf>
-------------- next part --------------


I don't think you are interpreting the code in the same manner as I do.  When hacking someone else code it's probably a good idea to give all the arguments names. That way you uncover errors in the argument passing better because name collision get flagged and the error messages become more meaningful.

Feel free to post annotations using the octothorpe method in between lines to explain how you understand the code.