【IDL】 绘制颜色棒 (colorbar)
1.利用SuperView数据基于ENVI深度学习进行建筑物提取2.ENVI发布深度学习产品:ENVI Deep Learning Module3.澳大利亚市政局利用ENVI深度学习进行树木调查4.ENVI软件系列产品体系结构5.ENVI新机器学习:ENVITask 使用说明6.ENVI新机器学习:随机森林遥感分类工具操作手册7.ENVI新机器学习:异常探测分类工具操作手册8.新机器学习遥感分类工具9.ENVI深度学习2.0新特性10.IDL封装百度翻译API实现自动翻译和语种识别11.使用IDL进行氚羽流监测(五)—绘制污染物扩散带等值线图12.使用DL进行氚羽流监测(四)——绘制预期氚衰变图13.使用IDL进行氚羽流监测(三)——绘制含水层相对流速14.使用IDL进行氚羽流监测(二)——绘制3D地形和地下水位15.使用IDL进行氚羽流监测(一)——对研究区和环境进行建模16.【IDL】IDL8.8 安装中文语言包方法17.【IDL】IDL 8.7.1机器学习框架18.【IDL】IDL 8.7.1 新特性19.【IDL】获取參边形的最小外接矩形20.【IDL】图形保存图片时文字变黑块的临时解决方法21.【IDL】控制台使用Alt+/代码补全快捷键的方法22.【IDL】IDL 8.6新功能23.【IDL】 程序发布exe清晰步骤24.【IDL) 64位IDL中调用32位功能的方法25.【IDL】 去掉黄色警告图标的方法26.【IDL】 重写HDF文件中数据集的方法27.【IDL】无法使用格式快捷键的解决办法(Ctrl+ Shift+F)28.【IDL】IDL 8.5 中的颜色选择对话框29.【IDL】IDL 8.5 中的 Python Bridge30.【IDL】 开发环境(工作台)的语言切换万法31.【IDL】IDL8.4 文件监视系统体验32.【IDL】 批处理遇到错误时处理方法33.【IDL】开发游戏"2048"34.【IDL】IDL 8.4新特性介绍35.【IDL】IDL中乱码问题的解决方法36.【IDL】 自动构建泰森多边形(Voronoi Polygon)37.【IDL】 IDL 8.3 的新特性与新功能38.【IDL】 IDL 8.3 新功館39.2013开发竞赛ENV/IDL组作品欣赏——“伪装目标识别系统”40.【IDL】多元线性回归计算方法41.【IDL】 关键字继承42.【IDL】调用6S.exe生成查找表源码43.【IDL】使用WIDGET_TIMER进行动画控制44.【IDL】路径相关函数和方法汇总45.【IDL】绘图组件打开鼠标拖拽文件的方法46.【IDL】遠取文本中三維数組的方法47.【IDL】 IDL 8.2.2(SP2)新特性48.【IDL】IDL程序发布方法总结49.【IDL】宏命令菜单(Macros)的用处50.【IDL】 使用SPAWN启动路径中带有空格的文件51.【IDL】 实现双重排序功能(更新降序)52.【IDL】 C#调用ENVL_FX_SEGMENTONLY_DOIT需要注意的地方53.【IDL】 IDL 8.2 新增视频对象IDLffVideoWrite用法示例54.【IDL】生成等差/等比数列的方法55.【IDL】 判断双精度变量是合EQ56.【IDL】 File_Search函数用法详解57.【IDL】坐标轴中文标题乱码问题58.【IDL】C#调用IDL编写界面(含事件)的问题59.《IDL程序设计—数据可视化与ENV二次开发》目录60.《IDL程序设计—数据可视化与ENVI二次开发》已由高等教育出版社正式出版61.IDL Viewer 应用模版介绍(版本号更新为1.2)62.【IDL】日期和时间函数63.【IDL】数组求交集、并集和差集的函数64.【IL】IDL 8.2 新特性65.【IDL】 气象可视化程序配置(idL_guide5)66.【转】几个IDL在线教程网址67.【IDL】医学中IDL的应用68.【IDL】气象中IDL的应用69.【IDL】SIZE函数使用方法与参数含义详解70.【IDL】 DICOM扩展模块71.【IDL】几何图形数学运算函数72.【IDL】 弹出界面事件响应示例程序73.【IDL】鼠标信息显示界面(同理可实现鹰眼图等)74.【IDL】 IDL与C#混合编程技术75.【IDL〕编写程序启动界面76.【IDL】获取n*n数组的对角线元素的方法77.【IDL】同时显示不同分辨率图像的方法78.【IDL】帮助科学家了解太阳系的形成79.【IDL】 Polyval函数(多项式的估值)80.【IDL】 数组下标转换一维坐标索引函数:array_indices_reverse81.【IDL】数据处理时遇到了NAN怎么办82.ENVI二次开发时的波段运算表达式语句合理性检测方法与ENVI检测方法探讨83.【IDL】编写高效率的IDL程序84.【IDL】实现ENVI默认显示效果(线性拉伸算法)85.【IDL】双视图关联示例86.【IDL】图像真彩色、假彩色和伪彩色显示87.【IDL】国外学习与开源网站汇总88.【IDL】 如何保存IDL绘制的图像或图形89.【IDL】学习书籍《Modern IDL》90.【IDL】 读写Excel的方法总结
91.【IDL】 绘制颜色棒 (colorbar)
92.【IDL】 IDL8.1新功能介绍93.【IDL】 讨论浮点运算精度问题 (IDL与Excef和Matlab相比)94.【IDL】 图像显示程序(直接图形法与对象图形法混合显示)95.【IDL】 IDL Advanced及其详细功能介绍96.【IDL】自定义鼠标光标样式(直接图形法与对象图形法)97.【IDL】多条件判断的另类写法(case代替i)98.2014年IDL培训班素材包及录屏共享99.IDL中开发游戏“2048”100.ENVI 6.0自助试用许可开放申请在IDL绘图过程中,经常使用颜色棒,对iTools和IDL8.0下的快速可视化非常容易,在直接图形法和对象图形法下实现颜色棒的绘制,特别是特殊颜色棒,如两边带箭头标识的。下面colorbar对象类实现绘制颜色棒,调用参考类文件中COLORBAR_EXAMPLE,示例效果见下图。
【参考源代码】
;+
; :Description:
; 析构函数
;-
PRO COLORBAR::CLEANUP
COMPILE_OPT idl2
OBJ_DESTROY, self.OFONT
PTR_FREE,self.STEPCOLOR
self->IDLGRMODEL::CLEANUP
END
;+
;创建功能
;-
PRO COLORBAR::CreateColorBar
COMPILE_OPT idl2
objPolys = OBJARR(2,self.SCALENUM)
startLoc = self.LOCATION
colors = *(self.STEPCOLOR)
IF self.DIRECTION EQ 1 THEN eachDims = self.DIMENSION/[1,self.SCALENUM] $
ELSE eachDims = self.DIMENSION/[self.SCALENUM,1]
IF self.FLOATLEN EQ 0 THEN format='(I0)' ELSE format='(f0.'+STRTRIM(self.FLOATLEN,2)+')'
self.OFONT = OBJ_NEW('IDLgrFont','Times New Roman')
;带尖的
IF self.AXISSTYLE EQ 1 THEN BEGIN
oTexts = OBJARR(self.SCALENUM-1)
;水平方向,10个颜色,10个多边形,9个刻度
eachValue = (self.MAXVALUE - self.MINVALUE)/self.SCALENUM
oModel= OBJ_NEW('IDLgrModel')
FOR i=0, self.SCALENUM-1 DO BEGIN
;竖直的话
IF self.DIRECTION EQ 1 THEN BEGIN
xLen = eachDims[0]/2
tmpx = startLoc[0,0]
tmpy = startLoc[1,0]+eachDims[1]*i
IF i EQ 0 THEN BEGIN
data = [[tmpx+xLen/2.,tmpy],[tmpx+xLen,tmpy+eachDims[1]],[tmpx,tmpy+eachDims[1]]]
ENDIF ELSE IF i EQ self.SCALENUM-1 THEN BEGIN
data = [[tmpx+xLen,tmpy],[tmpx+xLen/2.,tmpy+eachDims[1]],[tmpx,tmpy]]
;绘制刻度
curValue = self.MINVALUE+eachValue*i
oTexts[i-1] = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$
location = [tmpx,tmpY]-[-1.4,.4]*xLen, $
CHAR_DIMENSIONS =[0.5,0.75]*xLen, $
font = self.OFONT)
self->ADD,oTexts[i-1]
ENDIF ELSE BEGIN
data = [[tmpx+xLen,tmpy],[tmpx+xLen,tmpy+eachDims[1]],[tmpx,tmpy+eachDims[1]],[tmpx,tmpy]]
;绘制刻度
curValue = self.MINVALUE+eachValue*i
oTexts[i-1] = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$
location = [tmpx,tmpY]-[-1.4,.4]*xLen, $
CHAR_DIMENSIONS =[0.5,0.75]*xLen, $
font = self.OFONT)
self->ADD,oTexts[i-1]
ENDELSE
objPolys[0,i] = OBJ_NEW('IDLgrPolygon',data,color =colors[*,i] )
objPolys[1,i] = OBJ_NEW('IDLgrPolygon',data,color =[0,0,0],style =1,$
thick =2 )
;水平方向,10个颜色,10个多边形,9个刻度
ENDIF ELSE BEGIN
tmpx = startLoc[0,0]+eachDims[0]*i
yLen = eachDims[1]/2
tmpy = startLoc[1,0]+yLen
;;最后的[1,2]表示可用X、Y,则颜色棒大小仅为X,Y/2,剩下为文字
IF i EQ 0 THEN BEGIN
data = [[tmpx,tmpy+yLen/2.],[tmpx+eachDims[0],tmpy],[tmpx+eachDims[0],tmpy+yLen]]
ENDIF ELSE IF i EQ self.SCALENUM-1 THEN BEGIN
data = [[tmpx,tmpy],[tmpx+eachDims[0],tmpy+yLen/2],[tmpx,tmpy+yLen]]
;绘制刻度
curValue = self.MINVALUE+eachValue*i
oTexts[i-1] = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$
location = [tmpx,0]-[0.4,0]*yLen, $
CHAR_DIMENSIONS =[0.5,0.75]*yLen, $
font = self.OFONT)
self->ADD,oTexts[i-1]
ENDIF ELSE BEGIN
;绘制刻度
curValue = self.MINVALUE+eachValue*i
oTexts[i-1] = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$
location = [tmpx,0]-[0.4,0]*yLen, $
CHAR_DIMENSIONS =[0.5,0.75]*yLen, $
font = self.OFONT)
self->ADD,oTexts[i-1]
data = [[tmpx,tmpy],[tmpx+eachDims[0],tmpy],[tmpx+eachDims[0],tmpy+yLen],[tmpx,tmpy+yLen]]
ENDELSE
objPolys[0,i] = OBJ_NEW('IDLgrPolygon',data,color =colors[*,i])
objPolys[1,i] = OBJ_NEW('IDLgrPolygon',data,color =[0,0,0],style =1,$
thick =2 )
ENDELSE
self->ADD,[objPolys[0,i],objPolys[1,i]]
ENDFOR
ENDIF ELSE BEGIN
oTexts = OBJARR(self.SCALENUM+1)
;10个颜色,10个多边形,11个刻度
eachValue = (self.MAXVALUE - self.MINVALUE)/self.SCALENUM
;竖直的
IF self.DIRECTION EQ 1 THEN BEGIN
xLen = eachDims[0]/2
FOR i=0, self.SCALENUM-1 DO BEGIN
tmpx = startLoc[0,0]
tmpy = startLoc[1,0]+eachDims[1]*i
data = [[tmpx,tmpy],[tmpx+xLen,tmpy],[tmpx+xLen,tmpy+eachDims[1]],[tmpx,tmpy+eachDims[1]]]
objPolys[0,i] = OBJ_NEW('IDLgrPolygon',data,color =colors[*,i] )
objPolys[1,i] = OBJ_NEW('IDLgrPolygon',data,color =[0,0,0],style =1,$
thick =2 )
self->ADD,[objPolys[0,i],objPolys[1,i]]
;绘制刻度
curValue = self.MINVALUE+eachValue*i
oTexts[i] = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$
location = [tmpx,tmpY]-[-1.4,.4]*xLen, $
CHAR_DIMENSIONS =[0.5,0.75]*xLen, $
font = oFont)
self->ADD,oTexts[i]
IF i EQ self.SCALENUM-1 THEN BEGIN
i++
tmpy+=eachDims[1]
curValue = self.MINVALUE+eachValue*i
oTexts[i] = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$
location = [tmpx,tmpY]-[-1.4,.4]*xLen, $
CHAR_DIMENSIONS =[0.5,0.75]*xLen, $
font = oFont)
self->ADD,oTexts[i]
ENDIF
ENDFOR
ENDIF ELSE BEGIN
yLen = eachDims[1]/2
;水平的
FOR i=0, self.SCALENUM-1 DO BEGIN
tmpx = startLoc[0,0]+eachDims[0]*i
tmpy = startLoc[1,0]+yLen
data = [[tmpx,tmpy],[tmpx+eachDims[0],tmpy],[tmpx+eachDims[0],tmpy+yLen],[tmpx,tmpy+yLen]]
objPolys[0,i] = OBJ_NEW('IDLgrPolygon',data,color =colors[*,i] )
objPolys[1,i] = OBJ_NEW('IDLgrPolygon',data,color =[0,0,0],style =1,$
thick =2 )
self->ADD,[objPolys[0,i],objPolys[1,i]]
;绘制刻度
curValue = self.MINVALUE+eachValue*i
oTexts[i] = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$
location = [tmpx,0]-[0.2,0]*yLen, $
CHAR_DIMENSIONS =[0.5,0.75]*yLen, $
font = oFont)
self->ADD,oTexts[i]
IF i EQ self.SCALENUM-1 THEN BEGIN
i++
tmpx+=eachDims[0]
curValue = self.MINVALUE+eachValue*i
oTexts[i] = OBJ_NEW('IDLgrText',STRING(curValue,format=format),$
location = [tmpx,0]-[0.2,0]*yLen, $
CHAR_DIMENSIONS =[0.5,0.75]*yLen, $
font = oFont)
self->ADD,oTexts[i]
ENDIF
ENDFOR
ENDELSE
ENDELSE
END
;
;颜色棒类初始化函数
FUNCTION COLORBAR::INIT,$
maxValue = maxValue, $ ;刻度最大值
minValue = minValue, $ ;刻度最小值
floatLen = floatLen, $ ;浮点数小数长度
direction = direction, $ ;方向,默认为水平,1为竖直
scaleNum = scaleNum, $ ;刻度个数,默认是10
stepColor = stepColor, $ ;刻度颜色,为[3,num]数组
Dimension = dimension, $ ;颜色表尺度,默认为
location = location , $ ;颜色表位置,左下角起点坐标
axisstyle = axisstyle , $ ;style=0默认普通,style=1带尖的颜色表
extra = extra
IF (self->IDLGRMODEL::INIT(_Extra=extra) NE 1) THEN RETURN, 0
;如不设置则调用默认参数
IF N_ELEMENTS(maxValue) GT 0 THEN self.MAXVALUE = maxValue ELSE self.MAXVALUE =1
IF N_ELEMENTS(minValue) GT 0 THEN self.MINVALUE = minValue ELSE self.MINVALUE =0
IF N_ELEMENTS(floatLen) GT 0 THEN self.FLOATLEN = floatLen ELSE self.FLOATLEN =2
IF N_ELEMENTS(scaleNum) GT 0 THEN self.SCALENUM = scaleNum ELSE self.SCALENUM = 10
IF N_ELEMENTS(axisstyle) GT 0 THEN self.AXISSTYLE = axisstyle
IF N_ELEMENTS(direction) GT 0 THEN self.DIRECTION = direction
IF N_ELEMENTS(Dimension) GT 0 THEN self.DIMENSION = Dimension ELSE BEGIN
IF self.DIRECTION THEN self.DIMENSION = [60,800] ELSE self.DIMENSION = [800,60]
ENDELSE
IF N_ELEMENTS(location) GT 0 THEN self.LOCATION = location
;默认颜色表
IF N_ELEMENTS(stepColor) GT 0 THEN self.STEPCOLOR = PTR_NEW(stepColor,/No_Copy) ELSE BEGIN
LOADCT,3
TVLCT,r,g,b,/get
stepColor = BYTARR(3,self.SCALENUM)
eachStep = FIX(256/self.SCALENUM)
FOR i=0,self.SCALENUM-1 DO BEGIN
stepColor[*,i] = [r[255-i*eachStep],g[255-i*eachStep],b[255-i*eachStep]]
ENDFOR
self.STEPCOLOR =PTR_NEW(stepColor,/No_Copy)
ENDELSE
;创建
self->CREATECOLORBAR
;直接返回1了,不太严谨。
RETURN,1
END
;类初始化函数
PRO COLORBAR__DEFINE
;结构体
void = {colorBar, $
INHERITS IDLgrModel, $
polygon : PTR_NEW(), $
oFont : OBJ_NEW(), $
oModel: OBJ_NEW(), $
direction:0, $
maxValue:1., $
minValue:0., $
floatLen:2, $
scaleNum:10, $
axisstyle : 0b, $
location:[0,0],$
dimension:[0,0],$
stepcolor:PTR_NEW() }
END
;+++
;Write_By DYQ
;http://hi.baidu.com/dyqwrp
;http://blog.sciencenet.cn/?344887
;QQ: /ty笑因快乐
;调用示例程序,继承IDLgrModel,可以在程序中Add到oModel中或oView中。
;
PRO COLORBAR_EXAMPLE
;通常的颜色棒
XOBJVIEW, OBJ_NEW('colorBar')
;带尖的颜色棒
XOBJVIEW, OBJ_NEW('colorBar',/axisstyle)
;创建竖直带尖头的颜色棒
XOBJVIEW,OBJ_NEW('colorBar',axisstyle=1,/direction)
;给定最值的颜色棒,floatlen为浮点位数,0为整数显示
XOBJVIEW,OBJ_NEW('colorBar',axisstyle=1,/direction,maxValue= 10,minValue=0,floatLen=0)
;给定最值的颜色棒,floatlen为浮点位数
XOBJVIEW,OBJ_NEW('colorBar',axisstyle=0,/direction,maxValue= 10,minValue=0,floatLen=2)
;指定显示色段和颜色
XOBJVIEW,OBJ_NEW('colorBar',axisstyle=1,maxValue= 10,minValue=0,floatLen=2,$
scaleNum=3, $;三个颜色段
stepcolor = [[0,0,0],[1,0,0],[0,1,0]]*255,$;三个颜色的RGB
dimension = [200,50]);颜色棒大小
END

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)