爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5742|回复: 6

[混合编程] IDL编程学习之色条拆解-即颜色与数值对应函数研究

[复制链接]

新浪微博达人勋

发表于 2017-12-31 17:05:33 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
在工作中,经常需要用颜色表示数值,即使用色条。
但是,使用中经常发现,函数默认的数值-颜色对应方式与我需要的不一样,我想,如果我知道色条的数值颜色对应公式就好了,这个帖子就是为了研究这个对应关系的。
因为rgb_table=33的33号色条经常用,所以用IDL生成这个色条,为了方便后面读取图片,于是把色条拉宽:fig=plot(findgen(200),rgb_table=33)
colorbar.jpg read_jpeg,'C:\Users\YGDY\Desktop\colorbar.jpg',image
help,image
fig=plot(image[0,*,1800],color='r',linestyle=6,sym=24)
fig=plot(image[1,*,1800],color='g',/overplot,linestyle=6,sym=24)
fig=plot(image[2,*,1800],color='b',/overplot,linestyle=6,sym=24)
QQ截图20171231161453.jpg
下面,写出对应的函数:




密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-1-2 09:36:58 | 显示全部楼层
写出函数rgb_table_33(x,minv,maxv),其中x是需要与颜色对应的值,minv是最小值,maxv是最大值,这样,x对应颜色的[r,g,b]作为返回值。
function rgb_table_33,x,minV,maxV
MINV=MINV+0.0
MAXV=MAXV+0.0
L=(MAXV-MINV)/8.0
PRINT,MINV,MAXV,L
IF(X GE MINV AND X LT MINV+L)THEN BEGIN
  R=0.0
  G=0.0
  B=127.5/L*X+127.5
    PRINT,[1,X,R,G,B]
  ENDIF
  IF(X GE MINV+L AND X LT MINV+3*L)THEN BEGIN
    R=0.0
    G=127.5/L*(X-L)
    B=255.0
      PRINT,[2,X,R,G,B]
  ENDIF
  IF(X GE MINV+3*L AND X LT MINV+5*L)THEN BEGIN
    R=127.5/L*(X-3*L)
    G=255.0
    B=-127.5/L*(X-5*L)
      PRINT,[3,X,R,G,B]
  ENDIF
  IF(X GE MINV+5*L AND X LT MINV+7*L)THEN BEGIN
    R=255.0
    G=-127.5/L*(X-7*L)
    B=0.0
      PRINT,[4,X,R,G,B]
  ENDIF
  IF(X GE MINV+7*L AND X LE MAXV)THEN BEGIN
    R=-127.5/L*(X-9*L)
    G=0.0
    B=0.0
          PRINT,[5,X,R,G,B]
  ENDIF
RETURN,[R,G,B]
end

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-1-2 09:37:45 | 显示全部楼层
使用案例:
FOR I=0,300 DO BEGIN
  FIG=PLOT([I],[I],COLOR=RGB_TABLE_33(I,0,300),SYM=24,SYM_FILLED=1,/OVERPLOT)
ENDFOR
QQ截图20180102093632.jpg

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-2 09:46:54 | 显示全部楼层
赞,支持原创!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-2 09:47:06 | 显示全部楼层
{:5_213:}谢谢楼主分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-7-3 17:17:52 | 显示全部楼层

经典版本公开


今天是2020年7月3日,距离一楼已经2年半了,以下是本人长期的版本,特此分享:



;arr是个一维向量,返回值是[R,G,B]三列的数组
;minv是配色下限,maxv是上限
;超过maxv的x值全配以纯红色,低于minv的值全配以纯蓝色
function rb_cbar,ARR,minV,maxV
  MINV=MINV+0.0
  MAXV=MAXV+0.0
  L=(MAXV-MINV)/3.0
  N=N_ELEMENTS(arr)
  COLORS=[-99,-99,-99]
  FOR I=0,N-1 DO BEGIN
    X=ARR[I]
    if(x lt minv)then begin
      R=0
      G=0
      B=255
    endif
    if(x gt maxv)then begin
      R=255
      G=0
      B=0
    endif
    if(x gE MINV and x lt MINV+L)then begin
      R=0.0
      G=255.0/L*(X-MINV)
      B=255.0
    endIF
    if(x GE MINV+L and x LT MINV+L*2)then begin
      R=255.0/L*(X-MINV-L)
      G=255.0
      B=-255.0/L*(X-MINV-L*2)
    endIF
    if(x GE MINV+L*2 and x LE MAXV)then begin
      R=255.0
      G=-255.0/L*(X-MAXV)
      B=0.0
    endIF
    COLORS=[[COLORS],[R,G,B]]
  ENDFOR
  RETURN,COLORS[*,1:-1]
end


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-7-3 17:21:36 | 显示全部楼层
python的色条颜色提取
Figure_1.png


python有从色条提取颜色的方法,
由于我一直使用自己DIY的rb_cbar()函数,所以一直不知道IDL有没有这种提取方法。
以下是python提取色条颜色的方法:


import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#字体设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['font.size'] = 12

x=np.arange(0,255,1)
y=np.log(x+1)
colors=mpl.cm.rainbow(x)#从rainbow色条抽取颜色序列
plt.bar(x,y,color=colors)
plt.show()


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表