Sie sind hier: Startseite / Services / Data Analysis and Visualization / Visualization / Software / NCL / examples / source_code / NCL/ImageMagick example to tilt 3 contour plots into one new image
Info
Alle Inhalte des Nutzerportal sind nur auf Englisch verfügbar.

NCL/ImageMagick example to tilt 3 contour plots into one new image

This example shows how to create 3 contour plots, one seperated title plot and another seperated labelbar plot with an NCL script. With ImageMagicks 'convert' we'll tilt the 3 contour plots and compose them with the title and labelbar plots into one new image. This all will be done with one KSH script.

Run the follwing KSH script:

ksh Tilting_3_Plots.ksh

Example KSH script  Tilting_3_Plots.ksh:

#!/bin/ksh
#-----------------------------------------------------------------------------------
#  DKRZ NCL example:     Tilting_3_Plots.ksh
#
#  Description:        KSH-script to create 3 contour, 1 title and 1 labelbar plot
#                      generated by an NCL script, tilt the contour plots, and  
#                      compose all with ImageMagick's 'convert' to one in portrait
#                      format.
#             
#  Graphic Software:   NCL 6.3.0
#  Image manipulation: ImageMagick 6.9.1-7
#
#  22.07.16  meier-fleischer(at)dkrz.de
#-----------------------------------------------------------------------------------
  RUN_NCL=1                             #-- run/skip NCL (1: do it;  0: skip)
  RUN_COMPOSE=1                         #-- run/skip ImageMagick distort/composite (1: do it;  0: skip)

  NCL_SCRIPT="contour_plot.ncl"         #-- name of the NCL script to be created (see below)

  IFILE="rectilinear_grid_3D.nc"   #-- data input file

#*********************************************************************************************
#-------------------------------
#-- write NCL script
#-------------------------------
  cat << EOF > ${NCL_SCRIPT}
;---------------------------------------------------------------
; DKRZ NCL example: ${NCL_SCRIPT}
;
; Description:      Create a contour plot in one frame,
;                   title and labelbar in another frame each.
;
;                    This script is part of the Pseudo_3D_plots
;                    examples to generate 3D looking images.
;
; NCL Version:        6.3.0
;
; 22.07.16  meier-fleischer(at)dkrz.de
;---------------------------------------------------------------
begin

  title = "NCL contour plots tilted and composed by ImageMagick"
 
  f   = addfile("${IFILE}","r")                             ;-- open input file
  var = f->t                                                ;-- read variable

;--  lev = 100000, 92500, 85000, 77500, 70000, 60000, 50000, 40000, 30000, 25000,
;--         20000, 15000, 10000,  7000,  5000,  3000,  1000 ;

  slev = (/0,2,8/)                                          ;-- choose levels for data to be plotted
 
;-- contour plot workstation
  wks_type          = "png"
  wks_type@wkWidth  =  2500
  wks_type@wkHeight =  2500
  wks_type@wkForegroundColor    = "black"
  wks_type@wkBackgroundOpacityF = 0.0
  wks = gsn_open_wks(wks_type, "plot_contour")

;-- title plot workstation
  wkst_type          = "png"
  wkst_type@wkWidth  =  2500
  wkst_type@wkHeight =  2500
  wkst = gsn_open_wks(wkst_type, "plot_title")
 
;-- labelbar plot workstation
  wksl_type          = "png"
  wksl_type@wkWidth  =  2500
  wksl_type@wkHeight =  2500
  wksl = gsn_open_wks(wksl_type, "plot_labelbar")
 
;-- read color map and make the colors slightly transparent
  cmap      =  read_colormap_file("BlueYellowRed")          ;-- read RGBA colormap
  cmap(:,3) =  0.8                                          ;-- 0: full transparent, 1: full opaque

;-------------------------------
;-- Contour plot:
;-------------------------------
  res                           =  True
  res@gsnLeftString             = ""                        ;-- no left string
  res@gsnRightString            = ""                        ;-- no right string
 
  res@cnFillOn                  =  True
  res@cnFillPalette             =  cmap                     ;-- set color map
  res@cnLinesOn                 =  False                    ;-- turn off contour lines
  res@cnLineLabelsOn            =  False                    ;-- turns off contour line labels
  res@cnInfoLabelOn             =  False                    ;-- turns off contour info label
  res@cnMissingValFillColor     = "wheat4"                  ;-- missing value color
  res@cnMissingValFillPattern   =  0                        ;-- 0: solid fill
  res@cnLevelSelectionMode      = "ManualLevels"            ;-- use manual contour line levels
  res@cnMinLevelValF            =  230.0                    ;-- contour min. value
  res@cnMaxLevelValF            =  320.0                    ;-- contour max. value
  res@cnLevelSpacingF           =    5.0                    ;-- contour interval

  res@tmXTOn                    =  True                     ;-- turn on tickmarks at top axis
  res@tmXTLabelsOn              =  True                     ;-- draw tickmark labels
  res@tmXTMajorLineColor        = "black"                   ;-- choose top x-axis color
  res@tmXTLabelFontColor        = "black"                   ;-- choose top x-axis label color
  res@tmXUseBottom              =  False                    ;-- do not use bottom x-axis
 
  res@tmXBOn                    =  False                    ;-- turn off tickmarks at bottom axis

  res@tmYLOn                    =  True                     ;-- turn on tickmarks at left axis
  res@tmYLLabelsOn              =  True                     ;-- draw tickmark labels
  res@tmYLMajorLineColor        = "black"                   ;-- choose left y-axis color
  res@tmYLLabelFontColor        = "black"                   ;-- choose left y-axis label color
  res@tmYUseLeft                =  True                     ;-- use left y-axis

  res@mpGeophysicalLineThicknessF  = 4.0                    ;-- increase coastal outlines thicker
  res@mpFillOn                  =  False                    ;-- do not fill land areas
 
  res@lbLabelBarOn              =  False                    ;-- don't draw labelbar

  contour = gsn_csm_contour_map(wks,var(0,slev(2),:,:),res) ;-- create plot; advance contour frame
  print("       - contour plot done:  level = "+sprinti("%4i",toint(f->lev(slev(2))/100))+" hPa")
 
  res@tmXTOn                    =  False                    ;-- turn on tickmarks at top axis
  res@tmYLOn                    =  False                    ;-- turn on tickmarks at top axis

  contour = gsn_csm_contour_map(wks,var(0,slev(1),:,:),res) ;-- create plot; advance contour frame
  print("       - contour plot done:  level = "+sprinti("%4i",toint(f->lev(slev(1))/100))+" hPa")
  contour = gsn_csm_contour_map(wks,var(0,slev(0),:,:),res) ;-- create plot; advance contour frame
  print("       - contour plot done:  level = "+sprinti("%4i",toint(f->lev(slev(0))/100))+" hPa")
 
;-------------------------------
;-- Title plot:
;-------------------------------
  tires                         =  True
  tires@txJust                  = "CenterCenter"            ;-- text justification
  tires@txFontHeightF           =  0.017                    ;-- text font size

  tix = 0.5
  tiy = 0.8
 
  gsn_text_ndc(wkst,title,tix,tiy,tires)                    ;-- draw title
  print("       - title plot done")

  frame(wkst)                                               ;-- advance title frame
 
;-------------------------------
;-- Labelbar plot:
;-------------------------------
;-- retrieve the contour resources for the labelbar
  getvalues contour@contour
     "cnLevels"             :   cnlevs                      ;-- contour levels
     "cnFillColors"         :   cncols                      ;-- contour colors
     "cnMonoFillPattern"    :   mpattern                    ;-- contour fill pattern
  end getvalues

  labels = ""+cnlevs                                        ;-- labelbar labels
  nboxes =  dimsizes(cnlevs)+1                              ;-- number of color boxes
 
  lbx = 0.1                                                 ;-- labelbar x-position
  lby = 0.9                                                 ;-- labelbar y-position
  lbw = 0.8                                                 ;-- labelbar width
  lbh = 0.25                                                ;-- labelbar height

;-- labelbar resources
  lbres                         =  True
  lbres@lbAutoManage            =  False                    ;-- we want to control the labelbar
  lbres@lbOrientation           = "horizontal"              ;-- labelbar orientation
  lbres@lbLabelFontHeightF      =  0.024                    ;-- increase label font size
  lbres@lbLabelFontThicknessF   =  4.                       ;-- increase label font thickness
  lbres@lbLabelStride           =  2                        ;-- label every value
  lbres@lbPerimOn               =  False                    ;-- no box around labelbar
  lbres@lbLabelFontColor        = "black"                   ;-- labe font color
  lbres@lbLabelAlignment        = "InteriorEdges"           ;-- where to draw the labels
  lbres@lbMonoFillPattern       =  mpattern                 ;-- use same fill pattern as contour plot
  lbres@lbMonoFillColor         =  False                    ;-- use multiple colors
  lbres@lbFillColors            =  cncols                   ;-- contour colors
  lbres@lbLabelStrings          =  labels                   ;-- contour labels
  lbres@lbBoxMinorExtentF       =  0.15                     ;-- change height of labelbar boxes

  lbres@vpWidthF                =  lbw                      ;-- labelbar viewport width
  lbres@vpHeightF               =  lbh                      ;-- labelbar viewport height
   
  gsn_labelbar_ndc(wksl,nboxes,labels,lbx,lby,lbres)        ;-- draw labelbar

;-- text resources labelbar annotations
  txres = True
  txres@txFontHeightF          = 0.018                      ;-- units text font size
 
  gsn_text_ndc(wksl, "[C~S~o~N~]", 0.91, 0.75, txres)       ;-- add units to labelbar
  print("       - labelbar plot done")

  frame(wksl)                                               ;-- advance labelbar frame

  print("")
 
end
EOF

#*********************************************************************************************
#-------------------------------------------------------------------
#-- run NCL scripts to generate the input images
#-------------------------------------------------------------------
  if [[ $RUN_NCL == 1 ]] ; then
     rm -rf plot_*.png                                      #-- delete all old plots
     
     echo "--------------------------------------------"
     echo "**** run NCL"
     ncl -Q -n ${NCL_SCRIPT}                                #-- run NCL without standard output
  fi

#-------------------------------------------------------------------
#-- do the tilting of the plot and create the composed plot
#-------------------------------------------------------------------
  if [[ $RUN_COMPOSE == 1 ]] ; then
     echo "--------------------------------------------"
     echo "**** run ImageMagick"
       
     rm -rf compose.png                                     #-- delete old composed file
     
   #-- new width and height of sheared images 1685x2383
     co1="plot_contour.000001.png"
     co2="plot_contour.000002.png"
     co3="plot_contour.000003.png"
     co_width=2000  ;   co_height=600
     dxco1=25       ;   dxco2=25    ;   dxco3=1
     dyco1=1370     ;   dyco2=890   ;   dyco3=400
     angle=-40

   #-- labelbar horizontal
     lb="plot_labelbar.png"
     lb_width=1335   ;   lb_height=80
     dxlb=225        ;   dylb=2050
    
   #-- title string
     ti="plot_title.png"
     ti_width=1500  ;   ti_height=60
     dxti=90        ;   dyti=180

   #-- cut off white space around te plot
     alpha=on
     bgc=white
     
     convert -alpha $alpha -background $bgc -density 300 -trim $co1 tmp_c1.png
     convert -alpha $alpha -background $bgc -density 300 -trim $co2 tmp_c2.png
     convert -alpha $alpha -background $bgc -density 300 -trim $co3 tmp_c3.png
     convert -alpha $alpha -background $bgc -density 300 -trim $ti tmp_t.png
     convert -alpha $alpha -background $bgc -density 300 -trim $lb tmp_l.png

     echo "       - crop white space done"

   #-- original and new coordinate positions of the edges for distortion
     xul=0      ;   dxul=400
     yul=0      ;   dyul=50
 
     xur=2200   ;   dxur=1500
     yur=0      ;   dyur=50
 
     xlr=2200   ;   dxlr=1900
     ylr=1200   ;   dylr=1200
 
     xll=0      ;   dxll=0
     yll=1200   ;   dyll=1200
        
   #-- do the distortion and write the result to a temporary file
     convert tmp_c1.png -alpha $alpha -virtual-pixel transparent   \
             -distort Perspective "$xul,$yul $dxul,$dyul   \
                                   $xur,$yur $dxur,$dyur   \
                                   $xlr,$ylr $dxlr,$dylr   \
                                   $xll,$yll $dxll,$dyll"  tmp_contour_1.png

   #-- do the distortion and write the result to a temporary file
     convert tmp_c2.png -alpha $alpha -virtual-pixel transparent   \
             -distort Perspective "$xul,$yul $dxul,$dyul   \
                                   $xur,$yur $dxur,$dyur   \
                                   $xlr,$ylr $dxlr,$dylr   \
                                   $xll,$yll $dxll,$dyll"  tmp_contour_2.png

   #-- do the distortion and write the result to a temporary file
     convert tmp_c3.png -alpha $alpha -virtual-pixel transparent   \
             -distort Perspective "$xul,$yul $dxul,$dyul   \
                                   $xur,$yur $dxur,$dyur   \
                                   $xlr,$ylr $dxlr,$dylr   \
                                   $xll,$yll $dxll,$dyll"  tmp_contour_3.png

     echo "       - distortion done"

   #-- compose all images a one new image of size (16:9 1688x3000)
   font=Courier-Bold
   
     convert -size 1685x2383 xc: \
      \( tmp_contour_3.png -font $font -pointsize 42 -draw "text 10,500 '1000hPa'" -resize ${co_width}x${co_height}! \) \
                           -geometry +${dxco1}+${dyco1} -composite \
      \( tmp_contour_2.png -font $font -pointsize 42 -draw "text 10,500 '850hPa'"  -resize ${co_width}x${co_height}! \) \
                           -geometry +${dxco2}+${dyco2} -composite \
      \( tmp_contour_1.png -font $font -pointsize 42 -draw "text 35,500 '300hPa'"  -resize ${co_width}x${co_height}! \) \
                           -geometry +${dxco3}+${dyco3} -composite \
      \( tmp_l.png         -resize ${lb_width}x${lb_height}! \)   -geometry +${dxlb}+${dylb}  -composite \
      \( tmp_t.png         -resize ${ti_width}x${ti_height}! \)   -geometry +${dxti}+${dyti}  -composite \
         tmp_compose.jpg

     echo "       - composition done"

   #-- resize image to standard A3 842x1188(1920x1080) pixel size
     convert -resize 842x1188 tmp_compose.jpg compose_3_tilted_plots.jpg
       
   #-- clean up
     rm -rf tmp_*.png tmp_*.jpg
  fi

  echo "--------------------------------------------"
#-------------------------------------------------------------------
  exit

Artikelaktionen