[R] to draw a smooth arc
Paulo Barata
pbarata at infolink.com.br
Tue May 8 23:41:43 CEST 2007
Prof. Ripley,
Maybe the fact that few R plot regions have a 1:1 aspect ratio
is not a major problem here. One has to deal with the same
issue when drawing a circle parametrically. Depending on the
window size, a (cos(t),sin(t)) plot appears as an ellipse.
To get a circle parametrically, one has to resize the plot region,
or define it (possibly by trial and error) with functions like
windows() or win.graph() (package grDevices), to have a 1:1 aspect
ratio.
Maybe more important is to have some sure way to draw smooth arcs
and arrows. Could it be done even if the plot region does not have
a 1:1 aspect ratio, when the arc (intended to be an arc of a circle)
would show as an arc of an ellipse? Would the smooth ellipse arc
then turn into a smooth circle arc, when the plot region is resized?
Paulo Barata
(Rio de Janeiro - Brazil)
-----------------------------------------------------------------------
Prof Brian Ripley wrote:
> There is now an xspline() function in R-devel, with an example showing
> how to add arrows.
>
> I thought a bit more about a 'circular arc' function, but there really
> is a problem with that. Few R plot regions have a 1:1 aspect ratio
> including some that are intended to do so (see the rw-FAQ). symbols()
> is designed to draw circles in device coordinates, but attempting to
> specify circular arcs by endpoints in user coordinates is fraught.
>
> On Wed, 2 May 2007, Paul Murrell wrote:
>
>> Hi
>>
>>
>> Paulo Barata wrote:
>>> Dr. Murrell and all,
>>>
>>> One final suggestion: a future function arc() in package graphics,
>>> with centre-radius-angle parameterisation, could also include an
>>> option to draw arrows at either end of the arc, as one can find
>>> in function arrows().
>>
>>
>> ... and in grid.xspline() and grid.curve().
>>
>> Paul
>>
>>
>>> Thank you.
>>>
>>> Paulo Barata
>>>
>>> -----------------------------------------------------------------------
>>> Paul Murrell wrote:
>>>> Hi
>>>>
>>>>
>>>> Paulo Barata wrote:
>>>>> Dr. Snow and Prof. Ripley,
>>>>>
>>>>> Dr. Snow's suggestion, using clipplot (package TeachingDemos),
>>>>> is maybe a partial solution to the problem of drawing an arc of
>>>>> a circle (as long as the line width of the arc is not that large,
>>>>> as pointed out by Prof. Ripley). If the arc is symmetrical around
>>>>> a vertical line, then it is not so difficult to draw it that way.
>>>>> But an arc that does not have this kind of symmetry would possibly
>>>>> require some geometrical computations to find the proper rectangle
>>>>> to be used for clipping.
>>>>>
>>>>> I would like to suggest that in a future version of R some function
>>>>> be included in the graphics package to draw smooth arcs with
>>>>> given center, radius, initial and final angles. I suppose
>>>>> that the basic ingredients are available in function "symbols"
>>>>> (graphics).
>>>>
>>>> Just to back up a few previous posts ...
>>>>
>>>> There is something like this facility already available via the
>>>> grid.xspline() function in the grid package. This provides very
>>>> flexible curve drawing (including curves very close to Bezier curves)
>>>> based on the X-Splines implemented in xfig. The grid.curve() function
>>>> provides a convenience layer that allows for at least certain
>>>> parameterisations of arcs (you specify the arc end points and the
>>>> angle).
>>>>
>>>> These functions are built on functionality within the core graphics
>>>> engine, so exposing a similar interface (e.g., an xspline() function)
>>>> within "traditional" graphics would be relatively straightforward.
>>>>
>>>> The core functionality draws the curves as line segments (but
>>>> automatically figures out how many segments to use so that the curve
>>>> looks smooth); it does NOT call curve-drawing primitives in the
>>>> graphics device (like PostScript's curveto).
>>>>
>>>> In summary: there is some support for smooth curves, but we could
>>>> still
>>>> benefit from a specific arc() function with the standard
>>>> centre-radius-angle parameterisation and we could also benefit from
>>>> exposing the native strengths of different graphics devices (rather
>>>> than
>>>> the current lowest-common-denominator approach).
>>>>
>>>> Paul
>>>>
>>>>
>>>>> Thank you very much.
>>>>>
>>>>> Paulo Barata
>>>>> (Rio de Janeiro - Brazil)
>>>>>
>>>>> -----------------------------------------------------------------------
>>>>>
>>>>> Prof Brian Ripley wrote:
>>>>>> On Tue, 1 May 2007, Greg Snow wrote:
>>>>>>
>>>>>>> Here is an approach that clips the circle you like from symbols
>>>>>>> down to
>>>>>>> an arc (this will work as long as the arc is less than half a
>>>>>>> circle,
>>>>>>> for arcs greater than half a circle, you could draw the whole circle
>>>>>>> then use this to draw an arc of the bacground color over the
>>>>>>> section you
>>>>>>> don't want):
>>>>>>>
>>>>>>> library(TeachingDemos)
>>>>>>> plot(-5:5, -5:5, type='n')
>>>>>>> clipplot( symbols(0,0,circles=2, add=TRUE), c(0,5), c(0,5) )
>>>>>> I had considered this approach: clipping a circle to a rectangle
>>>>>> isn't
>>>>>> strictly an arc, as will be clear if the line width is large.
>>>>>> Consider
>>>>>>
>>>>>> clipplot(symbols(0, 0 ,circles=2, add=TRUE, lwd=5), c(-1,5), c(-1,5))
>>>>>>
>>>>>> Note too that what happens with clipping is device-dependent. If R's
>>>>>> internal clipping is used, the part-circle is converted to a polygon.
>>>>>>
>>>>>>
>>>>> ______________________________________________
>>>>> R-help at 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
>>>>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
>
More information about the R-help
mailing list