On 10 sep, 01:50, David Fanning <n...@dfanning.com> wrote:
> David Fanning writes:
>>> I had to expand the 4 colors into a full 256 color table with 257
>>> contour levels to make the color bar display correctly.
>
>> Well, that sort of boggles the mind, but OK, maybe
>> that's how you do it. Unfortunately, it begs the
>> question of how you are now going to overlay the
>> contour lines themselves on this filled contour
>> plot. This, of course, is what I really wanted,
>> although my previous example was reduced to the
>> basics just to get the colors right.
>
> OK, we are making a little progress here. But there
> are still a couple of problems. The color bar insists
> on querying the data to get its range. The range apparently
> cannot be set, so the labels on the color bar are wrong
> and don't correspond to the contour levels. Can anyone
> think of a way to fix these? (I could, of course, force
> the contour labels to be what I want them to be, but
> aside from this feeling like cheating, I can't do it
> because the TICKNAME keyword will crash my machine.)
>
> Also, I cannot seem to set a character size for the plot
> independently of the character size for the contour labels.
> Does anyone know how to do this? In this case, I would like
> the contour plot to have the same size annotation as the
> color bar, with the inside contour labels appearing smaller.
>
> Note that the C_USE_LABEL_ORIENTATION keyword seems to
> keep the contour labels right side up, rather than the
> jumbled, upside down default values. That's the good
> news. The bad news is that is a long keyword to have to
> type for every contour plot you want to create!
>
> Here is the code so far.
>
> ;-------------------------------------------------------
> PRO ContourTest
>
> ; Create a simple, random dataset for contouring:
> data = RANDOMU(-3L, 9, 9)
> LoadCT, 0
> TVLCT, 255, 0, 0, 0
> TVLCT, 0, 0, 255, 1
> TVLCT, 0, 255, 0, 2
> TVLCT, 255, 255, 0, 3
>
> levels =[0.25, 0.5, 0.75, 1.00]
>
> ; Contour function.
> tvlct, rgb, /get
> rgb = congrid(rgb[0:3, *], 256, 3)
> clevels = findgen(257) / 256.
>
> w = window(dimensions=[500, 400])
> ctr = contour(data, /current, c_value=clevels, $
> position=[0.1, 0.1, 0.9, 0.8], /fill, $
> rgb_table=rgb, rgb_indices=indgen(256), $
> axis_style=2, font_size=10)
> ctrOver = contour(data, /current, c_value=levels, $
> color=cgColor('charcoal', /row, /triple), $
> /overplot, c_label_show=Replicate(1, 4), $
> c_use_label_orientation=1, font_size=7)
> cb = colorbar(target=ctr, $
> position=[0.1, 0.90, 0.9, 0.95], $
> major=5, border_on=1, font_size=10)
>
> ; Can we force the font size to be larger? Apparently, not. :-(
> ctr.font_size=10
>
> ; Coyote graphics.
> levels =[0.0, 0.25, 0.5, 0.75]
>
> cgWindow, WXSize=500, WYSize=400
> cgContour, data, LEVELS=levels, C_COLORS=Indgen(4), $
> POSITION=[0.1, 0.1, 0.9, 0.8], /FILL, /ADDCMD
> cgContour, data, LEVELS=levels, C_COLOR='charcoal', LABEL=1, $
> C_CHARSIZE=1.0, /OVERPLOT, /ADDCMD
> cgColorBar, NCOLORS=4, RANGE=[0,1], FORMAT='(F0.2)', $
> DIVISIONS=4, /FIT, /ADDCMD, MINOR=5, XTICKLEN=1.0
> END
> ;-------------------------------------------------------
>
> And here is a little lagniappe (small gift). A program
> to clean up any and all graphics windows on your display.
>
> ;-------------------------------------------------------
> PRO CleanUp
>
> ; Function graphics windows.
> w = GetWindows()
> FOR j=0,N_Elements(w)-1 DO (w[j]).close
>
> ; Widget windows or Coyote Graphics windows.
> Widget_Control, /Reset
>
> ; IDL direct graphics windows.
> WHILE !D.Window GT -1 DO WDelete, !D.Window
>
> END
> ;-------------------------------------------------------
>
> Cheers,
>
> David
> --
> David Fanning, Ph.D.
> Fanning Software Consulting, Inc.
> Coyote's Guide to IDL Programming:http://www.dfanning.com/
> Sepore ma de ni thui. ("Perhaps thou speakest truth.")
David,
Your example illustrates two flaws in NG that ITTVIS should correct as
soon as possible (or, possibly, for which I was not yet able to find
any right answers in ITTVIS documentation ...).
The first one is the fact that the OVERPLOT keyword overrides the font
and axis styles of the overplotted plot, which is a real nonsense. In
your case, the font size attributed to the "ctrOver" plot does
actually change the one of the "ctr" plot. My work around would be:
drawing "ctrOver" first without any axis, then "ctr" (I get the
correct font size, while keeping a smaller font for the isocontour
labels), finally pushing ctrOver in front by using the "Order" method.
The second flaw, even more annoying, is the way in which the NG
"Colorbar" function defines its color range: by using the true min and
max of the (Y or Z) values of the underlying object (here your DATA
array, through TARGET=ctr keyword). You get 0.0134482 and 0.984703,
instead of 0 and 1. Setting ZRANGE=[0,1] does not work better. My
workaround would be: creating a new contour object (here "ctrFake")
with modified data having the desired range, using it as the target of
the colorbar, then pushing it back or deleting it.
Your code, modified accordingly, is given below.
But I agree that using NG in its present state is often more
acrobatics than good programming !
alx.
;-------------------------------------------------------
PRO ContourTest
; Create a simple, random dataset for contouring:
data = RANDOMU(-3L, 9, 9)
LoadCT, 0
TVLCT, 255, 0, 0, 0
TVLCT, 0, 0, 255, 1
TVLCT, 0, 255, 0, 2
TVLCT, 255, 255, 0, 3
levels =[0.25, 0.5, 0.75, 1.00]
; Contour function.
tvlct, rgb, /get
rgb = congrid(rgb[0:3, *], 256, 3)
clevels = findgen(257) / 256.
w = window(dimensions=[500, 400])
ctrOver = contour(data, /current, $
c_value=levels, $
color=cgColor('charcoal', /row, /triple), $
c_label_show=Replicate(1, 4), $
c_use_label_orientation=1, $
font_size=7, $
axis_style=0)
ctr = contour(data, /current, c_value=clevels, /overplot, $
position=[0.1, 0.1, 0.9, 0.8], /fill, $
rgb_table=rgb, rgb_indices=indgen(256), $
axis_style=2, font_size=10)
ctrOver.Order, /BRING_FORWARD
ctr.GetData, z, x, y
z[0] = 0
z[1] = 1
ctrFake = contour(z, /current, c_value=clevels, /overplot, $
position=[0.1, 0.1, 0.9, 0.8], /fill, $
rgb_table=rgb, rgb_indices=indgen(256), $
axis_style=2, font_size=10)
cb = colorbar(target=ctr, $
position=[0.1, 0.90, 0.9, 0.95], $
major=5, border_on=1, font_size=10, TICKVALUES=[0,levels])
ctrFake.Delete ; or ctrFake.Order, /SEND_TO_BACK as well.
; Can we force the font size to be larger? Apparently, not. :-(
ctr.font_size=7
;; Coyote graphics.
;levels =[0.0, 0.25, 0.5, 0.75]
;
;
;cgWindow, WXSize=500, WYSize=400
;cgContour, data, LEVELS=levels, C_COLORS=Indgen(4), $
; POSITION=[0.1, 0.1, 0.9, 0.8], /FILL, /ADDCMD
;cgContour, data, LEVELS=levels, C_COLOR='charcoal', LABEL=1, $
; C_CHARSIZE=1.0, /OVERPLOT, /ADDCMD
;cgColorBar, NCOLORS=4, RANGE=[0,1], FORMAT='(F0.2)', $
; DIVISIONS=4, /FIT, /ADDCMD, MINOR=5, XTICKLEN=1.0
END
;-------------------------------------------------------
|