Duncan Murdoch
2016-Aug-04 20:08 UTC
[R] Fwd: only plot borders of a region in a scatter plot
On 04/08/2016 11:46 AM, Zun Yin wrote:> Dear William, Duncan and Bert, > > Thanks a lot for your help and tips :D In fact the contour() plot still > cannot solve my problem perfectly. As the resolution of my plot is very > coarse, I want to a contour perfectly surround all grid cells in the river > basin. In another word, I want all angle of the contour to be 90 degree. > Another problem for the contour() is that the contour line doesn't close at > where the value of neighbouring grid cell is NA. See the right side of the > two contour lines (attachment). Do you know how I can get what I want? > Thanks a lot :PThe second problem is easy: just change your NA values to some new ID value, or change the test from basiinID == ID to !is.na(basiinID) & basiinID == ID The first one looks harder. Duncan Murdoch> > Cheers, > > > Zun Yin > > On Thu, Aug 4, 2016 at 5:09 PM, Bert Gunter <bgunter.4567 at gmail.com> wrote: > >> ... note the typo. It's: >> >> contour( basiinID == ID, level=0.5) >> >> :-) >> >> >> -- Bert >> >> >> >> Bert Gunter >> >> "The trouble with having an open mind is that people keep coming along >> and sticking things into it." >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) >> >> >> On Thu, Aug 4, 2016 at 8:03 AM, William Dunlap via R-help >> <r-help at r-project.org> wrote: >>> If 'basinID' is the matrix of basin identifiers you could draw an outline >>> of the basin with identifier 'ID' with >>> coutour( basiinID == ID, level=0.5) >>> Add 'add=TRUE' if you are overlaying this on an existing plot. >>> >>> Bill Dunlap >>> TIBCO Software >>> wdunlap tibco.com >>> >>> On Thu, Aug 4, 2016 at 1:51 AM, Zun Yin <yinzun2000 at gmail.com> wrote: >>> >>>> D >>>> ear all, >>>> >>>> I have a matrix with ID of river basins (integer numbers). Now I want to >>>> highlight one river basin in a map by plotting only the border. Like the >>>> attached figure. Two river basins are highlighted by polygons. It is >>>> created by ferret, but I prefer to implement it by R. Anybody know how >> to >>>> do it? Thanks a lot. >>>> >>>> Cheers, >>>> >>>> Zun Yin >>>> >>>> ______________________________________________ >>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>> 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. >>>> >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>> 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. >> >> >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> 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.
Hi Zun Yin,
The first problem requires something like this:
pixel8<-function(x,y,pixsize=1) {
nsteps<-length(x)-1
newx<-x[1]
newy<-y[1]
for(i in 1:nsteps) {
dx<-diff(x[i:(i+1)])
dy<-diff(y[i:(i+1)])
if(dx && dy) {
newx<-c(newx,x[i]+dx,x[i]+dx)
newy<-c(newy,y[i],y[i]+dy)
}
else {
newx<-c(newx,x[i+1])
newy<-c(newy,y[i+1])
}
}
return(list(x=newx,y=newy))
}
I think that this does part of what you want. Your points seem to be
in the middle of a pixel edge, so an offset would have to be added to
align the resulting points with the corners. The other thing to work
out is the order of changing x and y on a slope, which I think is a
function of whether the line is "inside" or "outside" the
overall area
enclosed. I'll post again if I have any brilliant ideas.
Jim
On Fri, Aug 5, 2016 at 6:08 AM, Duncan Murdoch <murdoch.duncan at
gmail.com> wrote:> On 04/08/2016 11:46 AM, Zun Yin wrote:
>>
>> Dear William, Duncan and Bert,
>>
>> Thanks a lot for your help and tips :D In fact the contour() plot still
>> cannot solve my problem perfectly. As the resolution of my plot is very
>> coarse, I want to a contour perfectly surround all grid cells in the
river
>> basin. In another word, I want all angle of the contour to be 90
degree.
>> Another problem for the contour() is that the contour line doesn't
close
>> at
>> where the value of neighbouring grid cell is NA. See the right side of
the
>> two contour lines (attachment). Do you know how I can get what I want?
>> Thanks a lot :P
>
>
> The second problem is easy: just change your NA values to some new ID
> value, or change the test from
>
> basiinID == ID
>
> to
>
> !is.na(basiinID) & basiinID == ID
>
> The first one looks harder.
>
> Duncan Murdoch
>
>
>>
>> Cheers,
>>
>>
>> Zun Yin
>>
>> On Thu, Aug 4, 2016 at 5:09 PM, Bert Gunter <bgunter.4567 at
gmail.com>
>> wrote:
>>
>>> ... note the typo. It's:
>>>
>>> contour( basiinID == ID, level=0.5)
>>>
>>> :-)
>>>
>>>
>>> -- Bert
>>>
>>>
>>>
>>> Bert Gunter
>>>
>>> "The trouble with having an open mind is that people keep
coming along
>>> and sticking things into it."
>>> -- Opus (aka Berkeley Breathed in his "Bloom County"
comic strip )
>>>
>>>
>>> On Thu, Aug 4, 2016 at 8:03 AM, William Dunlap via R-help
>>> <r-help at r-project.org> wrote:
>>>>
>>>> If 'basinID' is the matrix of basin identifiers you
could draw an
>>>> outline
>>>> of the basin with identifier 'ID' with
>>>> coutour( basiinID == ID, level=0.5)
>>>> Add 'add=TRUE' if you are overlaying this on an
existing plot.
>>>>
>>>> Bill Dunlap
>>>> TIBCO Software
>>>> wdunlap tibco.com
>>>>
>>>> On Thu, Aug 4, 2016 at 1:51 AM, Zun Yin <yinzun2000 at
gmail.com> wrote:
>>>>
>>>>> D
>>>>> ear all,
>>>>>
>>>>> I have a matrix with ID of river basins (integer numbers).
Now I want
>>>>> to
>>>>> highlight one river basin in a map by plotting only the
border. Like
>>>>> the
>>>>> attached figure. Two river basins are highlighted by
polygons. It is
>>>>> created by ferret, but I prefer to implement it by R.
Anybody know how
>>>
>>> to
>>>>>
>>>>> do it? Thanks a lot.
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Zun Yin
>>>>>
>>>>> ______________________________________________
>>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and
more, see
>>>>> 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.
>>>>>
>>>>
>>>> [[alternative HTML version deleted]]
>>>>
>>>> ______________________________________________
>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and
more, see
>>>> 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.
>>>
>>>
>>>
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more,
see
>>> 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.
>
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
Hi Zun Yin,
A slight improvement follows, which tries to "inflate" the pixellation
locally. This, in addition to the offset, might do it for you.
pixel8<-function(x,y) {
nsteps<-length(x)-1
newx<-x[1]
newy<-y[1]
lastdx<-lastdy<-0
for(i in 1:nsteps) {
dx<-diff(x[i:(i+1)])
dy<-diff(y[i:(i+1)])
if(dx && dy) {
if((dx+lastdx)/(dy+lastdy) < 0) {
newx<-c(newx,x[i]+dx,x[i]+dx)
newy<-c(newy,y[i],y[i]+dy)
}
else {
newx<-c(newx,x[i],x[i]+dx)
newy<-c(newy,y[i]+dy,y[i]+dy)
}
}
else {
newx<-c(newx,x[i+1])
newy<-c(newy,y[i+1])
}
lastdx<-dx
lastdy<-dy
}
return(list(x=newx,y=newy))
}
x<-c(5,4,4,3,2,2,1,1,2,2,3,4,5,5,6,6,7,8,8,9,8,7,7,6,6,5,5)
y<-c(1,2,2,3,4,4,5,6,6,7,8,8,9,8,8,7,7,6,6,5,5,4,3,3,2,2,1)
plot(1:9,type="n")
lines(x,y)
newxy<-pixel8(x,y)
lines(newxy$x,newxy$y,col="red")
Jim
On Fri, Aug 5, 2016 at 11:40 AM, Jim Lemon <drjimlemon at gmail.com>
wrote:> Hi Zun Yin,
> The first problem requires something like this:
>
> pixel8<-function(x,y,pixsize=1) {
> nsteps<-length(x)-1
> newx<-x[1]
> newy<-y[1]
> for(i in 1:nsteps) {
> dx<-diff(x[i:(i+1)])
> dy<-diff(y[i:(i+1)])
> if(dx && dy) {
> newx<-c(newx,x[i]+dx,x[i]+dx)
> newy<-c(newy,y[i],y[i]+dy)
> }
> else {
> newx<-c(newx,x[i+1])
> newy<-c(newy,y[i+1])
> }
> }
> return(list(x=newx,y=newy))
> }
>
> I think that this does part of what you want. Your points seem to be
> in the middle of a pixel edge, so an offset would have to be added to
> align the resulting points with the corners. The other thing to work
> out is the order of changing x and y on a slope, which I think is a
> function of whether the line is "inside" or "outside"
the overall area
> enclosed. I'll post again if I have any brilliant ideas.
>
> Jim
>
>
> On Fri, Aug 5, 2016 at 6:08 AM, Duncan Murdoch <murdoch.duncan at
gmail.com> wrote:
>> On 04/08/2016 11:46 AM, Zun Yin wrote:
>>>
>>> Dear William, Duncan and Bert,
>>>
>>> Thanks a lot for your help and tips :D In fact the contour() plot
still
>>> cannot solve my problem perfectly. As the resolution of my plot is
very
>>> coarse, I want to a contour perfectly surround all grid cells in
the river
>>> basin. In another word, I want all angle of the contour to be 90
degree.
>>> Another problem for the contour() is that the contour line
doesn't close
>>> at
>>> where the value of neighbouring grid cell is NA. See the right side
of the
>>> two contour lines (attachment). Do you know how I can get what I
want?
>>> Thanks a lot :P
>>
>>
>> The second problem is easy: just change your NA values to some new ID
>> value, or change the test from
>>
>> basiinID == ID
>>
>> to
>>
>> !is.na(basiinID) & basiinID == ID
>>
>> The first one looks harder.
>>
>> Duncan Murdoch
>>
>>
>>>
>>> Cheers,
>>>
>>>
>>> Zun Yin
>>>
>>> On Thu, Aug 4, 2016 at 5:09 PM, Bert Gunter <bgunter.4567 at
gmail.com>
>>> wrote:
>>>
>>>> ... note the typo. It's:
>>>>
>>>> contour( basiinID == ID, level=0.5)
>>>>
>>>> :-)
>>>>
>>>>
>>>> -- Bert
>>>>
>>>>
>>>>
>>>> Bert Gunter
>>>>
>>>> "The trouble with having an open mind is that people keep
coming along
>>>> and sticking things into it."
>>>> -- Opus (aka Berkeley Breathed in his "Bloom County"
comic strip )
>>>>
>>>>
>>>> On Thu, Aug 4, 2016 at 8:03 AM, William Dunlap via R-help
>>>> <r-help at r-project.org> wrote:
>>>>>
>>>>> If 'basinID' is the matrix of basin identifiers you
could draw an
>>>>> outline
>>>>> of the basin with identifier 'ID' with
>>>>> coutour( basiinID == ID, level=0.5)
>>>>> Add 'add=TRUE' if you are overlaying this on an
existing plot.
>>>>>
>>>>> Bill Dunlap
>>>>> TIBCO Software
>>>>> wdunlap tibco.com
>>>>>
>>>>> On Thu, Aug 4, 2016 at 1:51 AM, Zun Yin <yinzun2000 at
gmail.com> wrote:
>>>>>
>>>>>> D
>>>>>> ear all,
>>>>>>
>>>>>> I have a matrix with ID of river basins (integer
numbers). Now I want
>>>>>> to
>>>>>> highlight one river basin in a map by plotting only the
border. Like
>>>>>> the
>>>>>> attached figure. Two river basins are highlighted by
polygons. It is
>>>>>> created by ferret, but I prefer to implement it by R.
Anybody know how
>>>>
>>>> to
>>>>>>
>>>>>> do it? Thanks a lot.
>>>>>>
>>>>>> Cheers,
>>>>>>
>>>>>> Zun Yin
>>>>>>
>>>>>> ______________________________________________
>>>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE
and more, see
>>>>>> 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.
>>>>>>
>>>>>
>>>>> [[alternative HTML version deleted]]
>>>>>
>>>>> ______________________________________________
>>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and
more, see
>>>>> 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.
>>>>
>>>>
>>>>
>>>>
>>>> ______________________________________________
>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and
more, see
>>>> 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.
>>
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.