pro density, x0, y0, drange=drange, dlog=dlog, dsize=dsize, $
ct=ct, ps_white=ps_white, $
contour=contour, flevels=flevels, $
xlog=xlog, ylog=ylog, _extra = _extra
if (n_params() eq 1) then begin
y = x0
x = findgen(n_elements(y))
endif else begin
y = y0
x = x0
endelse
if (n_elements(ct) eq 1) then begin
if (ct ge 0 and ct le 40) then loadct,ct,/silent
if (ct eq -1) then begin
ramp = 255B-bindgen(256)
if (!d.name eq 'PS') then begin
ps_white = 1
ramp[0] = 0
endif
tvlct,ramp,ramp,ramp
endif
endif
if (!d.name eq 'PS') then begin
device,/color,bits=8
tvlct,/get,r0,g0,b0
r = r0
g = g0
b = b0
r[1] = keyword_set(ps_white) ? 255 : r[255]
g[1] = keyword_set(ps_white) ? 255 : g[255]
b[1] = keyword_set(ps_white) ? 255 : b[255]
tvlct,r,g,b
endif
minx = min(x,max=maxx)
miny = min(y,max=maxy)
plot, [minx,maxx], [miny,maxy], /nodata, xlog=xlog, ylog=ylog, _extra=_extra
dsize0 = round([(!x.window[1]-!x.window[0])*!d.x_size,$
(!y.window[1]-!y.window[0])*!d.y_size])
if (!d.name eq 'PS') then dsize0 = dsize0/24
if (n_elements(dsize) ne 2) then dsize = dsize0
if (not(keyword_set(xlog)) and not(keyword_set(ylog))) then $
z = long(dsize[0]*(x-!x.crange[0])/(!x.crange[1]-!x.crange[0])) + $
long(dsize[1]*(y-!y.crange[0])/(!y.crange[1]-!y.crange[0]))*dsize[0]
if ( (keyword_set(xlog)) and not(keyword_set(ylog))) then $
z = long(dsize[0]*(alog10(x)-!x.crange[0])/(!x.crange[1]-!x.crange[0])) + $
long(dsize[1]*(y-!y.crange[0])/(!y.crange[1]-!y.crange[0]))*dsize[0]
if (not(keyword_set(xlog)) and (keyword_set(ylog))) then $
z = long(dsize[0]*(x-!x.crange[0])/(!x.crange[1]-!x.crange[0])) + $
long(dsize[1]*(alog10(y)-!y.crange[0])/(!y.crange[1]-!y.crange[0]))*dsize[0]
if ( (keyword_set(xlog)) and (keyword_set(ylog))) then $
z = long(dsize[0]*(alog10(x)-!x.crange[0])/(!x.crange[1]-!x.crange[0])) + $
long(dsize[1]*(alog10(y)-!y.crange[0])/(!y.crange[1]-!y.crange[0]))*dsize[0]
if (not(keyword_set(xlog)) and not(keyword_set(ylog))) then $
h = where(x gt min(!x.crange) and x lt max(!x.crange) and $
y gt min(!y.crange) and y lt max(!y.crange),nh)
if ( (keyword_set(xlog)) and not(keyword_set(ylog))) then $
h = where(x gt 10.^min(!x.crange) and x lt 10.^max(!x.crange) and $
y gt min(!y.crange) and y lt max(!y.crange),nh)
if (not(keyword_set(xlog)) and (keyword_set(ylog))) then $
h = where(x gt min(!x.crange) and x lt max(!x.crange) and $
y gt 10.^min(!y.crange) and y lt 10.^max(!y.crange),nh)
if ( (keyword_set(xlog)) and (keyword_set(ylog))) then $
h = where(x gt 10.^min(!x.crange) and x lt 10.^max(!x.crange) and $
y gt 10.^min(!y.crange) and y lt 10.^max(!y.crange),nh)
im = fltarr(dsize[0],dsize[1])
if (nh ge 1) then begin
im = histogram(z[h],binsize=1,min=0,nbins=product(dsize))
im = reform(im,dsize[0],dsize[1])
endif
if (n_elements(drange) ne 2) then drange = minmax(im)
if (!d.name ne 'PS') then begin
if not(keyword_set(dlog)) then $
tv,bytscl(congrid(im,dsize0[0],dsize0[1]),drange[0],drange[1],top=254)+1,$
!x.window[0]*!d.x_size,!y.window[0]*!d.y_size
if (keyword_set(dlog)) then begin
log_im = alog10(im>0.1)
ldrange = alog10(drange>0.1)
tv,bytscl(congrid(log_im,dsize0[0],dsize0[1]),ldrange[0],ldrange[1]),$
!x.window[0]*!d.x_size,!y.window[0]*!d.y_size
endif
endif else begin
if not(keyword_set(dlog)) then $
tv,bytscl(im,drange[0],drange[1],top=254)+1,!x.window[0],!y.window[0],$
xsize=(!x.window[1]-!x.window[0]),ysize=(!y.window[1]-!y.window[0]),/norm
if (keyword_set(dlog)) then begin
log_im = alog10(im>0.1)
ldrange = alog10(drange>0.1)
tv,bytscl(log_im,ldrange[0],ldrange[1],top=254)+1,!x.window[0],!y.window[0],$
xsize=(!x.window[1]-!x.window[0]),ysize=(!y.window[1]-!y.window[0]),/norm
endif
endelse
if (!p.multi[1] gt 1 or !p.multi[2] gt 1) then !p.multi[0] = !p.multi[0]+1
if keyword_set(contour) then begin
if (dsize[1] gt 100) then begin
kern = exp(-0.5*dist(20)^2/5.^2)
kern = kern/total(kern,/double)
im = convol(float(im),kern,/edge_wrap)
endif
cx = findgen((size(im))[1]) + 0.5
cy = findgen((size(im))[2]) + 0.5
if keyword_set(xlog) then begin
cx = 10.^(cx/n_elements(cx)*(!x.crange[1]-!x.crange[0])+!x.crange[0])
endif else begin
cx = cx/n_elements(cx)*(!x.crange[1]-!x.crange[0])+!x.crange[0]
endelse
if keyword_set(ylog) then begin
cy = 10.^(cy/n_elements(cy)*(!y.crange[1]-!y.crange[0])+!y.crange[0])
endif else begin
cy = cy/n_elements(cy)*(!y.crange[1]-!y.crange[0])+!y.crange[0]
endelse
if (n_elements(flevels) ge 1) then begin
levels = fltarr(n_elements(flevels))
sim = im[sort(im)]
cim = total(sim,/cumulative)/total(sim)
for i=0,n_elements(levels)-1 do levels[i] = sim[0>min(where(cim ge flevels[i]))]
contour,im,cx,cy,/noerase,xlog=xlog,ylog=ylog,$
levels=levels,_extra=_extra,xsty=5,ysty=5
endif else begin
contour,im,cx,cy,/noerase,xlog=xlog,ylog=ylog,_extra=_extra,xsty=5,ysty=5
endelse
endif
plot,[minx,maxx],[miny,maxy],/nodata,/noerase,xlog=xlog,ylog=ylog,_extra=_extra
if (!p.multi[1] gt 1 or !p.multi[2] gt 1) then !p.multi[0] = !p.multi[0]-1
if (!d.name eq 'PS') then begin
tvlct,r0,g0,b0
endif
end